您正在寻找的功能并不是现成的,但您可以轻松地对其进行编码。
简而言之:子类 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