回答編集履歴
3
修正
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
追加: 毎回削除しているのを、更新のみに変更
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
コード修正
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 しない。
|