python-3.x - 列格式大树的Tkinter Treeview双击问题
问题描述
我有一个应用程序,它根据从数据库中检索到的内容以列格式创建大树。一些生成的树超过 700,000 个子元素。我已绑定鼠标双击事件来处理从树视图中选择的子元素。
这些较大的树中的子元素的双击绑定似乎存在问题。特别是对于超过 700,000 标记的元素。<ButtonRelease-1>
似乎工作正常,尽管对于树末尾的元素来说更慢(例如,超过 700,000 标记 - 在选择子元素时存在明显的滞后)。<Double-1>
非常零星,并且似乎无法在 900,000 以上大关(不完全正确,因为我已经看到它在许多测试中工作了一两次)。
以下测试代码演示了我遇到的问题。如果单击子元素,_OnSingleRelease
则始终调用该函数,而与子元素无关。但该_OnDoubleClick
函数似乎只为小于 700,000 的子元素持续调用。我尝试绑定<<TreeviewSelect>>
看看它是否会有所作为,但结果是一样的。
如果有人遇到过这个问题并有修复建议,我将非常感谢您的反馈。
import tkinter as tk
from tkinter import *
from tkinter import ttk
class Controller(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self._init_ui()
self._do_app_init()
def _init_ui(self):
self.tab_results_col_width = 150
self.tabSearchResults_v_scrollbar = Scrollbar(self.parent, orient='vertical')
self.tabSearchResults_v_scrollbar.pack(side=RIGHT, fill=Y)
self.tabSearchResults_tree = ttk.Treeview(self.parent, selectmode="browse",
column=("one", "two"),
yscrollcommand=self.tabSearchResults_v_scrollbar.set)
self.tabSearchResults_tree.pack(side=TOP, fill=BOTH, expand=YES)
self.tabSearchResults_tree.column("#0", width=self.tab_results_col_width, minwidth=self.tab_results_col_width, stretch=tk.NO)
self.tabSearchResults_tree.heading("#0", text="", anchor=tk.W)
self.tabSearchResults_tree.column("#1", width=self.tab_results_col_width, minwidth=self.tab_results_col_width, stretch=tk.NO)
self.tabSearchResults_tree.heading("#1", text=" Item", anchor=tk.W)
self.tabSearchResults_tree.column("#2", width=self.tab_results_col_width, minwidth=self.tab_results_col_width, stretch=tk.NO)
self.tabSearchResults_tree.heading("#2", text=" Product", anchor=tk.W)
self.tabSearchResults_tree['show'] = 'headings'
self.tabSearchResults_tree["displaycolumns"] = ("one", "two")
self.tabSearchResults_tree.bind("<Double-1>", self._OnDoubleClick)
# self.tabSearchResults_tree.bind("<<TreeviewSelect>>", self._OnDoubleClick)
self.tabSearchResults_tree.bind("<ButtonRelease-1>", self._OnSingleRelease)
self.tabSearchResults_v_scrollbar.config(command=self.tabSearchResults_tree.yview)
def _do_app_init(self):
for i in range (1000000):
self.tabSearchResults_tree.insert("", "end", values=(str(i+1), "AAAAAAAAAA"))
return
def _OnSingleRelease(self, event, *args):
item_id = event.widget.focus()
item = event.widget.item(item_id)
print("\n>>Single Click - release ", event)
print(">>Single Click - release ", event.widget.focus(), int(event.widget.focus()[1:], 16))
print (">>Single CLick - release ", item)
def _OnDoubleClick(self, event, *args):
item_id = event.widget.focus()
item = event.widget.item(item_id)
print("\n>>Double Click ", event)
print(">>Double Click ", event.widget.focus(), int(event.widget.focus()[1:], 16))
print (">>Double CLick ", item)
return
if __name__ == '__main__':
root = tk.Tk()
run = Controller(root)
root.mainloop()
解决方案
推荐阅读
- c# - 在哪里可以找到 System.Memory 文档?
- python - 将对象保存在内存中并避免重新加载泡菜
- javascript - mp3 文件的 Google Picker ViewId
- python - 无法在 Windows 10 上的 python 3.6 64 位上运行 pyqt5(没有 anaconda 没有 virtualenv)
- sql - T-SQL 存储过程中带有 CTE 的 SELECT/UPDATE 是原子的吗?
- javascript - 如何在特定程度上获取Javascript中椭圆的边缘坐标?
- javascript - PHP单击链接而不是行切换
- c# - 4.10 带有 NuGet 包参考的插件无法正确部署
- git - 掌舵点存储库到 monorepo 包?
- angular - 带有 Jest 单元测试的 Angular 6