Создание панели поиска с каскадной функциональностью с помощью Python

Мне было интересно, можно ли создать панель поиска с каскадной функциональностью, используя виджет ввода в tkinter, или есть ли другие виджеты, которые можно использовать для достижения этой цели, за все время разработки настольных приложений я смог только чтобы создать тот, где вам нужно будет ввести полное имя того, что вы хотите найти, затем вы должны написать запрос, который получает запись и получает любую информацию, которую вы хотите из базы данных, это очень важно для меня, потому что это ограничивает меня, особенно когда я хочу создать приложение для магазина, где есть много предметов, вы можете просто ввести первую букву предмета, и он автоматически покажет вам предметы с этой первой буквой. пожалуйста, я был бы очень признателен, если бы был ответ на это...


person Oden Ikpi David    schedule 15.08.2019    source источник
comment
Возможно, виджет AutocompleteCombobox в модуле ttkwidget делает то, что вам нужно.   -  person j_4321    schedule 15.08.2019
comment
спасибо, это не совсем то, что я ищу, но это сработает @j_4321   -  person Oden Ikpi David    schedule 19.08.2019


Ответы (1)


Все, что вам нужно сделать, это привязать функцию к <Any-KeyRelease> для фильтрации данных по мере ввода пользователем. Когда связанная функция вызывается, получите значение виджета ввода, а затем используйте его, чтобы получить отфильтрованный список значений.

Вот пример, в котором используется фиксированный набор данных и список для отображения данных, но, конечно, вы можете так же легко выполнить запрос к базе данных и отобразить значения по своему усмотрению.

import tkinter as tk

# A list of all tkinter widget class names
VALUES = [cls.__name__ for cls in tk.Widget.__subclasses__()]

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.entry = tk.Entry(self.root)
        self.listbox = tk.Listbox(self.root)
        self.vsb = tk.Scrollbar(self.root, command=self.listbox.yview)
        self.listbox.configure(yscrollcommand=self.vsb.set)

        self.entry.pack(side="top", fill="x")
        self.vsb.pack(side="right", fill="y")
        self.listbox.pack(side="bottom", fill="both", expand=True)

        self.entry.bind("<Any-KeyRelease>", self.filter)

        self.filter()

    def filter(self, event=None):
        pattern = self.entry.get().lower()
        self.listbox.delete(0, "end")
        filtered = [value for value in VALUES if value.lower().startswith(pattern)]
        self.listbox.insert("end", *filtered)

example = Example()
tk.mainloop()
person Bryan Oakley    schedule 15.08.2019