質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

196閲覧

TkinterのスクロールバーでWidgetの表示文字を変えたい

shinobuKouno

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2023/05/23 05:29

編集2023/05/24 09:15

実現したいこと

Tkinterのスクロールバーを使い、スクロールの際にWidgetを動かすのではなく、
widgetの文字を変えたい

予め1100日分の予定をlist(test_list)に入れておき、Widget数は1画面分だけ作り、Widgetの表示文字をスクロールバーに連動して
表示する文字をtest_listのインデックス(行)をズラしていく方法を教えてください。

前提

予定表のような物を作ろうと思いますが、人数を増やし、行数が365日位になってくると動作が重い為。

ここに質問の内容を詳しく書いてください。
現状のコードですと、def on_scroll(*args)のscroll_posは0しか出しません。
また、次のコードではスクロールは動くものの、時々動かした後に最初の位置に戻ってしまいます。

該当のソースコード

Python

1import tkinter as tk 2import datetime 3 4 5def create_table(): 6 object_list = [] 7 day_dic = {} 8 scroll_pos = 0 9 list_index = 0 10 # 今日の日付を取得 11 dt = datetime.datetime.today() 12 13 # 翌日 14 next_day = dt + datetime.timedelta(days=1) 15 16 yy = dt.year 17 mm = dt.month 18 dd = dt.day 19 week_a = dt.weekday() 20 week_dic = {0: '(月)', 1: '(火)', 2: '(水)', 3: '(木)', 4: '(金)', 5: '(土)', 6: '(日)'} 21 22 week_b = week_dic[week_a] 23 24 test_list = [] 25 for i in range(1, 1200): 26 mm = dt.month 27 dd = dt.day 28 week_a = dt.weekday() 29 week_b = week_dic[week_a] 30 31 str_a = str(mm) + '月' + str(dd) + '日\n' + week_b 32 test_list.append([str_a, 'test' + str(i), 'test' + str(i), 33 'test' + str(i), 'test' + str(i), 'test' + str(i), 'test' + str(i)]) 34 35 dt = dt + datetime.timedelta(days=1) 36 37 def on_scroll(*args): 38 39 # スクロールのポジションを整数化 40 sc_pos = int(ybar.get()[0] * len(test_list)) 41 42 dif = ybar.get()[1] - ybar.get()[0] 43 44 print(sc_pos) # ←スライドしても0しか表示されない 45 46 47 # 書き変え 48 # ウィジェットを書き換えるtest_listの最初のインデックス 49 nonlocal scroll_pos 50 nonlocal list_index 51 52 # 上に移動したのか下に移動したのか 53 # スクロールバーが下に移動していれば 54 if sc_pos > scroll_pos: 55 list_index += sc_pos 56 scroll_pos = sc_pos / len(test_list) 57 58 # スクロールバーが上に移動していれば 59 elif sc_pos < scroll_pos: 60 list_index -= sc_pos 61 scroll_pos = sc_pos / len(test_list) 62 63 # マウスボタンを離すと元に戻るため、スクロールバーを移動した所でとどめておく。 64 ybar.set(scroll_pos, scroll_pos + dif) 65 66 i = list_index 67 68 for v in object_list: 69 # 日付ラベルの色 70 back_color = 'green' 71 v[0].config(text=test_list[i][0]) 72 v[0].config(bg=back_color) 73 74 for r in range(1,len(v)): 75 v[r].delete('1.0', 'end') 76 v[r].insert('1.0',test_list[i][r]) 77 v[r].config(bg=back_color) 78 i+=1 79 80 root = tk.Tk() 81 root.title("Table") 82 root.geometry("1600x1200") 83 84 frm_a = tk.Frame(root) 85 frm_a.grid(row=0, column=0) 86 87 frm_b = tk.Frame(root) 88 frm_b.grid(row=1, column=0) 89 90 cnv = tk.Canvas(frm_b) 91 cnv.grid(row=0,column=0) 92 93 ybar = tk.Scrollbar(frm_b, orient=tk.VERTICAL) 94 ybar.grid(row=0, column=2, rowspan=1, sticky='ns') 95 ybar.config(command=on_scroll) 96 97 cnv.configure(yscrollcommand=ybar.set) 98 99 lbl = tk.Label(cnv, text='2023年', font=('BIZ UDGothic', 12)) 100 lbl.grid(row=1, column=0) 101 102 for i in range(6): 103 lbl = tk.Label(cnv, width=30, text='氏名' + str(i + 1), font=('BIZ UDGothic', 12)) 104 lbl.grid(row=0, column=i + 1) 105 106 for i in range(22): 107 lbl = tk.Label(cnv, text=test_list[i][0], font=('BIZ UDGothic', 12)) 108 lbl.grid(row=i + 1, column=0) 109 tmp_list = [lbl] 110 for r in range(1, 7): 111 txt = tk.Text(cnv, height=3, width=30, font=('BIZ UDGothic', 12)) 112 txt.grid(row=i + 1, column=r) 113 txt.insert(tk.END, test_list[i][r]) 114 tmp_list.append(txt) 115 116 object_list.append(tmp_list) 117 118 119 ybar = tk.Scrollbar(cnv, orient=tk.VERTICAL) 120 ybar.grid(row=1, column=8, rowspan=22, sticky='ns') 121 ybar.config(command=on_scroll) 122 123 root.mainloop() 124 125create_table()

補足情報(FW/ツールのバージョンなど)

Python 3.10
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/05/23 05:49

初心者がAIに頼ってたらいつまで経っても成長しないよ。
shinobuKouno

2023/05/24 05:20

検索をしても解決の糸口が見つからなかったため、chatgptで調べて見ました。 このような場合どのようにして調べたらよかったでしょうか?
guest

回答1

0

自己解決

次のコードで解決しました

スクロールのポジションを整数化

sc_pos = int(float(args[1]) * len(test_list)) print(sc_pos) if sc_pos > len(test_list)- 20: sc_pos = len(test_list) -20 # 幅 dif = 0.018 # 書き変え # ウィジェットを書き換えるtest_listの最初のインデックス nonlocal scroll_pos scroll_pos = sc_pos / len(test_list) # マウスボタンを離すと元に戻るため、スクロールバーを移動した所でとどめておく。 ybar.set(scroll_pos, scroll_pos + dif) i = sc_pos for v in object_list: # 日付ラベルの色 back_color = 'green' v[0].config(text=test_list[i][0]) v[0].config(bg=back_color) for r in range(1,len(v)): v[r].delete('1.0', 'end') v[r].insert('1.0',test_list[i][r]) v[r].config(bg=back_color) i+=1

投稿2023/05/24 11:01

shinobuKouno

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問