我正在尝试让tkinter程序在函数执行的中间等待,等到变量在单独的线程中更改后再继续。提供的代码不是实际的任务,这是我试图理解wait_variable
并使其至少以某种方式起作用。
任务本身实际上是这样的:我试图让我的代码等到Windows服务状态更改后再继续。所以我用了this代码,我需要等到状态改变。
这是我尝试使其工作时编写的代码:
import time
import tkinter as tk
from threading import Thread
from tkinter import messagebox
def test():
my_var = tk.IntVar()
my_var.set(1)
label_2 = tk.Label(textvariable=my_var)
label_2.pack()
def wait_for_var():
nonlocal my_var
for i in range(5):
label.config(text='iteration {}'.format(i))
time.sleep(1)
my_var.set(1)
my_var.set(2)
Thread(target=wait_for_var).start()
while my_var.get() != 2:
root.wait_variable('my_var')
messagebox.showinfo('aha!', 'my_var changed!')
messagebox.showinfo('done!', 'done!')
root = tk.Tk()
root.geometry('800x600')
text = 'init'
label = tk.Label(text='init')
label.pack()
btn = tk.Button(text='click me', command=test)
btn.pack()
root.mainloop()
我希望程序在while
的值更改为my_var
时退出2
循环。但是由于某种原因,它永久地停留在那里,即使关闭主窗口,它似乎也不会退出wait_variable
。我偶然发现了this和this的问题,但我认为事实并非如此。这些问题的问题在于变量没有改变。在我的代码中my_var
实际上正在更改,可以在第二个标签中看到它。但是再也不会执行。正如wait_variable
description所说:“将其设置为当前值也很重要”。
因此,这意味着,在第二个线程内的每次迭代之后,当将其重新分配给相同的值时,应该显示第一个消息框。并且在my_var
的值更改为2
之后,-应该会显示第二个消息框。但是他们从来没有。
我在这里想念什么?
答案 0 :(得分:1)
为了使my_var
正常工作,您必须将呼叫从以下位置更改为root.wait_variable
:
root.wait_variable('my_var')
到
root.wait_variable(my_var)
除此之外,您可能需要将终止线程的逻辑放在胎面本身内部,否则它将继续其迭代直到完成。