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

Меню

Настоящее приложение почти всегда начинается с меню в верхней части окна.

Настоящее приложение редко обходится без меню в верхней части окна. В Tkinter меню строится из объекта Menu:

menu.py
import tkinter as tk

root = tk.Tk()

def novyj_fajl():
    print("Создаём новый файл...")

menu_bar = tk.Menu(root)
fajl_menu = tk.Menu(menu_bar, tearoff=0)
fajl_menu.add_command(label="Новый", command=novyj_fajl)
fajl_menu.add_separator()
fajl_menu.add_command(label="Выход", command=root.destroy)
menu_bar.add_cascade(label="Файл", menu=fajl_menu)

root.config(menu=menu_bar)
root.mainloop()
🔶 Схематическое изображение (не реальный скриншот)
Файл
Правка
Помощь
Новый
Открыть...
Сохранить
Выход
Внешний вид меню зависит от ОС
Настоящий вид строки меню и открытого меню зависит от операционной системы, версии Tk и темы — курс не может воспроизвести headless-скриншот этого элемента стабильно во всех средах, поэтому здесь используется схематическое изображение с точной структурой (строка меню → пункт → открытое меню → пункты → разделитель), а не фотографический скриншот.
tearoff=0
По умолчанию Tkinter добавляет в начало каждого меню пунктирную линию, позволяющую «оторвать» меню в отдельное окно. tearoff=0 отключает именно эту возможность отрывать меню — если в вашем интерфейсе она не нужна (а обычно не нужна), это частый и осознанный выбор, а не универсальное правило «всегда так делай».

root.quit() против root.destroy()

МетодЧто делает
root.quit()останавливает текущий mainloop() — но само окно и виджеты остаются существовать
root.destroy()уничтожает окно и всё дерево виджетов целиком, также останавливая mainloop()
Это не взаимозаменяемые синонимы
root.quit() просит текущий mainloop() завершиться — сам объект root и виджеты при этом не уничтожаются. root.destroy() идёт дальше: уничтожает дерево виджетов и само окно, что тоже останавливает mainloop(). Ни один из них не завершает сам процесс Python напрямую — после возврата из mainloop() код теоретически может продолжаться (например, что-то сохранить перед выходом); процесс завершается позже, естественным образом, если после этого просто не осталось кода. Для обычного пункта меню «Выход» в этом курсе понятнее и надёжнее root.destroy.

Акселераторы — это надпись, не привязка клавиш

accelerator.py
fajl_menu.add_command(label="Сохранить", accelerator="Ctrl+S", command=sohranit)
accelerator сам по себе не создаёт горячую клавишу
accelerator="Ctrl+S" лишь выводит текст подсказки рядом с пунктом меню. Он не связывает автоматически комбинацию клавиш с командой — для этого нужен отдельный механизм привязки событий (.bind(...)), который подробно разберём в главе 17.
Практика: строим меню приложения
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →