2017-06-15 157 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