2010-04-08 226 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