Глава 16 · Создаём классные приложения с Tkinter
Messagebox и диалоги
Пользователь должен узнавать об успехе, предупреждении или ошибке — не из терминала.
messagebox — стандартные диалоги уведомлений
messagebox.py
from tkinter import messagebox
messagebox.showinfo("Готово", "Файл сохранён.")
messagebox.showwarning("Внимание", "Поле пустое.")
messagebox.showerror("Ошибка", "Не удалось прочитать файл.")
🔶 Схематическое изображение (не реальный скриншот)
Внешний вид диалогов зависит от ОС
Настоящий вид этих диалогов зависит от операционной системы, версии Tk и выбранной темы — точную нативную картинку headless-среда курса не может воспроизвести стабильно, поэтому здесь используется схематическое изображение, а не скриншот.
Диалоги с двумя вариантами — читайте возвращаемое значение
messagebox_yesno.py
soglasen = messagebox.askyesno("Подтверждение", "Удалить эту заметку?")
if soglasen:
udalit_zametku()
Не угадывайте результат по названию кнопки
Не предполагайте заранее, что вернёт диалог — читайте фактическое возвращаемое значение (
True/False для askyesno) и реагируйте на него, а не на предположение «пользователь наверняка нажмёт да».Три исхода: Да / Нет / Отмена
Для сценария «выход с несохранёнными изменениями» одного «да/нет» мало — пользователь может передумать закрывать программу вообще:
messagebox_yesnocancel.py
answer = messagebox.askyesnocancel(
"Несохранённые изменения",
"Сохранить изменения перед выходом?",
)
if answer is None:
pass # Отмена — не выходим вообще, пользователь передумал
elif answer:
save_document()
root.destroy()
else:
root.destroy() # Нет — выходим, не сохраняя
| Возвращённое значение | Что нажал пользователь |
|---|---|
True | Да |
False | Нет |
None | Отмена (или закрыл диалог крестиком) |
Частая ошибка — перепутать Да/Нет с сохранить/закрыть
«Да» отвечает на вопрос «сохранить?», а не «выйти?». Не пишите
if answer: save() else: root.destroy() — тогда «Нет» молча закроет окно, даже не спросив, а «Да» сохранит, но не закроет. Полную рабочую версию для реального редактора — с учётом обоих действий и отмены — смотрите в разделе 16.30.Модальность
Стандартные диалоги
messagebox — модальные: они блокируют взаимодействие с остальным приложением, пока не будут закрыты. Для собственных модальных окон есть более тонкие инструменты (transient, grab_set) — раздел 16.20, помечены как продвинутые.Практика: messagebox и диалоги выбора
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально