繁体   English   中英

为什么wait_variable在我的代码中无法按预期工作?

[英]Why doesn't wait_variable work in my code as expected?

我试图使tkinter程序在函数执行的中间等待,等到变量在单独的线程中更改后再继续。 提供的代码不是实际的任务,这是我试图理解wait_variable并使它至少以某种方式工作的尝试。

任务本身就是这样:我试图让我的代码等待,直到Windows服务状态更改,然后继续。 因此,我使用了这段代码,我需要等到状态更改。

这是我尝试使其工作时编写的代码:

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 我偶然发现了这个这个疑问的,但我认为这仍然不是这样。 这些问题的问题在于变量没有改变。 在我的代码中, my_var实际上正在更改,可以在第二个标签中看到。 但是再也不会执行。 正如wait_variable 描述所声称的:“将其设置为当前值也很重要”。 因此,这意味着,在第二个线程内的每次迭代之后,当将其重新分配给相同的值时,应该显示第一个消息框。 my_var值更改为2 ,-第二个消息框应显示。 但是他们从不这样做。

我在这里想念什么?

为了使my_var正常工作,必须root.wait_variable的调用从以下位置更改:

root.wait_variable('my_var')

root.wait_variable(my_var)

除此之外,您可能需要将终止线程的逻辑放在踏步本身内部,否则它将继续其迭代直到完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM