Использование Entry для поиска по ряду записей в Listbox (tkinter)
Я хочу использовать функцию поиска, которая выполняет поиск по списку названий программ (Chrome, Thunderbird, Adobe Reader и т. Д.)
У меня есть список, а затем в список добавлено множество названий программ, я хочу, чтобы функция поиска entry_1 осуществляла поиск по всем этим именам, а затем выделяла искомое.
Это возможно?
Вот мой код:
from tkinter import *
#definitions
root = Tk()
var_1 = StringVar(root)
label_1 = Label(root, text="Search:")
label_2 = Label(root, text="Subject specific programs below")
label_3 = Label(root, text="Subject:")
entry_1 = Entry(root) #this should search through the strings listed under listbox_2 configs
button_1 = Button(root, text="Install")
scrollbar_1 = Scrollbar(root)
listbox_2 = Listbox(root, yscrollcommand=scrollbar_1.set)
optionmenu_1 = OptionMenu(root, var_1, "Computing", "Engineering", "Physics")
string_1 = StringVar(root, name="Google Chrome")
string_2 = StringVar(root, name="Thunderbird")
string_3 = StringVar(root, name="Adobe Reader X")
string_4 = StringVar(root, name="WinRAR")
string_5 = StringVar(root, name="OpenOffice")
string_6 = StringVar(root, name="Program 1")
string_7 = StringVar(root, name="Program 2")
string_8 = StringVar(root, name="Program 3")
string_9 = StringVar(root, name="Program 4")
string_10 = StringVar(root, name="Program 5")
string_11 = StringVar(root, name="Program 6")
#configuration
root.title("Network Installation")
listbox_2.insert(1, string_1)
listbox_2.insert(2, string_2)
listbox_2.insert(3, string_3)
listbox_2.insert(4, string_4)
listbox_2.insert(5, string_5)
listbox_2.insert(6, string_6)
listbox_2.insert(7, string_7)
listbox_2.insert(8, string_8)
listbox_2.insert(9, string_9)
listbox_2.insert(10, string_10)
listbox_2.insert(11, string_11)
optionmenu_1.config(width=15)
scrollbar_1.config(command=listbox_2.yview)
#grid additions
label_1.grid(row=0, column=5)
label_2.grid(columnspan=6, row=1, column=0, sticky=E)
entry_1.grid(row=0, column=6)
button_1.grid(columnspan=2, row=7, column=5)
listbox_2.grid(rowspan=6, columnspan=6, row=2, column=0)
scrollbar_1.grid(rowspan=6, row=2, column=4, sticky=N+S)
optionmenu_1.grid(columnspan=3, row=0, column=1)
label_3.grid(row=0, column=0)
root.mainloop()
1 ответ
Я знаю, что об этом спрашивали давным-давно, но вот как выделить элементы списка с помощью поля ввода поиска в Tkinter.
Объяснение:
all_listbox_items
это самая важная часть. Когда программа впервые заполняет список, важно захватить эти начальные значения и использовать поле ввода поиска как способ запроса этих начальных записей.- добавить
textvariable
вentry_1
и назовите этоsearch_var
, - оставить след
search_var
так что если значения вentry_1
изменить, мы можем вызвать функцию с именемhighlight_searched
, - Функция
highlight_searched
в принципеenumerates
все элементы списка и проверки, чтобы увидеть, если искомый текст вentry_1
находится в любом из элементов списка. Где это правда, вы используетеselection_set(i)
(где я сокращение для индекса), чтобы выбрать каждый элемент.
Я не особенно доволен использованием перечисления. Это просто. Конечно, есть лучший способ вернуть индекс элемента в цикле for. Я хотел бы услышать лучшее решение для моего предложения по перечислению.
Код:
from tkinter import *
#definitions
root = Tk()
var_1 = StringVar(root)
label_1 = Label(root, text="Search:")
label_2 = Label(root, text="Subject specific programs below")
label_3 = Label(root, text="Subject:")
def highlight_searched(*args):
search = search_var.get()
for i,item in enumerate(all_listbox_items):
if search.lower() in item.lower():
listbox_2.selection_set(i)
else:
listbox_2.selection_clear(i)
if search == '':
listbox_2.selection_clear(0, END)
search_var = StringVar()
search_var.trace('w', highlight_searched)
entry_1 = Entry(root, textvariable=search_var) #this should search through the strings listed under listbox_2 configs
button_1 = Button(root, text="Install")
scrollbar_1 = Scrollbar(root)
listbox_2 = Listbox(root, yscrollcommand=scrollbar_1.set)
optionmenu_1 = OptionMenu(root, var_1, "Computing", "Engineering", "Physics")
string_1 = StringVar(root, name="Google Chrome")
string_2 = StringVar(root, name="Thunderbird")
string_3 = StringVar(root, name="Adobe Reader X")
string_4 = StringVar(root, name="WinRAR")
string_5 = StringVar(root, name="OpenOffice")
string_6 = StringVar(root, name="Program 1")
string_7 = StringVar(root, name="Program 2")
string_8 = StringVar(root, name="Program 3")
string_9 = StringVar(root, name="Program 4")
string_10 = StringVar(root, name="Program 5")
string_11 = StringVar(root, name="Program 6")
#configuration
root.title("Network Installation")
listbox_2.insert(1, string_1)
listbox_2.insert(2, string_2)
listbox_2.insert(3, string_3)
listbox_2.insert(4, string_4)
listbox_2.insert(5, string_5)
listbox_2.insert(6, string_6)
listbox_2.insert(7, string_7)
listbox_2.insert(8, string_8)
listbox_2.insert(9, string_9)
listbox_2.insert(10, string_10)
listbox_2.insert(11, string_11)
optionmenu_1.config(width=15)
scrollbar_1.config(command=listbox_2.yview)
#grid additions
label_1.grid(row=0, column=5)
label_2.grid(columnspan=6, row=1, column=0, sticky=E)
entry_1.grid(row=0, column=6)
button_1.grid(columnspan=2, row=7, column=5)
listbox_2.grid(rowspan=6, columnspan=6, row=2, column=0)
scrollbar_1.grid(rowspan=6, row=2, column=4, sticky=N+S)
optionmenu_1.grid(columnspan=3, row=0, column=1)
label_3.grid(row=0, column=0)
all_listbox_items = listbox_2.get(0, END)
root.mainloop()
И любой, кто показывает этот вопрос и может искать окно поиска, которое фильтрует список (в отличие от выделения их, как задает этот вопрос), чтобы показать только релевантные элементы, относящиеся к поиску, вы можете использовать это:
import tkinter as tk
root = tk.Tk()
def update_listbox(*args):
search_term = search_var.get()
listbox.delete(0, tk.END)
for item in all_items:
if search_term.lower() in item.lower():
listbox.insert(tk.END, item)
search_var = tk.StringVar()
search_var.trace('w', update_listbox)
searchbox = tk.Entry(root, textvariable=search_var)
searchbox.pack(fill=tk.X, expand=False)
listbox = tk.Listbox(root)
for i in ['Adam', 'Lucy', 'Barry', 'Bob']:
listbox.insert(tk.END, i)
listbox.pack()
all_items = listbox.get(0, tk.END)
root.mainloop()