use*_*451 2 python user-interface label loops tkinter
您好我只是想在循环期间更改/刷新标签,但它不起作用
这是我的代码
fen1 = Tk()
v = StringVar()
Label(fen1,textvariable=v).pack()
i=0
while(1):
i=i+1
v.set(i)
fen1.mainloop()
Run Code Online (Sandbox Code Playgroud)
谢谢
试试这个:
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()
Run Code Online (Sandbox Code Playgroud)
这应该会给你一个很好的例子.但是,重要的是要注意,在while循环期间,您必须调用root.update()否则您的GUI将冻结,直到循环完成(在这种情况下它永远不会),并且永远不会显示您的数字.
另请注意,您可以update_label()从程序中的任何位置拨打电话.我刚刚将它添加到开始按钮以用于示例目的.
您的代码出了什么问题,您已经将while循环设置为自由浮动,最重要的是在 GUI的主循环之前.当你这样做时,由于这个循环是无限的,它永远不允许Tkinter启动它mainloop().但是,如果你把while循环后,主循环,那么这将永远不会被执行,直到后退出GUI,这是因为,直到它停止(关闭GUI)的主循环是infinate.
所以要解决这个问题,你只需将它放在一个函数中,稍后在Tkintermainloop中调用它.您也可以通过各种方式执行此操作,例如,您可以.after()在一定时间后执行特定任务,或者按下按钮的命令,等等..
但是,您应该使用的正确代码如下,因为您并不真正想要在代码中使用infinate循环(除了主循环之外):
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6978 次 |
| 最近记录: |