3

您好,我只是希望标签在循环期间更改/刷新,但它不起作用

这是我的代码

fen1 = Tk()

v = StringVar()
Label(fen1,textvariable=v).pack()

i=0

while(1):
    i=i+1
    v.set(i)
fen1.mainloop() 

谢谢

4

2 回答 2

12

在这里,试试这个:

from Tkinter import *
import time
root=Tk()

variable=StringVar()

def update_label():
    i=0
    while 1:
        i=i+1
        variable.set(str(i))
        root.update()

your_label=Label(root,textvariable=variable)
your_label.pack()
start_button=Button(root,text="start",command=update_label)
start_button.pack()
root.mainloop()

那应该给你一个很好的例子。但是,重要的是要注意,在 while 循环期间,您必须调用,root.update()否则您的 GUI 将冻结,直到循环完成(在这种情况下它永远不会)并且永远不会显示您的数字。

另请注意,您可以从程序中的任何位置调用update_label()。出于示例目的,我只是将它添加到开始按钮。

您的代码有什么问题是您将 while 循环设置为自由浮动,最重要的是您的 GUI 的主循环之前。当你这样做时,由于这个循环是无限的,它永远不允许Tkinter启动它的mainloop(). 但是,如果您将 while 循环放在mainloop之后,那么您退出 GUI之前永远不会执行,这是因为 mainloop 在它停止(关闭 GUI)之前是无限的。

因此,要解决此问题,您只需将其放入一个函数中,稍后在主循环期间调用它Tkinter。您也可以通过多种方式执行此操作,例如,您可以.after()在一定时间后执行特定任务,或者使其成为按下时要运行的按钮的命令等。.

但是,您应该使用的正确代码如下,因为您真的不希望代码中出现无限循环(除主循环之外)。:

class App (object):
    def __init__(self):
        self.root=Tk()
        self.variable=StringVar()
        self.i=0
        self.your_label=Label(self.root,textvariable=self.variable)
    def grid(self):
        self.your_label.pack()
    def update_label(self):
        self.i=self.i+1
        self.variable.set(str(self.i))
        self.root.after(20,self.update_label)
    def run(self):
        self.grid()
        self.root.after(20,self.update_label)
        self.root.mainloop()

if __name__=='__main__':
    App().run()
于 2012-07-03T01:49:38.747 回答
0

您的代码永远不会到达mainloop. 为了看到类似的内容,您需要将更新绑定在一个回调中,该回调在主循环中被调用(间接地,通过事件)。

于 2012-07-03T01:26:54.180 回答