Python tkinter:在Label中循环

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)

谢谢

IT *_*nja 6

试试这个:

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)