[英]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.