【问题标题】:How to fix StringVar.get() issue如何修复 StringVar.get() 问题
【发布时间】:2020-08-03 15:59:43
【问题描述】:

我正在尝试使用 StringVar 在 Tkinter 中制作自动完成 GUI(如 Google 的)。我定义了一个回调函数,在其中我使用了 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 是使用 binary_search 的 StringVar.get() 的建议列表。

【问题讨论】:

  • 我看到的一个直接问题(仍在深入研究代码)是使用list 作为参数名称。 list 是内置函数的名称(从技术上讲,是一个类)——使用它作为参数名称会产生意想不到的行为。
  • 为了能够正确分析代码,您还应该包含函数lexicographic_sortbinary_search的代码。
  • 这是因为第一个字母的所有匹配项已从搜索列表中删除。尝试将 pom_list = list 更改为 pom_list = list[:] 以使用搜索列表的副本。

标签: python tkinter autocomplete


【解决方案1】:

这是因为第一个字母的所有匹配项都已从搜索列表中删除。您应该使用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)

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2022-01-04
    相关资源
    最近更新 更多