在treeview tkinter python中搜索和选择项目

问题描述

我想创建 search_function 来搜索树视图表中的数据。 在我的代码中,我确实需要点击 search_button 以按照下面的 3 个请求在树视图表中选择数据。

from tkinter import *
from tkinter import ttk

GUI = Tk()
GUI.geometry('1920x1080')

tree_view_frame = Frame(GUI)
tree_view_frame.pack()
tree_scroll = Scrollbar(tree_view_frame)
tree_scroll.pack(side = RIGHT,fill = Y)
header = ['Part No.','Name','Unit','Quan','Price','Total','Initial Total']
hdsize = [60,240,60,70,80,80]
aanchor = [W,W,E,E]
global product_table
product_table = ttk.Treeview(tree_view_frame,columns = header,show = 'headings',height = 20,yscrollcommand=tree_scroll.set,selectmode="extended")
def treeview_sort_column(product_table,col,reverse):
    l = [(product_table.set(k,col),k) for k in product_table.get_children('')]
    l.sort(reverse=reverse)
    for index,(val,k) in enumerate(l):
        product_table.move(k,'',index)
    product_table.heading(col,command=lambda _col=col: treeview_sort_column(product_table,_col,not reverse))
for col in header:
    product_table.heading(col,text=col,False))
product_table.pack()
tree_scroll.config(command = product_table.yview)
for h,s,a in zip(header,hdsize,aanchor):
    product_table.heading(h,text = h)
    product_table.column(h,width = s,anchor = a)

Nameget = StringVar()
E_namme = ttk.Entry(GUI,textvariable = Nameget)
E_namme.pack()

def Add_Product(event = None):
    product_table.insert('','end',value = ('',Nameget.get()))
B_Add_product = ttk.Button(GUI,text = "Add Product",command = Add_Product)
B_Add_product.pack()

def search_function():
    query = Nameget.get()
    selections = []
    for child in product_table.get_children():
        if query in product_table.item(child)['values'][1]:
            selections.append(child)
            product_table.selection_set(selections[0])
            product_table.focus(selections[0])
    product_table.focus_force()
search_button = ttk.Button(GUI,text = "search_button",width = 15,command = search_function)
search_button.pack()

GUI.mainloop()
  1. 对于第一次点击是选择第一个结果。

    enter image description here

  2. 第二次或下一次单击是选择下一个结果直到最后一个结果并循环执行。

    enter image description here

  3. 当结果未出现在当前页面时,自动向下滚动滚动条以选择结果。

    enter image description here

在当前代码中,它只能选择第一个结果,不能自动向下滚动滚动条。

提前致谢。

解决方法

您可以使用 see(确保项目可见)并循环。

任何数据结构都可以帮助使用 queuedict,如下例所示:

(用一些OOP就好了)

from tkinter import *
from tkinter import ttk
from collections import defaultdict

GUI = Tk()
GUI.geometry("1920x1080")

tree_view_frame = Frame(GUI)
tree_view_frame.pack()
tree_scroll = Scrollbar(tree_view_frame)
tree_scroll.pack(side=RIGHT,fill=Y)
header = ["Part No.","Name","Unit","Quan","Price","Total","Initial Total"]
hdsize = [60,240,60,70,80,80]
aanchor = [W,W,E,E]
global product_table


class ProductMap:
    def __init__(self):
        self.selections = defaultdict(list)
        self.last_lookup = ""

    def treeview_sort_column(self,product_table,col,reverse):
        l = [(product_table.set(k,col),k) for k in product_table.get_children("")]
        l.sort(reverse=reverse)
        for index,(val,k) in enumerate(l):
            product_table.move(k,"",index)
        product_table.heading(
            col,command=lambda _col=col: product_map.treeview_sort_column(
                product_table,_col,not reverse
            ),)

    def search_function(self):
        query = Nameget.get()
        if not query:
            return
        children = product_table.get_children()
        for child in children:
            curr = product_table.item(child)["values"][1]
            if query in curr and child not in self.selections[query]:
                self.selections[query].append(child)
                product_table.selection_set(child)
                product_table.focus(child)
                product_table.see(child)
                self.last_lookup = query
                return
            elif query != self.last_lookup:
                self.selections = defaultdict(list)

    def Add_Product(self,event=None):
        product_table.insert("","end",value=("",Nameget.get()))


product_map = ProductMap()

product_table = ttk.Treeview(
    tree_view_frame,columns=header,show="headings",height=20,yscrollcommand=tree_scroll.set,selectmode="extended",)
for col in header:
    product_table.heading(
        col,text=col,command=lambda _col=col: product_map.treeview_sort_column(
            product_table,False
        ),)
product_table.pack()
tree_scroll.config(command=product_table.yview)
for h,s,a in zip(header,hdsize,aanchor):
    product_table.heading(h,text=h)
    product_table.column(h,width=s,anchor=a)

Nameget = StringVar()
E_namme = ttk.Entry(GUI,textvariable=Nameget)
E_namme.pack()


B_Add_product = ttk.Button(GUI,text="Add Product",command=product_map.Add_Product)
B_Add_product.pack()


search_button = ttk.Button(
    GUI,text="search_button",width=15,command=product_map.search_function
)
search_button.pack()


GUI.mainloop()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...