Глава 16 · Создаём классные приложения с Tkinter
Как работает событийный цикл и mainloop
mainloop() — не чёрный ящик и не «замирание»: это цикл, который активно ждёт и обрабатывает события.
Событийный цикл — не Python while True
Что на самом деле происходит внутри mainloop()
Не думайте о
mainloop() как о вашем собственном while True: ... — это внутренний цикл обработки событий Tcl/Tk. Модель ниже — концептуальная, для понимания порядка событий, а не описание реальной реализации.инициализация UI
↓
mainloop()
↓
ожидание / обработка событий
да
↓событие?
вызов обработчика
↓callback
return
↓callback вернулся
↺ назад к ожиданию
↓следующее событие
Порядок событий — предсказуемый, но не последовательный в коде
sobytijnyj_cikl.py
log = []
def on_click(): log.append("click")
def on_timer(): log.append("timer")
def on_type(): log.append("type")
handlers = {"click": on_click, "timer": on_timer, "type": on_type}
def run_event_loop(queue):
for event in queue:
handlers[event]()
run_event_loop(["click", "timer", "type"])
print(log) # ['click', 'timer', 'type']
Реальные события Tkinter приходят по мере действий пользователя и системы — но идея та же: очередь событий обрабатывается по одному, и каждое запускает свой callback.
Долгий callback — это уже отдельная тема
Пока обработчик выполняется, событийный цикл ждёт его завершения, прежде чем перейти к следующему событию. Что происходит, если callback работает слишком долго — подробно в разделах 16.22 и 16.24.
Практика: порядок обработки событий
Проверяется без tkinter — моделируем очередь событий на чистом Python