我知道這個問題已經被問過幾次了,但是我在其他帖子上看到的解決方案都沒有爲我工作(我確定我可能實現了他們錯誤),所以在這裏。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()
現在只是很漂亮了一些。所有收到的幫助非常感謝。
當我嘗試設置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
RE:我最後的評論,問題是放置了stringvar()調用,它在我調用tk()之前被調用。但我仍然有同樣的問題;我的標籤不會顯示。 – Cameron
'l2.configure(text = lst)'應該是'l2.configure(textvariable = lst)' –