2010-04-08 224 views
12

我寫了一個Python腳本,它執行一些任務來生成,然後不斷更改某些存儲爲字符串變量的文本。這是有效的,每次它被改變時我都可以打印字符串。從變量更新Tkinter標籤

我可以讓標籤第一次顯示字符串,但它永遠不會更新。

這裏是我的代碼:

from tkinter import * 

outputText = 'Ready' 
counter = int(0) 

root = Tk() 
root.maxsize(400, 400) 

var = StringVar() 

l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398) 
l.pack() 

var.set(outputText) 

while True: 
    counter = counter + 1 
    outputText = result 
    outputText = result 
    outputText = result 
    if counter == 5: 
     break 

root.mainloop() 

標籤會顯示Ready,但不會更新,因爲它們可以產生以後要更改的字符串。

經過一段時間的谷歌搜索並查看本網站的答案後,我認爲解決方案可能是使用update_idletasks。每次變量發生變化後,我都會嘗試將其放入,但它沒有幫助。

+2

可能重複[製作python/tkinter標籤小部件更新?](http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos 2016-01-15 12:19:41

回答

16

該窗口僅在進入主循環後纔會顯示。所以你不會看到你在root.mainloop()行之前的while True區塊中所做的任何更改。


GUI界面通過在主循環中對事件作出反應來工作。這裏是一個StringVar也連接到一個Entry小部件的例子。當您更改Entry小部件中的文本時,它會自動更改標籤。

from tkinter import * 

root = Tk() 
var = StringVar() 
var.set('hello') 

l = Label(root, textvariable = var) 
l.pack() 

t = Entry(root, textvariable = var) 
t.pack() 

root.mainloop() # the window is now displayed 

我喜歡下面的參考:http://infohost.nmt.edu/tcc/help/pubs/tkinter/


這裏是你試圖做一個工作示例:

from tkinter import * 
from time import sleep 

root = Tk() 
var = StringVar() 
var.set('hello') 

l = Label(root, textvariable = var) 
l.pack() 

for i in range(6): 
    sleep(1) # Need this to slow the changes down 
    var.set('goodbye' if i%2 else 'hello') 
    root.update_idletasks() 

root.update進入事件循環,直到所有未完成的事件已由Tcl處理。

+0

謝謝。 因此,如果我正確理解了你的話,如果我在While True塊之前放置主循環,標籤將立即顯示在塊開始執行之前。 但是,它不會基於While True塊中的內容進行更新,因爲它位於主循環之外,是嗎?它似乎並不是,無論如何... – Tom 2010-04-08 21:32:44

+0

**由於字符限制分成2條評論** 那麼我需要做什麼?看來,如果我在While True塊之前放置主循環,While True塊中的任何內容都不會顯示......但如果我之後放置它,它將在顯示之前完成塊中的所有操作......我需要一些中間地帶。我可以多次寫入主循環嗎?喜歡,每次我想要顯示更新後? – Tom 2010-04-08 21:33:02

+0

好吧,試過了,它沒有奏效。我想我每次想要更新時都可以複製整個東西......就像關閉舊標籤並在其中放置一個新的標籤,而不用擔心保留一個並更新它......但似乎是這樣凌亂的方式去做事。 – Tom 2010-04-08 21:40:40