Глава 16 · Создаём классные приложения с Tkinter
Toplevel: несколько окон
Настоящему приложению почти всегда нужно больше одного окна — но не больше одного root.
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, дополнительные окна — через 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
Практика выполняется локально