Tkinter Treeview 搜索在搜索子项时不会最大化

Tkinter Treeview Search Does not maximize when children is searched

# 当我在 Tkinter Treeview 中搜索 3 个字符的关键字时,搜索 #children 的子级,但是子级没有最大化,但是当手动 #maximized 时,子级被高亮显示。此外,搜索到的关键字不会#scroll window。有办法吗?请帮忙。

Search when scrolled manually and maximized the level


def search(self, item=''):
    search_pattern = str(self.searchText.get())
    if len(search_pattern) < 3:
        return

    children = self.tree.get_children(item)
    for child in children:
        value_list = self.tree.item(child)["values"]
        #print(value_list)
        for i in range(len(value_list)):
            if type(value_list[0]) != int:
                if value_list[0].isprintable():
                    #print(value_list[i],'printable')
                    #if value_list[0].lower().startswith(search_pattern.lower()):
                    if value_list[0].lower().find(search_pattern.lower()) != -1:
                        self.tree.selection_set(child)
                    else:
                        res = search(self,item=child)                
        search(self,item=child)


def search_box(root):

    root.searchText = StringVar()                                       
    root.search_input = ttk.Entry(root, textvariable = root.searchText, justify = LEFT)
    root.search_input.grid(column = 0, row = 0, padx=60, pady=5, sticky='NW', rowspan=2)
    print(root.search_input)
    print(root.searchText)

    root.searchText.trace_variable("w",lambda x,y,z: search(root))      # 
    Callback if stringvar is updated

    root.bind("<Return>", lambda x: hideEntry(root,x))
    root.bind("<Escape>", lambda x: hideEntry(root,x))

要扩展分支,可以调用tree.item(iid, open=True)

要滚动到搜索完成的地方,您可以使用tree.see(iid)

在您的 search 方法中结合两者:

def search(self, item=''):
    search_pattern = str(self.searchText.get())
    if len(search_pattern) < 3:
        return

    children = self.tree.get_children(item)
    for child in children:
        value_list = self.tree.item(child)["values"]
        for i in range(len(value_list)):
            if type(value_list[0]) != int:
                if value_list[0].isprintable():
                    if value_list[0].lower().find(search_pattern.lower()) != -1:
                        self.tree.item(item,open=True)
                        self.tree.selection_set(child)
                        self.tree.see(child)
                    else:
                        res = search(self,item=child)                
        search(self,item=child)

您可以在 treeview here 上阅读文档。