TKinter标签未更新

时间:2017-06-15 22:09:03

标签: python tkinter python-3.6

我知道这个问题已经被问了好几次,但我在其他帖子上看到的解决方案都没有为我工作(我确定我可能错误地执行了它们)所以这就是。

我正在使用一个简单的搜索界面来搜索ID列表中的ID,并返回与该ID相关联的属性,我想要显示该属性。我目前正在尝试在Python 3.6上使用tkinter,但是我愿意使用不同的方法,如果那样会更好。

我目前的代码如下:

from tkinter import *

class User(object):

    def __init__(self, uid, name, cc):
        self.uid = uid
        self.name = name
        self.cc = cc

ID1 = User('111111','NAME', 0000)

ID2 = User('222222','NAME', 0000)

ID3 = User('333333','NAME', 0000)

users = [ID1, ID2, ID3]

lst = ""

search_input = ""

main = Tk()
main.title("Field Lookup")
main.geometry('320x240')

frame1 = Frame(main, height=200, width=200)
frame1.pack()

l1 = Label(frame1, text="Enter User ID")
l1.pack()

entry = Entry(frame1, width=30, textvariable=search_input)
entry.pack()

l2 = Label(frame1, textvariable=lst)
l2.pack(side=BOTTOM)

def updt():
    l2.configure(text=lst)
    main.update_idletasks()

def search():
    for u in users:
        if u==search_input:
            lst = u.uid,u.name,u.cc
            print(lst)
            updt()

def clear():
    entry.delete(0, END)
    lst = None
    updt()

button1 = Button(frame1, text="Search", command=search)
button1.pack(side=LEFT)

button2 = Button(frame1, text="Clear", command=clear)
button2.pack(side=RIGHT)

main.mainloop()

这大部分都有效,但应该返回结果的标签不会更新。除了我目前所拥有的updt()函数之外,我还尝试在搜索函数体内调用main.update(),以及main.update_idletasks()。我也尝试在main.mainloop()之前调用这两个,再次没有效果。目前一切都在这方面,包括清除功能,搜索功能已经过独立测试,以确保它正常工作,所以问题是标签没有更新,据我所知。我是Python的新手,所以任何帮助都会受到大力赞赏。

**编辑**

我发现当我将变量search_input和lst打印到控制台时,它们读作PY_VAR0和PY_VAR1,而不是打印它们应包含的字符串。我认为我需要找到一种方法来访问这些包含的字符串,但我不知道该如何去做。简单地转换为str()只会产生一串PY_VAR(n)

编辑2

搜索PY_VAR问题产生this question,这解决了我的问题。工作代码如下:

from tkinter import *

class User(object):

    def __init__(self, uid, name, cc):
        self.uid = uid
        self.name = name
        self.cc = cc
##Had to set cc variable as string to work with join method
ID1 = User('111111','NAME', '0000')

ID2 = User('222222','NAME', '0000')

ID3 = User('333333','NAME', '0000')

users = [ID1, ID2, ID3]

main = Tk()
main.title("Field Lookup")
main.geometry('320x240')

frame1 = Frame(main, height=300, width=200)
frame1.pack()

l1 = Label(frame1, text="Enter User ID")
l1.pack()

lst = StringVar()

search_input = StringVar()

entry = Entry(frame1, width=30, textvariable=search_input)
entry.pack()

l2 = Label(frame1, textvariable=lst)
l2.pack(side=BOTTOM)

def updt():
    main.update_idletasks()

def search():
    for u in users:
        if u.uid==search_input.get():
            lst.set(', '.join((u.uid,u.name,u.cc)))
            updt()

def clear():
    entry.delete(0, END)
    lst.set('')
    updt()

button1 = Button(frame1, text="Search", command=search)
button1.pack(side=LEFT)

button2 = Button(frame1, text="Clear", command=clear)
button2.pack(side=RIGHT)

main.mainloop()

现在只是把它搞砸了。收到的所有帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

一些小改动:

您需要传递StringVar作为textvariable的值。

lst = StringVar()

删除l2.configure(textvariable=lst)。对lst的更新会更新标签的文本。

clear()中,将lst设置为空字符串。

lst.set('')

search()中,将lst设置为结果。

lst.set(','.join((u.uid,u.name,u.cc)))

答案 1 :(得分:1)

search函数中,迭代users,它们是类对象(ID1等),并将它们与您的条目字符串进行比较,该字符串始终求值为{{ 1}}。

False应该是if u==search_input:(或if u.uid == search_input:,如果您通过名称搜索)。