2017-06-15 111 views
0

我知道这个问题已经被问过几次了,但是我在其他帖子上看到的解决方案都没有为我工作(我确定我可能实现了他们错误),所以在这里。TKinter标签不更新

我正在寻找一个简单的搜索界面来搜索ID列表中的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)的字符串()结果

EDIT 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() 

现在只是很漂亮了一些。所有收到的帮助非常感谢。

回答

1

一些细微的变化:

你需要通过一个StringVartextvariable值。

lst = StringVar() 

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

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

lst.set('') 

search(),设置lst到结果。

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

当我尝试设置lst = StringVar()时,它给了我错误:Traceback(最近一次调用最后一次): 文件“C:\ Path \ Python \ Scripts and Programs \ search_box.py”,第24行, in lst = StringVar() 变量.__ init __(self,master,value,name) 文件“C:\ Path \ Python \ Python36-32 \ lib \ tkinter \ __ init__.py”,行477,在__init__中 文件“C:\ Path \ Python \ Python36-32 \ lib \ tkinter \ __ init__.py”,行314,在__init__中 self._root = master._root() AttributeError:'NoneType'对象没有属性'_root' – Cameron

+0

RE:我最后的评论,问题是放置了stringvar()调用,它在我调用tk()之前被调用。但我仍然有同样的问题;我的标签不会显示。 – Cameron

+0

'l2.configure(text = lst)'应该是'l2.configure(textvariable = lst)' –

1

在你search功能,您遍历users,它是类对象(ID1等),并将它们与您的输入字符串,它始终计算为False

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

+0

你在正确的轨道上,但看着错误的一面。你正在评估正确的字符串,但search_input出来作为一个对象,通过调用search_input.get() – Cameron