首页 > 解决方案 > 如何在 tkinter 的 while 循环中更新标签?

问题描述

我正在尝试在 while 循环内更新 tkinter 中的窗口标签,但文本没有更新。下面是代码。

from Tkinter import *

window=Tk();
text1=StringVar();
text1.set("Waiting for Button Press...");

def main():
    while True:
          if condition:'''The condition is GPIO READ statement but for simplicity I have used condition'''
             text1.set("IN Button Pressed.Loading Camera.");
             window.update()

lbl=Label(window,text=text1.get());
lbl.pack();
window.after(5000,main);
window.mainloop();

标签: pythontkinterpython-2.x

解决方案


正如我在评论中所说,使用while像你试图做的循环会干扰 Tkinter 自己的mainloop(). 在不停止 Tkinter GUI 的主循环的情况下重复执行某些操作通常是通过使用通用after()方法(您似乎已经知道)来完成的。

此外,如果您将小部件的textvariable=(而不是 if text=)选项设置为,对 Tkinter 变量的更改将自动更新的外观。这是我找到的关于使用Tkinter Variable Classes的一些文档。LabelStringVarLabel

以下示例代码展示了如何通过实施这些建议来实现您的目标:

from random import randint
from Tkinter import *

MS_DELAY = 500  # Milliseconds between updates.

window = Tk()
text1 = StringVar()

def gpio_read():
    """ Simulate GPIO READ. """
    return randint(0, 3)

def check_condition():
    if gpio_read() == 0:
        text1.set("IN Button Pressed.Loading Camera.")
    else:
        text1.set("Waiting for Button Press...")

    window.after(MS_DELAY, check_condition)  # Schedule next check.

lbl = Label(window, textvariable=text1)  # Link to StringVar's value.
lbl.pack()

window.after(MS_DELAY, check_condition)  # Schedule first check.
window.mainloop()

推荐阅读