Я пытаюсь заставить программу 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()
Я ожидал, что программа выйдет из цикла while
, когда my_var
изменит свое значение на 2
.Но по какой-то причине он застрял там навсегда и, похоже, не выходит wait_variable
даже после закрытия главного окна.Я наткнулся на этот и этот вопрос об этом, но я думаю, что это все еще не так.Проблема в тех вопросах была в том, что переменная не менялась.В моем коде my_var
на самом деле меняется, и это можно увидеть на втором ярлыке.Но дальнейшее исполнение никогда не происходит.Как утверждает wait_variable
description : «установка его на текущее значение также имеет значение».Таким образом, это означает, что после каждой итерации во втором потоке, когда он переназначается на одно и то же значение, должно появиться первое окно сообщения.И после того, как значение my_var
изменится на 2
, должно появиться второе окно сообщения.Но они никогда не делают.
Чего мне здесь не хватает?