【问题标题】:TKinter Label Not UpdatingTKinter 标签未更新
【发布时间】:2017-11-18 13:18:21
【问题描述】:

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

我正在开发一个简单的搜索界面,以在 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()

现在来美化一下。非常感谢收到的所有帮助。

【问题讨论】:

    标签: python tkinter python-3.6


    【解决方案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)))
    

    【讨论】:

    • 当我尝试设置 lst = StringVar() 时,它给了我错误:Traceback(最近一次调用最后一次):文件“C:\Path\Python\Scripts and Programs\search_box.py” ,第 24 行,在 lst = StringVar() 文件 "C:\Path\Python\Python36-32\lib\tkinter_init_.py",第 477 行,在 init Variable.__init__(self, master, value, name) 文件“C:\Path\Python\Python36-32\lib\tkinter_init_.py”,第 314 行,在 init self._root = master._root() AttributeError: 'NoneType' object has no attribute '_root'
    • RE:我的最后一条评论,问题在于 stringvar() 调用的位置,它是在我调用 tk() 之前调用的。但我仍然有同样的问题;我的标签不会显示。
    • l2.configure(text=lst) 应该是l2.configure(textvariable=lst)
    【解决方案2】:

    在您的search 函数中,您遍历users,它们是类对象(ID1 等),并将它们与您的输入字符串进行比较,该字符串的计算结果始终为False

    if u==search_input: 确实应该是 if u.uid == search_input:(或者 u.name,如果您正在搜索名称)。

    【讨论】:

    • 你在正确的轨道上,但看错了一面。你正在评估正确的字符串,但 search_input 作为一个对象出现,通过调用 search_input.get()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多