Поиск значений в выпадающем списке

При использовании модуля AutocompleteCombobox из библиотеки ttkwidgets, после ввода текста и нажатия « down », AutocompleteCombobox автоматически заполняет текст в поле ввода и выделяет его в раскрывающемся меню, но мне нужно добавить фильтр что бы в полученном списке были только те значения, которые я успела ввести с клавиатуры, а не всё предложенное слово.

Как убрать автоматическое заполнение текста при нажатии клавиши "down", но оставить открытие выпадающего списка. Спасибо. Если не понятна суть вопроса, спрашивайте, сделаю скринов или запишу анимацию

from ttkwidgets.autocomplete import AutocompleteCombobox
from tkinter import *


countries = ['Antigua and Barbuda', 'Bahamas','Barbados','Belize', 'Canada',
        'Costa Rica ', 'Cuba', 'Dominica', 'Dominican Republic', 'El Salvador ',
        'Grenada', 'Guatemala ', 'Haiti', 'Honduras ', 'Jamaica', 'Mexico',
        'Nicaragua', 'Saint Kitts and Nevis', 'Panama ', 'Saint Lucia',
        'Saint Vincent and the Grenadines', 'Trinidad and Tobago', 'United States of America']



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

    if value == '':
        entry['values'] = countries
    else:
        data = []
        for item in countries:
            if value.lower() in item[0:len(value)].lower():
                data.append(item)

        entry['values'] = data


ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws.config(bg='#8DBF5A')

frame = Frame(ws, bg='#8DBF5A')
frame.pack(expand=True)

Label(
    frame,
    bg='#8DBF5A',
    font = ('Times',21),
    text='Countries'
    ).pack()

entry = AutocompleteCombobox(frame, width=30, font=('Times', 18),completevalues=countries)

entry.bind('<KeyPress>', check_input)
entry.pack()

ws.mainloop()

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

Автор решения: day383

Если я всё правильно понял, проблема здесь в том, что модуль выстраивает автозаполнение и set для текстового поля не по нажатию клавиши, а по отжатию. Функция, выстраивающая автозаполнение, называется handle_keyrelease. Поэтому обработчик check_input будет работать с пустыми данными при первом запуске, и с данными первого запуска при втором запуске и т.д.

Если сделать, чтобы обработчик срабатывал не по <KeyPress>, а по <KeyRelease>, он будет возвращать правильное, актуальное значение event.widget.get() для value, но перестанет выстраивать автозаполнение, потому что check_input перезапишет прослушивание handle_keyrelease.

Поэтому в check_input добавляется ещё модульная функция autocomplete для буквенных клавиш -- часть обработчика handle_keyrelease.

from ttkwidgets.autocomplete import AutocompleteCombobox
from tkinter import *

countries = [
        'Antigua and Barbuda', 'Bahamas','Barbados','Belize', 'Canada',
        'Costa Rica ', 'Cuba', 'Dominica', 'Dominican Republic', 'El Salvador ',
        'Grenada', 'Guatemala ', 'Haiti', 'Honduras ', 'Jamaica', 'Mexico',
        'Nicaragua', 'Saint Kitts and Nevis', 'Panama ', 'Saint Lucia',
        'Saint Vincent and the Grenadines', 'Trinidad and Tobago', 'United States of America'
        ]

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

    if len(event.keysym) == 1:
        event.widget.autocomplete()

    if value == '':
        entry['values'] = countries
    else:
        data = []
        for item in countries:
            if value.lower() in item[0:len(value)].lower():
                data.append(item)
        entry['values'] = data

ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws.config(bg='#8DBF5A')

frame = Frame(ws, bg='#8DBF5A')
frame.pack(expand=True)

Label(
    frame,
    bg='#8DBF5A',
    font = ('Times',21),
    text='Countries in North America '
    ).pack()

entry = AutocompleteCombobox(
    frame,
    width=30,
    font=('Times', 18),
    completevalues=countries
    )

entry.bind('<KeyRelease>', check_input)

entry.pack()
ws.mainloop()
→ Ссылка