Почему tkinter.Tk.update () блокируется во время изменения размера окна? - PullRequest
1 голос
/ 05 июня 2019

В настоящее время я работаю с curio и пытаюсь преобразовать обратные вызовы tkinter во что-то, совместимое с асинхронным кодом. Я выяснил большинство вещей, ожидание события, протоколы, но осталось только обновить окно.

Метод tkinter.Tk.update блокируется при изменении размера окна. Это винты мой асинхронный код, так как все должно работать без блокировки. Я не могу запустить это в другой ветке, так как этот ответ отмечает .

Вот некоторый тестовый код, который будет определять время, необходимое для вызова update().

import tkinter
from time import monotonic

window = tkinter.Tk()
try:
    while True:
        started = monotonic()
        window.update() # This is the blocking call
        delta = monotonic() - started
        if delta >= 0.5:
            print(f'{func.__name__} took {delta} seconds to run')

except tkinter.TclError:
    # The window is closed
    pass

Вы можете попробовать изменить размер окна на секунду, и функция печати запустится. Если вы оставите это, ничего не произойдет. Это означает, что цикл обработки событий всегда обрабатывает события изменения размера.

Примечание. Перемещение мыши по экрану не вызовет его, хотя с небольшой модификацией для проверки событий события <Motion> происходят на больше, чем <Configure>.

В настоящее время я могу обойти эту проблему, запустив tkinter.Tk.resizable(False, False), чтобы предотвратить изменение размера. Я бы очень хотел работать без этого ограничения, и меня интересует, почему вызов блокируется. Возможно, есть события, которые обрабатываются внутри цикла событий, но я не уверен.

1 Ответ

1 голос
/ 05 июня 2019

Почему tkinter.Tk.update () блокируется при изменении размера окна?

Я думаю, что ответ заключается в том, что update должен обрабатывать все события в событииочередь перед его возвратом, а изменение размера окна отправляет непрерывный поток событий в очередь событий при перетаскивании края или угла окна.

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