您好,我只是希望标签在循环期间更改/刷新,但它不起作用
这是我的代码
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
谢谢
您好,我只是希望标签在循环期间更改/刷新,但它不起作用
这是我的代码
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
谢谢
在这里,试试这个:
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()
您的代码永远不会到达mainloop
. 为了看到类似的内容,您需要将更新绑定在一个回调中,该回调在主循环中被调用(间接地,通过事件)。