我正在尝试在while循环内的tkinter中更新窗口的标签,但文本没有更新。下面是代码。
Selector ('.abyss-error-message').withText('Please enter a valid UID')
答案 0 :(得分:1)
要动态更新标签文本,可以使用lbl["text"]
我不能完全遵循您的代码(因为我对此还太陌生...),但是我认为您可以使用它并以这种方式重新编写代码。
from Tkinter import *
window=Tk()
text1 = "Waiting for Button Press..."
lbl=Label(window,text=text1)
lbl.pack()
def main():
while True:
if condition:'''The condition is GPIO READ statement but for simplicity I have used condition'''
lbl["text"] = "IN Button Pressed.Loading Camera."
window.after(5000,main)
window.mainloop()
不确定是否需要window.update()
答案 1 :(得分:1)
正如我在评论中说的那样,像您尝试的那样使用while
循环会干扰Tkinter自己的mainloop()
。重复执行某些操作而不停止Tkinter GUI的主循环通常是通过使用通用after()
方法(您似乎已经知道)来完成的。
此外,如果您将textvariable=
小部件的text=
(而不是Label
)选项设置为StringVar
,则对Tkinter变量的更改将自动更新Label
的外观。这是我发现的有关使用Tkinter Variable Classes的一些文档。
以下示例代码展示了如何通过实施以下建议来实现目标:
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()
答案 2 :(得分:0)
您可以执行以下操作:
condition
设置为False
,并在True
中更改为main
。
5秒钟后,调用change_if_condition
方法,检查condition
,如果找到True
,则更改标签textvariable,并自动更新标签。
from tkinter import *
def change_if_condition():
if condition:
text1.set("IN Button Pressed.Loading Camera.")
def main():
global condition
condition= True
window.after(5000, change_if_condition)
window = Tk()
text1 = StringVar()
text1.set("Waiting for Button Press...")
lbl = Label(window, textvariable=text1) # use textvariable, so the displayed text is changed when the variable changes
lbl.pack()
condition = False
main()
window.mainloop()