python - 如何在 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();
解决方案
正如我在评论中所说,使用while
像你试图做的循环会干扰 Tkinter 自己的mainloop()
. 在不停止 Tkinter GUI 的主循环的情况下重复执行某些操作通常是通过使用通用after()
方法(您似乎已经知道)来完成的。
此外,如果您将小部件的textvariable=
(而不是 if text=
)选项设置为,对 Tkinter 变量的更改将自动更新的外观。这是我找到的关于使用Tkinter Variable Classes的一些文档。Label
StringVar
Label
以下示例代码展示了如何通过实施这些建议来实现您的目标:
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()
推荐阅读
- spring-boot - 未调用订阅映射
- android - TabLayout 选项卡标题未显示在 Android Studio 中
- redis - 在 Redis 的单个命令中使用带有 TTL 的 RPUSH
- typescript - 如果我修改它的单个元素,数组不会反应
- websocket - JMeter 中的 Signalr 负载测试
- javascript - Javascript FORTNITE API 请求
- xml - 如何在 XML 中定义前缀并在 XSL 中使用它们?
- javascript - 如何复制部分json?
- webrtc - WebRTC 中 STUN/TURN(coTURN) 服务器和信令服务器(用 socket.io/websocket 编写)之间的区别?
- c++ - 带类的默认模板参数