Глава 16 · Создаём классные приложения с Tkinter
Виджет и дерево интерфейса
Интерфейс — не плоский список элементов, а дерево вложенных контейнеров.
У каждого виджета есть родитель
Виджеты образуют дерево: у каждого, кроме самого корня, есть родитель (master), который определяет контекст размещения и жизненного цикла:
root
menu_bar
main_frame
title_label
name_entry
save_button
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