Библиотека tkinter: диалоговые окна messagebox

Раздел: Библиотеки -> Графический интерфейс

Основные методы messagebox

Как вывести простое информационное сообщение?

Для отображения окна с информацией используется функция showinfo из модуля tkinter.messagebox. Эта функция не возвращает полезного значения, только закрывает окно при нажатии OK.


import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.withdraw()  # скрыть главное окно
messagebox.showinfo("Заголовок", "Текст сообщения")
root.destroy()
    

вывод окна python (создание окна с выводом в python)

В примере создается скрытое окно (чтобы было кому принадлежать), затем вызывается showinfo. После закрытия окна программа завершается.

Этот метод подходит для уведомлений, которые не требуют ответа от пользователя.

Как отобразить предупреждение?

Функция showwarning работает аналогично, но с иконкой предупреждения.


messagebox.showwarning("Предупреждение", "Проверьте введенные данные")
    

открыть окно python (открыть окно на python)

Возвращаемое значение отсутствует, окно закрывается по OK.

Как показать сообщение об ошибке?

Функция showerror выводит окно с крестиком.


messagebox.showerror("Ошибка", "Не удалось сохранить файл")
    

Python окно (создание окон в python tkinter)

Как задать вопрос с выбором Да/Нет?

Для получения ответа используется askyesno. Возвращает True (Да) или False (Нет).


result = messagebox.askyesno("Вопрос", "Вы уверены?")
if result:
    print("Пользователь выбрал Да")
else:
    print("Пользователь выбрал Нет")
    

Python tkinter canvas (холст canvas в tkinter)

Этот вариант подходит для подтверждения действий.

Как получить ответ в виде строки?

askquestion возвращает строку "yes" или "no".


answer = messagebox.askquestion("Вопрос", "Продолжить выполнение?")
if answer == "yes":
    print("Продолжаем")
    

Python tkinter frame (фрейм frame в tkinter)

Как задать вопрос с кнопками OK/Отмена?

askokcancel возвращает True (OK) или False (Отмена).


if messagebox.askokcancel("Подтверждение", "Закрыть окно?"):
    root.destroy()
    

Python tkinter messagebox (messagebox в tkinter)

Как предложить повторить действие?

askretrycancel возвращает True (Повторить) или False (Отмена).


if messagebox.askretrycancel("Неудача", "Повторить попытку?"):
    print("Повтор")
    

Tkinter python ввод (ввод данных в tkinter)

Как сделать три варианта выбора?

askyesnocancel возвращает True (Да), False (Нет) или None (Отмена).


choice = messagebox.askyesnocancel("Подтверждение", "Сохранить изменения?")
if choice is None:
    print("Отмена")
elif choice:
    print("Сохраняем")
else:
    print("Не сохраняем")
    

Типичные ошибки и их решения

Ошибка: NameError: name 'messagebox' is not defined:

Часто забывают импортировать модуль. Правильно: from tkinter import messagebox или import tkinter.messagebox.

Ошибка: окно не появляется, программа зависает:

Для отображения messagebox необходимо корневое окно. Если его нет, можно создать скрытое: root = tk.Tk(); root.withdraw(). После завершения диалогов окно можно закрыть.

Проблема: русские символы отображаются некорректно:

В Python 3 кодировка UTF-8 работает по умолчанию, но если текст содержит специфические символы, стоит проверить файл на кодировку.

Возвращаемое значение: путаница между True/False и "yes"/"no":

Запоминайте соответствие: askyesno, askokcancel, askretrycancel возвращают bool; askquestion возвращает строку; askyesnocancel возвращает bool или None.

- Python tkinter игра (игра на tkinter)
- Python калькулятор tkinter (калькулятор на tkinter)
- Python tkinter root (главное окно tkinter (root))

Расширенные примеры работы с messagebox

Пример 1: Настройка иконки и кнопки по умолчанию

Параметр icon позволяет задать иконку (info, warning, error, question). Параметр default задает кнопку, которая получает фокус (messagebox.NO, messagebox.CANCEL и т.д.).

Пример

from tkinter import messagebox
# Вопрос с иконкой ошибки и кнопкой "Нет" по умолчанию
result = messagebox.askyesno("Ошибка!", "Продолжить?",
                             icon='error', default=messagebox.NO)
print("Результат:", result)
Окно отобразится с иконкой ошибки, фокус будет на кнопке "Нет". Значение переменной result будет True или False в зависимости от нажатия.

Пример 2: Привязка к родительскому окну

Если передать параметр parent, окно messagebox будет модальным по отношению к родителю, блокируя его.

Пример

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.geometry("300x200")
def on_click():
    result = messagebox.askquestion("Вопрос", "Закрыть окно?",
                                    parent=root)
    if result == "yes":
        root.destroy()
tk.Button(root, text="Нажми меня", command=on_click).pack()
root.mainloop()
При нажатии кнопки появляется диалог, который блокирует главное окно до закрытия. После выбора главное окно может быть закрыто.

Пример 3: Использование внутри класса

Пример инкапсуляции вызова messagebox в методе класса.

Пример

import tkinter as tk
from tkinter import messagebox

class App:
    def __init__(self):
        self.root = tk.Tk()
        self.root.withdraw()
    def ask(self):
        return messagebox.askyesno("Выход", "Точно выйти?")
    def run(self):
        if self.ask():
            self.root.destroy()
        else:
            print("Продолжаем")
app = App()
app.run()  # вызов без mainloop (нет реального окна)
Диалог отобразится, после выбора программа завершится или выведет сообщение.

Пример 4: Комбинация диалогов

Цепочка: сначала askyesno, затем, если Да, showinfo.

Пример

from tkinter import messagebox
if messagebox.askyesno("Подтверждение", "Сохранить файл?"):
    messagebox.showinfo("Готово", "Файл сохранен")
else:
    messagebox.showwarning("Отмена", "Сохранение отменено")
В зависимости от выбора появится соответствующее окно.

Пример 5: Использование параметра type для выбора набора кнопок

Для функций askquestion и askyesnocancel можно указать type. Например, type="yesnocancel" даёт три кнопки даже для askquestion.

Пример

from tkinter import messagebox
# askquestion с типом "yesnocancel" возвращает "yes", "no" или "cancel"
result = messagebox.askquestion("Выбор", "Что делаем?",
                                type="yesnocancel")
print(result)
Окно с тремя кнопками: Да, Нет, Отмена. Возвращает соответствующую строку.

Пример 6: Многострочный текст и перенос

Текст может содержать символы новой строки \n.

Пример

messagebox.showinfo("Информация", "Строка 1\nСтрока 2\nСтрока 3")
Окно отобразит три строки текста.

MessageBox в tkinter - comments

En
Python tkinter messagebox (python)