如何解决StringVar.get()问题 [英] How to fix StringVar.get() issue

查看:651
本文介绍了如何解决StringVar.get()问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用StringVar在Tkinter中制作自动完成的GUI(例如Google的).我定义了一个回调函数,在其中我使用了StringVar.get(),其中对于Entry中的不同输入,我通过ListBox中的自动完成建议获得了不同的输出.问题是,在Entry中输入一个字母后,我得到正确的输出,但是在输入2个或更多后,我得到了空的ListBox.这是代码.

I am trying to make autocomplete GUI (like Google's) in Tkinter using StringVar. 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. The problem is that after typing one letter in Entry I get right output but after typing 2 or more I get empty 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)

其中,回调函数外部的list是所有建议的列表,而bin_list是使用binary_search的StringVar.get()的建议列表.

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.

推荐答案

这是因为所有与第一个字母匹配的项目都已从搜索列表中删除.您应该在callback()中使用克隆的搜索列表.也不要创建新列表来显示结果列表,只创建一次结果列表并在callback()中更新其内容. 此外,请事先对搜索列表进行排序:

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(). Also don't create new list to show the result list, create the result list once and update its content in 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)

这篇关于如何解决StringVar.get()问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆