Как исправить проблему StringVar.get () - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь сделать автозаполнение GUI (как у Google) в Tkinter, используя StringVar. Я определил функцию обратного вызова, где я использовал StringVar.get (), где я для различных входных данных в Entry я получаю различные выходные данные с помощью предложений автозаполнения в ListBox. Проблема в том, что после ввода одной буквы в Entry я получаю правильный вывод, но после ввода 2 или более я получаю пустой ListBox. Вот код.

num=input()
num=int(num)
sv=StringVar()
def callback(sv,list,num):
    a=sv.get()
    pom_list = list
    bin_list = []
    lexicographic_sort(pom_list)
    x = binary_search(a, pom_list)
    while x != -1:
        bin_list.append(x)
        pom_list.remove(x)
        x = binary_search(a, pom_list)

    i = 0
    l = Listbox(root, width=70)
    l.grid(row=2, column=5)
    if len(bin_list) == 0 or len(a) == 0:
        l.delete(0, END)

    else:
        for list1 in bin_list:
            if i == num:
                break
            l.insert(END, list1[0])
            i += 1
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv,list,num))
te = Entry(root, textvariable=sv)
te.grid(row=1,column=5)

, где list вне функции обратного вызова - это список всех предложений, а bin_list - список предложений StringVar.get () с использованием binary_search.

1 Ответ

2 голосов
/ 21 апреля 2020

Это связано с тем, что все найденные элементы для первой буквы были удалены из списка поиска. Вы должны использовать клонированный список поиска в callback(). Также не создавайте новый список для отображения списка результатов, создайте список результатов один раз и обновите его содержимое в callback(). Кроме того, предварительно отсортируйте список поиска:

def callback(sv, wordlist, num):
    result.delete(0, END) # remove previous result
    a = sv.get().strip()
    if a:
        pom_list = wordlist[:]  # copy of search list
        #lexicographic_sort(pom_list)  # should sort the list beforehand
        x = binary_search(a, pom_list)
        while x != -1 and num > 0:
            result.insert(END, x)
            pom_list.remove(x)
            num -= 1
            x = binary_search(a, pom_list)

...

lexicographic_sort(wordlist)
sv = StringVar()
sv.trace("w", lambda *args, sv=sv: callback(sv, wordlist, num))

...

result = Listbox(root, width=70)
result.grid(row=2, column=5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...