Почему wait_variable не работает в моем коде, как ожидается? - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь заставить программу 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, должно появиться второе окно сообщения.Но они никогда не делают.

Чего мне здесь не хватает?

1 Ответ

1 голос
/ 03 июля 2019

Чтобы my_var работал как положено, вы должны изменить свой звонок на root.wait_variable с:

root.wait_variable('my_var')

на

root.wait_variable(my_var)

Кроме этого, вы, вероятно,необходимо поместить логику завершения потока внутри самого протектора, иначе он продолжит свою итерацию до тех пор, пока это не будет сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...