teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2021/02/24 14:02

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -116,53 +116,4 @@
116
116
  ```
117
117
 
118
118
  ここから先、キー操作・マウスホィール対応や他のスクロールイベントは
119
- コメントに書いた URL のコードを参考にして下さい。
119
+ コメントに書いた URL のコードを参考にして下さい。
120
-
121
- ----
122
- ## ツリービューの要素を固定する
123
-
124
- insert したアイテムは固定して、内容 values のみを変更。
125
- ※ 但し、選択中の要素を保持してる場合、参照内容が変わってしまうことには注意。
126
-
127
- ```python
128
- #!/usr/bin/env python3.9
129
-
130
- import tkinter as tk
131
- from tkinter import ttk
132
-
133
- N = 1000 # データの件数
134
- PAGE_SIZE = 10 # 一度に表示する件数
135
-
136
- root = tk.Tk()
137
- tree = ttk.Treeview(root, height=PAGE_SIZE, show="headings", columns=[1])
138
- tree.pack(fill=tk.BOTH, side=tk.LEFT, expand=tk.YES)
139
-
140
-
141
- def update_tree_items(offset=0, size=PAGE_SIZE):
142
- # 表示中の要素の内容を更新
143
- for idx, child in enumerate(tree.get_children()):
144
- tree.item(child, values=(offset+idx,))
145
-
146
-
147
- def yview(command, amount, unit=None):
148
- if command == "moveto":
149
- offset = max(0, min(N-PAGE_SIZE, int(float(amount) * N)))
150
-
151
- # 表示するアイテムを更新
152
- update_tree_items(offset, PAGE_SIZE)
153
-
154
- first = offset / N
155
- last = (offset + PAGE_SIZE) / N
156
- vbar.set(first, last)
157
-
158
-
159
- vbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=yview)
160
- vbar.pack(side=tk.RIGHT, fill=tk.Y)
161
-
162
- # 予め固定数の要素を準備しておく
163
- for _ in range(PAGE_SIZE):
164
- tree.insert("", tk.END, values=())
165
-
166
- root.after_idle(yview, "moveto", 0.0)
167
- root.mainloop()
168
- ```

2

追加: 毎回削除しているのを、更新のみに変更

2021/02/24 14:01

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -116,4 +116,53 @@
116
116
  ```
117
117
 
118
118
  ここから先、キー操作・マウスホィール対応や他のスクロールイベントは
119
- コメントに書いた URL のコードを参考にして下さい。
119
+ コメントに書いた URL のコードを参考にして下さい。
120
+
121
+ ----
122
+ ## ツリービューの要素を固定する
123
+
124
+ insert したアイテムは固定して、内容 values のみを変更。
125
+ ※ 但し、選択中の要素を保持してる場合、参照内容が変わってしまうことには注意。
126
+
127
+ ```python
128
+ #!/usr/bin/env python3.9
129
+
130
+ import tkinter as tk
131
+ from tkinter import ttk
132
+
133
+ N = 1000 # データの件数
134
+ PAGE_SIZE = 10 # 一度に表示する件数
135
+
136
+ root = tk.Tk()
137
+ tree = ttk.Treeview(root, height=PAGE_SIZE, show="headings", columns=[1])
138
+ tree.pack(fill=tk.BOTH, side=tk.LEFT, expand=tk.YES)
139
+
140
+
141
+ def update_tree_items(offset=0, size=PAGE_SIZE):
142
+ # 表示中の要素の内容を更新
143
+ for idx, child in enumerate(tree.get_children()):
144
+ tree.item(child, values=(offset+idx,))
145
+
146
+
147
+ def yview(command, amount, unit=None):
148
+ if command == "moveto":
149
+ offset = max(0, min(N-PAGE_SIZE, int(float(amount) * N)))
150
+
151
+ # 表示するアイテムを更新
152
+ update_tree_items(offset, PAGE_SIZE)
153
+
154
+ first = offset / N
155
+ last = (offset + PAGE_SIZE) / N
156
+ vbar.set(first, last)
157
+
158
+
159
+ vbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=yview)
160
+ vbar.pack(side=tk.RIGHT, fill=tk.Y)
161
+
162
+ # 予め固定数の要素を準備しておく
163
+ for _ in range(PAGE_SIZE):
164
+ tree.insert("", tk.END, values=())
165
+
166
+ root.after_idle(yview, "moveto", 0.0)
167
+ root.mainloop()
168
+ ```

1

コード修正

2021/02/24 13:46

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -38,7 +38,7 @@
38
38
  tree = ttk.Treeview(root, height=PAGE_SIZE, show="headings", columns=[1])
39
39
  tree.pack()
40
40
 
41
- def update_tree_items(offset=0, size):
41
+ def update_tree_items(offset=0, size=PAGE_SIZE):
42
42
  tree.delete(*tree.get_children())
43
43
 
44
44
  # 改善点: データの数 N の値に関わらず、一定件数 (PAGE_SIZE) しか insert しない。