我有一个包含tkinter
小部件的python ttk.treeview
应用程序。
窗口小部件显示在特定目录树上找到的具有特定扩展名的文件列表 - 使用tt.treeview
窗口小部件构建这一点非常简单。
有一个请求启用树的“动态”过滤 - 例如,用户键入Entry
某个字符串,并且当他/她键入时,树会删除不能使用的元素t匹配目前为止输入的字符串。
我正在浏览Treeview
文档,尝试了detach
和reattach
方法,但没有运气。
detach
确实从树中删除了不匹配的元素,但是如果用户点击 Backspace ,我就不能再在树上正确迭代以将那些分离的元素恢复为{{ 1}}方法不会返回它们。
get_children
期待阅读您的建议。
答案 0 :(得分:1)
为了使我的答案可以被任何人重复使用,我必须告诉的不仅仅是直接回答你的问题。如果您想直接查看如何获取分离的项(因此不使用无法获取分离项ID的方法get_children
),请跳转到名称为_columns_searcher
的方法的定义。 / em>的
<小时/> 的 简介 强>
让我们先定义一些属性。
@property
def _to_search(self):
key = 'to_search'
if key not in self._cache:
self._cache[key] = tk.StringVar()
return self._cache[key]
def _set_search_entry(self):
ent = ttk.Entry(
self.root, # or canvas, or frame ...
#...
textvariable=self._to_search
)
ent.grid(
#...
)
ent.bind(
'<Return>',
self._columns_searcher
)
return ent
@property
def search_entry(self):
key = 'search_entry'
if key not in self._cache:
self._cache[key] = self._set_search_entry()
return self._cache[key]
<小时/> 核心答案
以下是直接显示如何重新附加用户分离的项目的部分。首先请注意,正如OP所提到的,get_children
仅返回附加项的ID。第二点请注意,重新附加分离项目所需的唯一内容是他们的ID。因此,这意味着在分离时跟踪/保存它们以便能够重新附加它们。
_detached = set()
def _columns_searcher(self, event):
# originally a set returns a tuple
children = list(self._detached) + list(self.tree.get_children())
self._detached = set()
query = self._to_search.get()
self._brut_searcher(children, query.lower())
请注意 上方的children
包含所有项目 ,请将它们分离。
def _brut_searcher(self, children, query):
i_r = -1
for item_id in children:
text = self.tree.item(item_id)['text'] # already contains the strin-concatenation (over columns) of the row's values
if query in text:
i_r += 1
self.tree.reattach(item_id, '', i_r)
else:
self._detached.add(item_id)
self.tree.detach(item_id)
答案 1 :(得分:0)
据我所知,分离与删除几乎相同。 行消失了,您无权访问它。 如果您有高级树视图结构,您必须制作“分离”项目的副本,只是 id、名称或更多,然后检查两个列表中的元素并对其进行排序。 不同之处在于,如果您分离项目并使用“exists”函数检查它的 id,它应该返回 true