簡體   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