Combobox с подсказкой вариантов в tkinter

Есть код, который выполняет поиск в списке по нажатию кнопки выпадающего списка.

Не могу понять, как мне обрабатывать это в прямом эфире, чтобы при вводе слов сразу показывались подходящие значения.
(без ООП, т.к. привязать ООП к своей утилите я не смогу).
Спасибо

from tkinter import *

from tkinter import ttk

lst = ['C', 'C++', 'Java',
   'Python', 'Perl',
   'PHP', 'ASP', 'JS']


def check_input(event):
    value = event.widget.get()

    if value == '':
        combo_box['values'] = lst
    else:
        data = []
        for item in lst:
            if value.lower() in item.lower():
                data.append(item)

        combo_box['values'] = data


root = Tk()

# creating Combobox
combo_box = ttk.Combobox(root)
combo_box['values'] = lst
combo_box.bind('<KeyRelease>', check_input)
combo_box.pack()

root.mainloop()

Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

from tkinter import *
from ttkwidgets.autocomplete import AutocompleteCombobox # pip install ttkwidgets


lst = [
    'C', 'C++', 'Java',
    'Python', 'Perl',
    'PHP', 'ASP', 'JS'
]

root = Tk()

# creating Combobox
combo_box = AutocompleteCombobox(root, width=30, completevalues=lst)

combo_box.pack()
root.mainloop()
→ Ссылка
Автор решения: insolor

Пример с Entry + Listbox (без скрытия списка):

from tkinter import *

lst = [
    'C', 'C++', 'Java',
    'Python', 'Perl',
    'PHP', 'ASP', 'JS'
]


def check_input(_event=None):
    value = entry.get().lower()

    if value == '':
        listbox_values.set(lst)
    else:
        data = []
        for item in lst:
            if value.lower() in item.lower():
                data.append(item)

        listbox_values.set(data)


root = Tk()

entry_text = StringVar()
entry = Entry(root, textvariable=entry_text)
entry.bind('<KeyRelease>', check_input)
entry.pack()


def on_change_selection(event):
    selection = event.widget.curselection()
    if selection:
        index = selection[0]
        data = event.widget.get(index)
        entry_text.set(data)
        check_input()


listbox_values = Variable()
listbox = Listbox(root, listvariable=listbox_values)
listbox.bind('<<ListboxSelect>>', on_change_selection)
listbox.pack()
listbox_values.set(lst)

root.mainloop()

→ Ссылка