gpt4 book ai didi

python-2.7 - python : Tkinter Treeview Searchable

转载 作者:行者123 更新时间:2023-12-02 14:29:36 25 4
gpt4 key购买 nike

相当直接的问题,尽管我使用了最好的 Google-Fu,但我找不到任何相关内容。

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

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

最佳答案

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

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

以下是一些片段:

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

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

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) 实际搜索代码

您可以按照自己想要的方式自由搜索项目(深度或广度优先、匹配开头或/或完整字符串...)。这是一个重用 A Rodas's answer 的示例并忽略大小写。

    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

关于python-2.7 - python : Tkinter Treeview Searchable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com