Python:Tkinter Treeview 可搜索

2024-05-04

相当直接的问题,尽管我用了最好的谷歌搜索,但我找不到任何相关内容。

我有一个 Python 应用程序,它使用 Tkinter Treeview 小部件作为表格。这对于我需要使用它的用途来说效果很好,但最终会在一些树中出现几百个项目。

无论如何,是否可以使 Treeview 可搜索,只要当树具有焦点时,用户只需键入几个字符并突出显示第一个字母匹配项(而不是窗口中的单独实体来键入搜索模式)?


您正在寻找的功能并不是现成的,但您可以轻松地对其进行编码。

简而言之:子类 Treeview 小部件,当在小部件上按下某个键时,会在右上角显示一个条目(允许您叠加小部件的地方),完成后删除该条目。

以下是一些片段:

1)子类化你想要扩展的小部件

实例化您的附加小部件和绑定。

class SearchableTreeview(ttk.Treeview):
    def __init__(self, *args, **kwargs):
        ttk.Treeview.__init__(self, *args, **kwargs)
        #create the entry on init but does no show it
        self._toSearch = tk.StringVar()
        self.entry = tk.Entry(self, textvariable=self._toSearch)

        self.bind("<KeyPress>", self._keyOnTree)
        self._toSearch.trace_variable("w", self._search)
        self.entry.bind("<Return>", self._hideEntry)
        self.entry.bind("<Escape>", self._hideEntry)

2)临时入境

当按下某个键时,显示带有位置的条目。entry.place(relx=1, anchor=tk.NE)将在右上角显示树上方的条目。如果按下的键是字母,请在条目中复制该字母。将焦点设置在条目上,以便后续按键落在该条目中。

对称地,当在条目上按下 Escape 或 Return 时,刷新内容,隐藏条目 (place_forget),并将焦点设置为树(否则,条目将保持焦点,即使不可见)。

    def _keyOnTree(self, event):
        self.entry.place(relx=1, anchor=tk.NE)
        if event.char.isalpha():
            self.entry.insert(tk.END, event.char)
        self.entry.focus_set()

    def _hideEntry(self, event):
        self.entry.delete(0, tk.END)
        self.entry.place_forget()
        self.focus_set()

3)实际搜索代码

您可以按照自己想要的方式自由搜索项目(深度或广度优先、匹配开头或/或完整字符串...)。这是一个重用的例子罗达斯的回答 https://stackoverflow.com/a/17248940并忽略大小写。

    def _search(self, *args):
        pattern = self._toSearch.get()
        #avoid search on empty string
        if len(pattern) > 0:
            self.search(pattern)

    def search(self, pattern, item=''):
        children = self.get_children(item)
        for child in children:
            text = self.item(child, 'text')
            if text.lower().startswith(pattern.lower()):
                self.selection_set(child)
                self.see(child)
                return True
            else:
                res = self.search(pattern, child)
                if res:
                    return True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:Tkinter Treeview 可搜索 的相关文章

随机推荐