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