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

Toplevel: несколько окон

Настоящему приложению почти всегда нужно больше одного окна — но не больше одного root.

Toplevel — дополнительное окно

Главное окно приложения и отдельное окно настроек рядом
Toplevel — это отдельное настоящее окно, а не панель внутри главного. Пример внешнего вида на среде курса. На вашей ОС шрифты, размеры и тема могут немного отличаться.

Для второго окна (настройки, «О программе», диалог) используется tk.Toplevel:

toplevel.py
def otkryt_nastrojki():
    okno_nastrojek = tk.Toplevel(root)
    okno_nastrojek.title("Настройки")
    ttk.Label(okno_nastrojek, text="Здесь будут настройки").pack(padx=20, pady=20)

ttk.Button(root, text="Настройки", command=otkryt_nastrojki).pack()
root : Tkokno_nastrojek :ToplevelСОЗДАЁТ
Один root, дополнительные окна — через Toplevel
Для обычного приложения используется один корневой Tk(), а дополнительные окна создаются через Toplevel. Технически создать несколько независимых Tk() возможно — каждый заводит свой отдельный интерпретатор Tcl, — но для обычного единого приложения это обычно не то, что нужно, и не рекомендуемая структура. Практическое правило: одно приложение → один root → Toplevel для остальных окон.

Некоторые диалоги должны блокировать взаимодействие с родительским окном, пока не будут закрыты:

modalnoe_okno.py
okno = tk.Toplevel(root)
okno.transient(root)     # окно принадлежит родителю визуально
okno.grab_set()          # забирает весь ввод, пока не закрыто
root.wait_window(okno)   # родитель ждёт закрытия этого окна
Не обязательно на старте
Собственные модальные окна — продвинутая техника. Для большинства учебных и небольших приложений обычного Toplevel без grab_set() вполне достаточно.
Практика: окно настроек через Toplevel
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →