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

Messagebox и диалоги

Пользователь должен узнавать об успехе, предупреждении или ошибке — не из терминала.

messagebox — стандартные диалоги уведомлений

messagebox.py
from tkinter import messagebox

messagebox.showinfo("Готово", "Файл сохранён.")
messagebox.showwarning("Внимание", "Поле пустое.")
messagebox.showerror("Ошибка", "Не удалось прочитать файл.")
🔶 Схематическое изображение (не реальный скриншот)
Готово
ℹ️ Файл сохранён.
OK
Внимание
⚠️ Поле пустое.
OK
Ошибка
Не удалось прочитать файл.
OK
Три типа уведомлений — разная иконка и смысл, один и тот же принцип вызова.
Внешний вид диалогов зависит от ОС
Настоящий вид этих диалогов зависит от операционной системы, версии 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
Практика выполняется локально
Открыть практику →