Итоги главы: инструментарий Tkinter
От «программа ждёт событий, а не выполняется по порядку» до класса приложения с персистентными настройками.
Визуальный контакт-лист виджетов
Прежде чем выбирать по названию — вспомните, как это выглядит:










Инструментарий Tkinter
Последовательное внутри событийного
Точная формулировка важнее эффектной: инициализационный код по-прежнему выполняется последовательно, строка за строкой — и каждый отдельный callback тоже выполняется последовательно, когда его вызывают. Меняется не это, а общая модель управления: именно событийный цикл решает, какой callback будет вызван следующим, в ответ на событие — а не сам код, идущий одной сплошной линией сверху вниз.
Что дальше
Мы теперь умеем: строить root и дерево виджетов, связывать callback через
command, компоновать формы через pack
и адаптивный grid, хранить общее состояние в Tk-переменных,
показывать диалоги, открывать/сохранять файлы, планировать отложенные вызовы через
after() и собирать всё в класс приложения с персистентными
настройками.
В главе 17 («Проект: игра «Крестики-нолики» с Tkinter») мы построим полноценную игру — и
познакомимся с более общим механизмом привязки событий,
.bind("<Button-1>", ...), который реагирует на клик в
любом месте виджета (например, на конкретную клетку холста), а не только на предопределённое
действие вроде command у кнопки.
Что мы узнали в этой главе
- Инициализация и каждый callback по-прежнему выполняются последовательно — меняется общая модель управления: событийный цикл решает, какой callback вызвать следующим, в ответ на события.
root.mainloop()запускает цикл обработки событий, а не «замирает» — программа остаётся отзывчивой.command=функциясвязывает callback с виджетом — без скобок после имени функции.- Каждый виджет создаётся, настраивается и отдельно размещается менеджером геометрии —
pack(),grid()илиplace(), но не смешивая pack/grid в одном родителе. - ttk даёт тематизированные виджеты и стилизацию через
ttk.Style()— но не заменяет tk.Text/Canvas/Menu. - Tk-переменные (StringVar и другие) связывают несколько виджетов с одним значением — и не заменяют обычные переменные Python.
- messagebox и filedialog возвращают реальные значения, которые нужно проверять (в том числе на отмену), а не предполагать.
after()планирует отложенный или повторяющийся вызов без блокировки —time.sleep()в callback замораживает весь интерфейс.- Доменную логику стоит писать как чистые функции, проверяемые без единого виджета — callback лишь читает ввод, вызывает логику и обновляет экран.
- Персистентные настройки GUI-приложения используют те же функции JSON+pathlib, что и глава 15 — ничего принципиально нового.