用tkinter python在treeview中搜索项目

用tkinter python在treeview中搜索项目,python,tkinter,treeview,Python,Tkinter,Treeview,我试着做一个可搜索的树状视图,就像有人在本文中对我的代码做的一样:在树状视图中搜索并突出显示/选择包含搜索项的行。我还想这样做,当键入的单词以大写字母或小写字母开头,或者整个单词是.upper()或.lower()或.capital()时,搜索框并不重要。问题是,当我键入可搜索的单词时,什么也没有发生,并弹出一个关于缺少一个参数的错误。代码如下: from tkinter import * from tkinter import ttk root = Tk() sv = StringVar()

我试着做一个可搜索的树状视图,就像有人在本文中对我的代码做的一样:在树状视图中搜索并突出显示/选择包含搜索项的行。我还想这样做,当键入的单词以大写字母或小写字母开头,或者整个单词是.upper()或.lower()或.capital()时,搜索框并不重要。问题是,当我键入可搜索的单词时,什么也没有发生,并弹出一个关于缺少一个参数的错误。代码如下:

from tkinter import *
from tkinter import ttk
root = Tk()

sv = StringVar()
ids = []

def add():
    names = tree.insert("",END,values=(e0.get(),e1.get(),e2.get(),e3.get()))
def adds(names):
    for i in range(len(names)):
        ids.append(tree.insert("", "end", text=names[i]))
def command(*args,names):
    selections = [] 
    for i in range(len(names)):
        if entry.get() != "" and entry.get() == names[i][:len(entry.get())]:
            selections.append(ids[i]) 
        tree.selection_set(selections)
sv.trace("w", command)
entry = Entry(root, textvariable=sv,width=13) 
entry.grid(row=2,column=1,rowspan=3,sticky=W) 
e0 = Entry(root,width=15)
e0.grid(row=0,column=1,rowspan=1,sticky=W)
e1 = Entry(root,width=15)
e1.grid(row=0,column=1,rowspan=2,sticky=W)
e2 = Entry(root,width=15)
e2.grid(row=0,column=1,rowspan=3,sticky=W)
e3 = Entry(root,width=15)
e3.grid(row=0,column=1,rowspan=4,sticky=W)

btn1 = Button(root,text="add",width=5,command=add)
btn1.grid(row =0,column=0,rowspan=5)
lb1 = Label(root,text="serial num:")
lb1.grid(row =0,column=0,rowspan=1)
lb2 = Label(root,text="medicine\nname ")
lb2.grid(row =0,column=0,rowspan=2)
lb3 = Label(root,text="quatity")
lb3.grid(row =0,column=0,rowspan=3)
lb4 = Label(root,text="expiry Date")
lb4.grid(row =0,column=0,rowspan=4)
lb4 = Label(root,text="search box")
lb4.grid(row =1,column=0,rowspan=6)
#treeview
tree = ttk.Treeview(root,height=25)
tree["columns"]=("one","two","three","four")
tree.column("one",width=120)
tree.column("two",width=160)
tree.column("three",width=130)
tree.column("four",width=160)
tree.heading("one", text="Numer seryjny leku")
tree.heading("two", text="Nazwa Leku")
tree.heading("three", text="Ampułki/Tabletki")
tree.heading("four",text="Data ważności")
tree["show"]="headings"
tree.grid(row=0,column=2,rowspan=6,pady=20)
root.geometry("840x580")
root.mainloop()

您只需将
查询
字符串与
字符串转换为小写后进行比较:

像这样:

def search():
    query = search_entry.get()
    selections = []
    for child in tree.get_children():
        if query.lower() in tree.item(child)['values'].lower():   # compare strings in  lower cases.
            print(tree.item(child)['values'])
            selections.append(child)
    print('search completed')
    tree.selection_set(selections)
完整示例:

import tkinter as tk
from tkinter import ttk


def add():
    value = add_entry.get()
    values.append(value)
    tree.insert("", tk.END, values=(f'#{len(values)}', value, 'more', 'moar'))


def search():
    query = search_entry.get()
    selections = []
    for child in tree.get_children():
        if query.lower() in tree.item(child)['values'].lower():   # compare strings in  lower cases.
            print(tree.item(child)['values'])
            selections.append(child)
    print('search completed')
    tree.selection_set(selections)


values = []

root = tk.Tk()
root.title("Medicine database")

lb1 = tk.Label(root, text="Search:")
lb1.grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)
search_entry = tk.Entry(root, width=15)
search_entry.grid(row=0, column=1, padx=10, pady=10, sticky=tk.E, rowspan=1)
btn = tk.Button(root, text="search", width=10, command=search)
btn.grid(row=0, column=0, padx=10, pady=10, rowspan=2)

add_lb = tk.Label(root, text="add:")
add_lb.grid(row=1, column=0, padx=10, pady=10, sticky=tk.W)
add_entry = tk.Entry(root, width=15)
add_entry.grid(row=1, column=1, padx=10, pady=10, sticky=tk.E, rowspan=1)
btn1 = tk.Button(root, text="add", width=10, command=add)
btn1.grid(row=1, column=0, padx=10, pady=10, rowspan=2)

# treeview
tree = ttk.Treeview(root, height=25)
tree["columns"] = ("one", "two", "three", "four")
tree.column("one", width=120)
tree.column("two", width=160)
tree.column("three", width=130)
tree.column("four", width=160)
tree.heading("one", text="Numer seryjny leku")
tree.heading("two", text="Nazwa Leku")
tree.heading("three", text="Ampułki/Tabletki")
tree.heading("four", text="Data ważności")
tree["show"]="headings"
tree.grid(row=0, column=2, rowspan=6, pady=20)

root.geometry("840x580")


if __name__ == '__main__':

    root.mainloop()

您发布问题3次或更多次。只需与已经帮助过你的人交谈。在此处回答你的问题并根据你的需要更新:这是否回答了你的问题?