【发布时间】:2019-07-02 12:14:23
【问题描述】:
我试图让 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()
当my_var 将其值更改为2 时,我希望程序退出while 循环。但由于某种原因,它永远卡在那里,即使在主窗口关闭后,它似乎也没有退出wait_variable。我偶然发现了this 和this 关于它的问题,但我认为情况并非如此。这些问题的问题在于变量不变。在我的代码中,my_var 实际上正在发生变化,可以在第二个标签中看到。但进一步的执行永远不会发生。正如wait_variable description 声称的那样:“将其设置为当前值也很重要”。
所以这意味着,在第二个线程内的每次迭代之后,当它被重新分配给相同的值时 - 第一个消息框应该出现。在my_var 值更改为2 之后,应该会出现第二个消息框。但他们从不这样做。
我在这里错过了什么?
【问题讨论】:
标签: python python-3.x windows tkinter