简体   繁体   English

如何修复 StringVar.get() 问题

[英]How to fix StringVar.get() issue

I am trying to make autocomplete GUI (like Google's) in Tkinter using StringVar.我正在尝试使用 StringVar 在 Tkinter 中制作自动完成 GUI(如 Google 的)。 I defined a callback function, where i used StringVar.get(), where I for different input in Entry I get different output via autocomplete suggestions in ListBox.我定义了一个回调 function,其中我使用了 StringVar.get(),其中我在条目中的不同输入通过 ListBox 中的自动完成建议得到不同的 output。 The problem is that after typing one letter in Entry I get right output but after typing 2 or more I get empty ListBox.问题是,在 Entry 中输入一个字母后,我得到了正确的 output 但在输入 2 个或更多后,我得到了空的 ListBox。 Here's the code.这是代码。

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)

where list outside callback function is a list of all suggestions, and bin_list is a list of suggestions of StringVar.get() using binary_search.其中list outside callback function 是所有建议的列表, bin_list是使用 binary_search 的 StringVar.get() 建议的列表。

It is because all matched items for the first letter have been removed from the search list.这是因为第一个字母的所有匹配项都已从搜索列表中删除。 You should use a cloned search list in callback() .您应该在callback()中使用克隆的搜索列表。 Also don't create new list to show the result list, create the result list once and update its content in callback() .也不要创建新列表来显示结果列表,创建一次结果列表并在callback()中更新其内容。 Furthermore, sort the search list beforehand:此外,预先对搜索列表进行排序:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM