2014-06-16 201 views
1

我有一個基於python的Tkinter GUI,我希望在單擊「讀取」按鈕時顯示幾個變量的值。理想情況下,這應該在顯示更新變量的窗口中的特定框架中發生,而不會干擾具有其他功能的GUI小部件的其餘部分。如何在Python Tkinter GUI的「標籤」小部件中顯示更新的值?

我遇到的問題是這樣的 - 每次我點擊「閱讀」時,更新的變量都列在舊變量的正下方,而不是覆蓋該位置。我似乎對標籤的工作以及padx,pady(標籤的位置)的理解不正確。我已經粘貼下面的代碼。正確的方法應該是什麼,以便以前的數據被刪除,並且新數據被粘貼到該位置?

def getRead(): 
    #update printList 
    readComm() 
    #update display in GUI 
    i=0 
    while i < (len(printList)): 
     labelR2=Tk.Label(frameRead, text=str(printList[i])) 
     labelR2.pack(padx=10, pady=3) 
     i=i+1 

frameRead=Tk.Frame(window) 
frameRead.pack(side=Tk.TOP) 
btnRead = Tk.Button(frameRead, text = 'Read', command= getRead) 
btnRead.pack(side = Tk.TOP) 

window.mainloop() 

上述代碼成功地顯示在一個型顯示器的printList的元件。但是,每次調用getRead(單擊讀取按鈕時),都會附加到前一個顯示。

PS - 如果有更好的方式顯示數據,除了標籤小部件,那麼請建議。

回答

1

我回答我的問題,通過修改Brionius給出的答案,因爲他的回答是給引用錯誤。下面的代碼適合我。

labelR2s=[] 
def getRead(): 
    #update printList 
    readComm() 
    #update display in GUI 

    for i in range(0, len(printList)):    # Change the text for existing labels 
     if (len(printList)>len(labelR2s)):   # this is the first time, so append 
      labelR2s.append(Tk.Label(frameRead, text=str(printList[i]))) 
      labelR2s[i].pack(padx=10, pady=3) 
     else: 
      labelR2s[i].config(text=printList[i]) # in case of update, modify text 

    window.update_idletasks() 
2

問題在於,您每次運行getRead時都會創建一組新標籤。這聽起來像你想要做的是更新現有標籤的文本,而不是創建新的標籤。下面是其中一種做法:

labelR2s = [] 

def getRead(): 
    global labelR2s 
    #update printList 
    readComm() 
    #update display in GUI 

    for i in range(0, len(labelR2s)):    # Change the text for existing labels 
     labelR2s[i].config(text=printList[i]) 

    for i in range(len(labelR2s), len(printList)): # Add new labels if more are needed 
     labelR2s.append(Tk.Label(frameRead, text=str(printList[i]))) 
     labelR2s[i].pack(padx=10, pady=3) 

    for i in range(len(printList), len(labelR2s)): # Get rid of excess labels 
     labelR2s[i].destroy() 
    labelR2s = labelR2s[0:len(printList)] 

    window.update_idletasks() 
+0

這會在最後一行提供一個錯誤「UnboundLocalError:本地變量'labelR2s'在賦值之前引用」。 – sbhatla

+1

哦,對 - 你需要聲明'labelR2s'作爲一個全局變量(更新答案)。順便說一句,使用類結構通常比使用全局變量更好。 – Brionius

相關問題