Глава 16 · Создаём классные приложения с Tkinter

Как работает событийный цикл и mainloop

mainloop() — не чёрный ящик и не «замирание»: это цикл, который активно ждёт и обрабатывает события.

Событийный цикл — не Python while True

Что на самом деле происходит внутри mainloop()
Не думайте о mainloop() как о вашем собственном while True: ... — это внутренний цикл обработки событий Tcl/Tk. Модель ниже — концептуальная, для понимания порядка событий, а не описание реальной реализации.
инициализация UI
mainloop()
ожидание / обработка событий
да
событие?
вызов обработчика
callback
return
callback вернулся
↺ назад к ожиданию
следующее событие
Событийный цикл: инициализация → mainloop → ожидание → диспетчеризация → снова ожидание.

Порядок событий — предсказуемый, но не последовательный в коде

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
Открыть практику →