回答編集履歴

3

修正

2021/02/24 14:02

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -235,101 +235,3 @@
235
235
  ここから先、キー操作・マウスホィール対応や他のスクロールイベントは
236
236
 
237
237
  コメントに書いた URL のコードを参考にして下さい。
238
-
239
-
240
-
241
- ----
242
-
243
- ## ツリービューの要素を固定する
244
-
245
-
246
-
247
- insert したアイテムは固定して、内容 values のみを変更。
248
-
249
- ※ 但し、選択中の要素を保持してる場合、参照内容が変わってしまうことには注意。
250
-
251
-
252
-
253
- ```python
254
-
255
- #!/usr/bin/env python3.9
256
-
257
-
258
-
259
- import tkinter as tk
260
-
261
- from tkinter import ttk
262
-
263
-
264
-
265
- N = 1000 # データの件数
266
-
267
- PAGE_SIZE = 10 # 一度に表示する件数
268
-
269
-
270
-
271
- root = tk.Tk()
272
-
273
- tree = ttk.Treeview(root, height=PAGE_SIZE, show="headings", columns=[1])
274
-
275
- tree.pack(fill=tk.BOTH, side=tk.LEFT, expand=tk.YES)
276
-
277
-
278
-
279
-
280
-
281
- def update_tree_items(offset=0, size=PAGE_SIZE):
282
-
283
- # 表示中の要素の内容を更新
284
-
285
- for idx, child in enumerate(tree.get_children()):
286
-
287
- tree.item(child, values=(offset+idx,))
288
-
289
-
290
-
291
-
292
-
293
- def yview(command, amount, unit=None):
294
-
295
- if command == "moveto":
296
-
297
- offset = max(0, min(N-PAGE_SIZE, int(float(amount) * N)))
298
-
299
-
300
-
301
- # 表示するアイテムを更新
302
-
303
- update_tree_items(offset, PAGE_SIZE)
304
-
305
-
306
-
307
- first = offset / N
308
-
309
- last = (offset + PAGE_SIZE) / N
310
-
311
- vbar.set(first, last)
312
-
313
-
314
-
315
-
316
-
317
- vbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=yview)
318
-
319
- vbar.pack(side=tk.RIGHT, fill=tk.Y)
320
-
321
-
322
-
323
- # 予め固定数の要素を準備しておく
324
-
325
- for _ in range(PAGE_SIZE):
326
-
327
- tree.insert("", tk.END, values=())
328
-
329
-
330
-
331
- root.after_idle(yview, "moveto", 0.0)
332
-
333
- root.mainloop()
334
-
335
- ```

2

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

2021/02/24 14:01

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -235,3 +235,101 @@
235
235
  ここから先、キー操作・マウスホィール対応や他のスクロールイベントは
236
236
 
237
237
  コメントに書いた URL のコードを参考にして下さい。
238
+
239
+
240
+
241
+ ----
242
+
243
+ ## ツリービューの要素を固定する
244
+
245
+
246
+
247
+ insert したアイテムは固定して、内容 values のみを変更。
248
+
249
+ ※ 但し、選択中の要素を保持してる場合、参照内容が変わってしまうことには注意。
250
+
251
+
252
+
253
+ ```python
254
+
255
+ #!/usr/bin/env python3.9
256
+
257
+
258
+
259
+ import tkinter as tk
260
+
261
+ from tkinter import ttk
262
+
263
+
264
+
265
+ N = 1000 # データの件数
266
+
267
+ PAGE_SIZE = 10 # 一度に表示する件数
268
+
269
+
270
+
271
+ root = tk.Tk()
272
+
273
+ tree = ttk.Treeview(root, height=PAGE_SIZE, show="headings", columns=[1])
274
+
275
+ tree.pack(fill=tk.BOTH, side=tk.LEFT, expand=tk.YES)
276
+
277
+
278
+
279
+
280
+
281
+ def update_tree_items(offset=0, size=PAGE_SIZE):
282
+
283
+ # 表示中の要素の内容を更新
284
+
285
+ for idx, child in enumerate(tree.get_children()):
286
+
287
+ tree.item(child, values=(offset+idx,))
288
+
289
+
290
+
291
+
292
+
293
+ def yview(command, amount, unit=None):
294
+
295
+ if command == "moveto":
296
+
297
+ offset = max(0, min(N-PAGE_SIZE, int(float(amount) * N)))
298
+
299
+
300
+
301
+ # 表示するアイテムを更新
302
+
303
+ update_tree_items(offset, PAGE_SIZE)
304
+
305
+
306
+
307
+ first = offset / N
308
+
309
+ last = (offset + PAGE_SIZE) / N
310
+
311
+ vbar.set(first, last)
312
+
313
+
314
+
315
+
316
+
317
+ vbar = ttk.Scrollbar(root, orient=tk.VERTICAL, command=yview)
318
+
319
+ vbar.pack(side=tk.RIGHT, fill=tk.Y)
320
+
321
+
322
+
323
+ # 予め固定数の要素を準備しておく
324
+
325
+ for _ in range(PAGE_SIZE):
326
+
327
+ tree.insert("", tk.END, values=())
328
+
329
+
330
+
331
+ root.after_idle(yview, "moveto", 0.0)
332
+
333
+ root.mainloop()
334
+
335
+ ```

1

コード修正

2021/02/24 13:46

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
 
81
- def update_tree_items(offset=0, size):
81
+ def update_tree_items(offset=0, size=PAGE_SIZE):
82
82
 
83
83
  tree.delete(*tree.get_children())
84
84