如何过滤ttk.treeview公司在Python中?

2024-04-25 19:08:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pythontkinter应用程序,其中包含一个ttk.treeview小部件。在

小部件显示在特定目录树上找到的具有特定扩展名的文件的列表-这对于使用tt.treeview小部件构建来说很简单。在

有一个请求来启用对树的“动态”过滤——例如,用户在Entry中键入一些字符串,当他/她键入时,树会删除到目前为止与输入的字符串不匹配的元素。在

我在研究Treeview文档,尝试了detach和{}方法,但是没有成功。在

detach确实从树中删除了不匹配的元素,但是如果用户点击Backspace,我就不能再在树上正确迭代来恢复那些分离的元素,因为get_children方法不会返回它们。在

def filter_tree(self):
    search_by = self.search_entry.get()
    self.tree_detach_leaf_by_regex(self.current_loaded_folder, search_by, "")

def tree_detach_leaf_by_regex(self, root, regex, parent):
    if self.treeview.get_children(root):
        for child in self.treeview.get_children(root):
            self.tree_detach_leaf_by_regex(child, regex, root)
    else:
        if not re.match(regex, self.treeview.item(root)["text"]):
            self.elements_index_within_parent[root] = self.treeview.index(root)
            self.elements_parents[parent] = 1
            self.treeview.detach(root)
        else:
            self.treeview.reattach(root, parent, self.elements_index_within_parent[root])

期待您的建议。在


Tags: selftree元素searchgetby部件root
1条回答
网友
1楼 · 发布于 2024-04-25 19:08:51

为了让任何人都能重复使用我的答案,我必须告诉你的不仅仅是直接回答你的问题。如果您直接想了解如何获取分离项(因此不使用无法获取分离项id的方法get_children),请跳到名称为_columns_searcher的方法的定义。


简介

让我们首先定义一些属性。在

@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。这意味着在分离它们时要跟踪/保存它们,以便能够重新附加它们。在

^{pr2}$

请注意,上面的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)

相关问题 更多 >