首页 > 解决方案 > 列格式大树的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()

标签: python-3.xtkintertreeview

解决方案


推荐阅读