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

Frame и LabelFrame: организуем интерфейс

Прежде чем размещать десятки виджетов, разбейте окно на понятные регионы.

Frame — структура прежде компоновки

ttk.Frame — контейнер без собственного видимого содержимого, который группирует связанные виджеты в осмысленные регионы:

root
toolbar_frame
content_frame
status_frame
Разбиение окна на именованные регионы упрощает и код, и мышление о layout.
frame.py
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

toolbar_frame = ttk.Frame(root)
content_frame = ttk.Frame(root)
status_frame = ttk.Frame(root)

toolbar_frame.pack(side="top", fill="x")
content_frame.pack(side="top", fill="both", expand=True)
status_frame.pack(side="bottom", fill="x")

Внутри каждого фрейма можно независимо использовать pack() или grid() — правило «не смешивать» действует в пределах одного родителя, а не всего окна (подробная схема — в разделе 16.15).

LabelFrame — визуально подписанная группа

Верхняя панель с кнопками Открыть/Сохранить, ниже — подписанная рамка «Настройки» с двумя флажками
Toolbar через Frame (без рамки) и LabelFrame с видимой подписью «Настройки». Пример внешнего вида на среде курса. На вашей ОС шрифты, размеры и тема могут немного отличаться.
labelframe.py
nastrojki = ttk.LabelFrame(root, text="Настройки")
nastrojki.pack(padx=10, pady=10, fill="x")

ttk.Checkbutton(nastrojki, text="Тёмная тема").pack(anchor="w")
LabelFrame — не для каждой мелочи
Используйте LabelFrame для действительно связанной группы настроек, а не для каждого отдельного виджета — иначе интерфейс превращается в лестницу рамочек.
Практика: организуем интерфейс через Frame
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →