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

Виджет и дерево интерфейса

Интерфейс — не плоский список элементов, а дерево вложенных контейнеров.

У каждого виджета есть родитель

Виджеты образуют дерево: у каждого, кроме самого корня, есть родитель (master), который определяет контекст размещения и жизненного цикла:

root
menu_bar
main_frame
title_label
name_entry
save_button
Типичное дерево небольшого приложения: root → main_frame → отдельные виджеты формы.
derevo_widgetov.py
import tkinter as tk

root = tk.Tk()
main_frame = tk.Frame(root)
main_frame.pack()

title_label = tk.Label(main_frame, text="Форма")
title_label.pack()
name_entry = tk.Entry(main_frame)
name_entry.pack()

Первый аргумент почти любого виджета — его родитель (main_frame выше). Родитель определяет, в каком контейнере разместится виджет — подробно про Frame в разделе 16.13.

Жизненный цикл виджета

создан
configure(...)
настроен
.pack() / .grid() / .place()
размещён
интерактивен
.destroy()
уничтожен
Создание виджета создаёт сам объект; менеджер геометрии включает его в раскладку окна.
Создание — это создание объекта, размещение — это раскладка
Создание виджета (tk.Button(...)) создаёт сам Python-объект — как и создание любого другого объекта (глава 14). Менеджер геометрии (pack, grid или place) включает этот объект в раскладку окна, чтобы пользователь мог его увидеть и с ним взаимодействовать. Объект существует в обоих случаях — различается лишь то, участвует ли он в раскладке видимого окна.
destroy() — не единственный способ скрыть виджет
.destroy() уничтожает виджет безвозвратно. Если нужно лишь временно убрать виджет с экрана, есть более лёгкие варианты (например, .grid_remove()) — но для большинства первых приложений деструктивное удаление ненужных виджетов и есть правильный выбор.
Практика: дерево виджетов как данные
Проверяется без tkinter — моделируем дерево вложенными данными Python
Открыть практику →