Последнее обновление: 24.09.2022
Окна сообщений
Tkinter имеет ряд встроенных окон для разных ситуаций, в частности, окна сообщений, функционал которых заключен в модуле tkinter.messagebox.
Для отображения сообщений этот модуль предоставляет следующие функции:
-
showinfo(): предназначена для отображения некоторой информации
-
showerror(): предназначена для отображения ошибок
-
showwarrning(): предназначена для отображения предупреждений
Все эти функции принимают три параметра:
showinfo(title, message, **options) showerror(title, message, **options) showwarrning(title, message, **options)
-
title: заголовок окна
-
message: отображаемое сообщение
-
options: настройки окна
В реальности различие между этими типами сообщений заключается лишь в изображении, которое отображается рядом с текстом сообщения:
from tkinter import * from tkinter import ttk from tkinter.messagebox import showerror, showwarning, showinfo root = Tk() root.title("METANIT.COM") root.geometry("250x200") def open_info(): showinfo(title="Информация", message="Информационное сообщение") def open_warning(): showwarning(title="Предупреждение", message="Сообщение о предупреждении") def open_error(): showerror(title="Ошибка", message="Сообщение об ошибке") info_button = ttk.Button(text="Информация", command=open_info) info_button.pack(anchor="center", expand=1) warning_button = ttk.Button(text="Предупреждение", command=open_warning) warning_button.pack(anchor="center", expand=1) error_button = ttk.Button(text="Ошибка", command=open_error) error_button.pack(anchor="center", expand=1) root.mainloop()
Здесь по нажатию на каждую из трех кнопок отображается соответствующее сообщение:
Окна подтверждения операции
Модуль tkinter.messagebox также предоставляет ряд функций для подтверждения операции, где пользователю предлагается
нажать на одну из двух кнопок:
-
askyesno()
-
askokcancel()
-
askretrycancel()
Все эти функции принимают те же три параметра title, message и options. Отличие между ними только в том, что кнопки имеют разный текст. В случае нажатия на кнопку подтверждения, функция возвращает значение True
, иначе возвращается False
from tkinter import * from tkinter import ttk from tkinter.messagebox import showinfo, askyesno root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): result = askyesno(title="Подтвержение операции", message="Подтвердить операцию?") if result: showinfo("Результат", "Операция подтверждена") else: showinfo("Результат", "Операция отменена") ttk.Button(text="Click", command=click).pack(anchor="center", expand=1) root.mainloop()
В данном случае по нажатию на кнопку вызывается функция askyesno()
, которая отображает диалоговое окно с двумя кнопками «Да» и «Нет».
В зависимости от того, на какую кнопку нажмет пользователь, функция возвратит True или False. Получив результат функции, мы можем проверить его и выполнить те или иные действия.
Особняком стоит функция askquestion — она также отображает две кнопки для подтверждения или отмены действия (кнопки «Yes»(Да) и «No»(Нет)),
но в зависимости от нажатой кнопки возвращает строку: «yes» или «no».
Также отдельно стоит функция askyesnocancel() — она отображает три кнопки: Yes (возвращает True), No (возвращает False) и Cancel
(возвращает None):
from tkinter import * from tkinter import ttk from tkinter.messagebox import showinfo, askyesnocancel root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): result = askyesnocancel(title="Подтвержение операции", message="Подтвердить операцию?") if result==None: showinfo("Результат", "Операция приостановлена") elif result: showinfo("Результат", "Операция подтверждена") else : showinfo("Результат", "Операция отменена") ttk.Button(text="Click", command=click).pack(anchor="center", expand=1) root.mainloop()
В этом случае диалоговое окно предоставит выбор из трех альтернатив
Настройка окон
Дополнительно все вышерассмотренные функции принимают ряд параметров, которые могут применяться для настройки окон. Некоторые из них:
-
detail
: дополнительный текст, который отображается под основным сообщением -
icon
: иконка, которая отображается рядом с сообщением. Должна представлять одно из втроенных изображений: info, error, question или warning -
default
: кнопка по умолчанию. Должна представлять одно из встроенных значений: abort, retry, ignore, ok, cancel, no, yes
from tkinter import * from tkinter import ttk from tkinter.messagebox import OK, INFO, showinfo root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): showinfo(title="METANIT.COM", message="Добро пожаловать на сайт METANIT.COM", detail="Hello World!", icon=INFO, default=OK) ttk.Button(text="Click", command=click).pack(anchor="center", expand=1) root.mainloop()
При нажатии на кнопку отобразится следующее окно:
Скачайте код уроков с GitLab: https://gitlab.com/PythonRu/tkinter-uroki
Окна уведомлений
Распространенный сценарий применения диалоговых окон — уведомление пользователей о событиях, которые происходят в приложении: сделана новая запись или произошла ошибка при попытке открыть файл. Рассмотрим базовые функции Tkinter, предназначенные для отображения диалоговых окон.
В этой программе будет три кнопки, где каждая показывает определенное окно со своим статическим названием и сообщением. Сам по себе этот тип окон имеет лишь кнопку для подтверждения о прочтении и закрытия:
При запуске этого примера стоит обратить внимание на то, что каждое окно воспроизводит соответствующий платформе звук и показывает перевод метки в зависимости от языка системы:
Эти диалоговые окна открываются с помощью функций showinfo
, showwarning
и showerror
из модуля tkinter.messagebox
:
import tkinter as tk
import tkinter.messagebox as mb
class App(tk.Tk):
def __init__(self):
super().__init__()
btn_info = tk.Button(self, text="Информационное окно",
command=self.show_info)
btn_warn = tk.Button(self, text="Окно с предупреждением",
command=self.show_warning)
btn_error = tk.Button(self, text="Окно с ошибкой",
command=self.show_error)
opts = {'padx': 40, 'pady': 5, 'expand': True, 'fill': tk.BOTH}
btn_info.pack(**opts)
btn_warn.pack(**opts)
btn_error.pack(**opts)
def show_info(self):
msg = "Ваши настройки сохранены"
mb.showinfo("Информация", msg)
def show_warning(self):
msg = "Временные файлы удалены не правильно"
mb.showwarning("Предупреждение", msg)
def show_error(self):
msg = "Приложение обнаружило неизвестную ошибку"
mb.showerror("Ошибка", msg)
if __name__ == "__main__":
app = App()
app.mainloop()
Как работают окна с уведомлениями
В первую очередь нужно импортировать модуль tkinter.messagebox
, задав для него алиас mb
. В Python2 этот модуль назывался tkMessageBox
, поэтому такой синтаксис позволит изолировать проблемы совместимости.
Каждое окно обычно выбирается в зависимости от информации, которую нужно показать пользователю:
showinfo
— операция была завершена успешно,showwarning
— операция была завершена, но что-то пошло не так, как планировалось,showerror
— операция не была завершена из-за ошибки.
Все три функции получают две строки в качестве входящих аргументов: заголовок и сообщение.
Сообщение может быть выведено на нескольких строках с помощью символа новой строки n
.
Окна выбора ответа
Другие типы диалоговых окон в Tkinter используются для запроса подтверждения от пользователя. Это нужно, например, при сохранении файла или перезаписывании существующего.
Эти окна отличаются от ранее рассмотренных тем, что значения, возвращаемые функцией, зависят от кнопки, по которой кликнул пользователь. Это позволяет взаимодействовать с программой: продолжать или же отменять действие.
В этой программе рассмотрим остальные диалоговые функции из модуля tkinter.messagebox
. Каждая кнопка включает метки с описанием типа окна, которое откроется при нажатии:
У них есть кое-какие отличия, поэтому стоит попробовать каждое из окон, чтобы разобраться в них.
Как и в прошлом примере сначала нужно импортировать tkinter.messagebox
с помощью синтаксиса import … as
и вызывать каждую из функций вместе с title
и message
:
import tkinter as tk
import tkinter.messagebox as mb
class App(tk.Tk):
def __init__(self):
super().__init__()
self.create_button(mb.askyesno, "Спросить Да/Нет",
"Вернет True или False")
self.create_button(mb.askquestion, "Задать вопрос ",
"Вернет 'yes' или 'no'")
self.create_button(mb.askokcancel, "Спросить Ок/Отмена",
"Вернет True или False")
self.create_button(mb.askretrycancel, "Спросить Повтор/Отмена",
"Вернет True или False")
self.create_button(mb.askyesnocancel, "Спросить Да/Нет/Отмена",
"Вернет True, False или None")
def create_button(self, dialog, title, message):
command = lambda: print(dialog(title, message))
btn = tk.Button(self, text=title, command=command)
btn.pack(padx=40, pady=5, expand=True, fill=tk.BOTH)
if __name__ == "__main__":
app = App()
app.mainloop()
Как работают вопросительные окна
Чтобы избежать повторений при создании экземпляра кнопки и функции обратного вызова определим метод create_button
, который будет переиспользоваться для каждой кнопки с диалогами. Команды всего лишь выводят результат функции dialog
, переданной в качестве параметра, что позволит видеть значение, которое она возвращает в зависимости от нажатой пользователем кнопки.
Выбор файлов и папок
Диалоговые окна для выбора файлов позволяют выбирать один или несколько файлов из файловой системы. В Tkinter эти функции объявлены в модуле tkinter.filedialog
, который также включает окна для выбора папок. Он также позволяет настраивать поведение нового окна: например, фильтрация по расширению или выбор папки по умолчанию.
В этом приложении будет две кнопки. Первая, «Выбрать файл», откроет диалоговое окно для выбора файла. По умолчанию в окне будут только файлы с расширением .txt
:
Вторая — «Выбор папки». Она будет открывать похожее диалоговое окно для выбора папки.
Обе кнопки будут выводить полный путь к выбранным файлу или папке и не делать ничего, если пользователь выберет вариант Отмена
.
Первая кнопка будет вызывать функцию askopenfilename
, а вторая — askdirectory
:
import tkinter as tk
import tkinter.filedialog as fd
class App(tk.Tk):
def __init__(self):
super().__init__()
btn_file = tk.Button(self, text="Выбрать файл",
command=self.choose_file)
btn_dir = tk.Button(self, text="Выбрать папку",
command=self.choose_directory)
btn_file.pack(padx=60, pady=10)
btn_dir.pack(padx=60, pady=10)
def choose_file(self):
filetypes = (("Текстовый файл", "*.txt"),
("Изображение", "*.jpg *.gif *.png"),
("Любой", "*"))
filename = fd.askopenfilename(title="Открыть файл", initialdir="/",
filetypes=filetypes)
if filename:
print(filename)
def choose_directory(self):
directory = fd.askdirectory(title="Открыть папку", initialdir="/")
if directory:
print(directory)
if __name__ == "__main__":
app = App()
app.mainloop()
Поскольку пользователь может отменить выбор, также добавим условные инструкции, которые перед выводом в консоль будут проверять, не возвращает ли окно пустую строку. Такая валидация нужна для любого приложения, которое в дальнейшем будет работать с вернувшимся путем, считывая и копируя файлы или изменяя разрешения.
Как работают окна выбора файлов и папок
Создадим первое диалоговое окно с помощью функции askopenfilename
, которая возвращает строку с полным путем к файлу. Она принимает следующие опциональные аргументы:
title
— название для диалогового окна.initialdir
— начальная папка.filetypes
— последовательность из двух строк. Первая — метка с типом файла в читаемом формате, а вторая — шаблон для поиска совпадения с названием файла.multiple
— булево значение для определения того, может ли пользователь выбирать несколько файлов.defaultextension
— расширение, добавляемое к файлу, если оно не было указано явно.
В этом примере задаем корневую папку в качестве начальной, а также название. В кортеже типов файлов есть следующие три варианта: текстовые файлы, сохраненные с расширением .txt, изображения с .jpg, .gif и .png, а также подстановочный знак («*») для всех файлов.
Стоит обратить внимание на то, что эти шаблоны не обязательно соответствуют формату данных в файле, поскольку есть возможность переименовать его с другим расширением:
filetypes = (("Текстовый файл", "*.txt"),
("Изображение", "*.jpg *.gif *.png"),
("Любой", "*"))
filename = fd.askopenfilename(title="Открыть файл", initialdir="/",
filetypes=filetypes)
Функция askdirectory
также принимает параметры title
и initialdir
, а также булев параметр mustexist
для определения того, должны ли пользователи выбирать существующую папку:
directory = fd.askdirectory(title="Открыть папку", initialdir="/")
Модуль tkinter.filedialog
включает вариации этих функций, которые позволяют прямо получать объекты файлов.
Например, askopenfile
возвращает объект файла, который соответствует выбранному вместо того чтобы вызывать open
с путем возвращающим askopenfilename
. Но при этом все еще придется проверять, не было ли окно отклонено перед вызовом файловых методов:
import tkinter.filedialog as fd
filetypes = (("Текстовый файл", "*.txt"),)
my_file = fd.askopenfile(title="Открыть файл", filetypes=filetypes)
if my_file:
print(my_file.readlines())
my_file.close()
Сохранение данных в файл
Помимо выбора существующих файлов и папок также есть возможность создавать новые, используя диалоговые окна Tkinter. Они позволят сохранять данные, сгенерированные приложением, позволяя пользователям выбирать название и местоположение нового файла.
Будем использовать диалоговое окно «Сохранить файл» для записи содержимого виджета Text в текстовый файл:
Для открытия такого диалогового окна используется функция asksavefile
из модуля tkinter.filedialog
. Она создает объект файла с режимом записи ('w'
) или None
, если окно было закрыто:
import tkinter as tk
import tkinter.filedialog as fd
class App(tk.Tk):
def __init__(self):
super().__init__()
self.text = tk.Text(self, height=10, width=50)
self.btn_save = tk.Button(self, text="Сохранить", command=self.save_file)
self.text.pack()
self.btn_save.pack(pady=10, ipadx=5)
def save_file(self):
contents = self.text.get(1.0, tk.END)
new_file = fd.asksaveasfile(title="Сохранить файл", defaultextension=".txt",
filetypes=(("Текстовый файл", "*.txt"),))
if new_file:
new_file.write(contents)
new_file.close()
if __name__ == "__main__":
app = App()
app.mainloop()
Как работает сохранение фалов
Функция asksavefile
принимает те же опциональные параметры, что и askopenfile
, но также позволяет добавить расширение файла по умолчанию с помощью параметра defaultextension
.
Чтобы пользователи случайно не перезаписывали существующие файлы, это окно автоматически предупреждает, если они пытаются сохранить новый файл с тем же названием, что и у существующего.
С помощью объекта файла можно записать содержимое виджета Text. Нужно лишь не забывать закрывать файл для освобождения ресурсов, которые использовал объект:
contents = self.text.get(1.0, tk.END)
new_file.write(contents)
new_file.close()
Благодаря последней программе стало понятно, что askopenfile
возвращает объект файла, а не его название. Также есть функция asksaveasfilename
, которая возвращает путь к выбранному файлу. Ее можно использовать для изменения пути или выполнения валидации перед открытием файла для записи.
This login system which will pop up messagebox when you provide wrong data for entry messagebox
should be entered into the entry if not the messagebox will pop up prompting you an error as occured
from tkinter import *
from tkinter import messagebox
def top():
if entry1.get() == "messagebox":
log.destroy()
root.deiconify()
else:
messagebox.showerror("error", "try again")
messagebox.showinfo("my message","this is an example of showinfonmessagebox")
messagebox.showwarning("warning", "show warning example in tkinter" )
root = Tk()
root.geometry("400x400")
log = Toplevel(root)
log.geometry("200x200")
label1 = Label(log, text="password")
entry1 = Entry(log)
button1 = Button(log, text="login", command=top)
label1.pack()
entry1.pack()
button1.pack(side="bottom")
lab = Label(root, text="welcome bro").pack()
root.withdraw()
root.mainloop()
The Tkinter library has many built-in functions and methods which can be used to implement the functional part of an application. We can use messagebox module in Tkinter to create various popup dialog boxes. The messagebox property has different types of built-in popup windows that the users can use in their applications.
If you need to display the error messagebox in your application, you can use showerror(«Title», «Error Message») method. This method can be invoked with the messagebox itself.
Example
# Import the required libraries from tkinter import * from tkinter import messagebox # Create an instance of tkinter frame or window win = Tk() # Set the size of the tkinter window win.geometry("700x350") # Define a function to show the error message def on_click(): messagebox.showerror('Python Error', 'Error: This is an Error Message!') # Create a label widget label = Label(win, text="Click the button to show the message ", font=('Calibri 15 bold')) label.pack(pady=20) # Create a button to delete the button b = Button(win, text="Click Me", command=on_click) b.pack(pady=20) win.mainloop()
Output
When you run the above code, it will show a button widget and a label in the window. Click the button to show the error message.
Модуль Tkinter messagebox в Python используется для отображения окон сообщений в приложениях Python. Существуют различные функции, которые используются для отображения соответствующих сообщений в зависимости от требований приложения.
Синтаксис для использования окна сообщений приведен ниже.
Синтаксис:
messagebox.function_name(title, message [, options])
Параметры
- function_name: представляет соответствующую функцию окна сообщения.
- title: это строка, которая отображается как заголовок окна сообщения.
- message: это строка, которая будет отображаться как непосредственное сообщение в окне сообщения.
- options: различные параметры, которые можно использовать для настройки диалогового окна сообщения.
Можно использовать два параметра: default и parent.
1. default.
Параметр по умолчанию используется для упоминания типов кнопки по умолчанию, то есть ABORT, RETRY или IGNORE в окне сообщения.
2. parent.
Опция parent указывает родительское окно, поверх которого должно отображаться окно сообщения.
Для отображения соответствующих окон сообщений используются следующие функции. Все функции используются с одинаковым синтаксисом, но имеют определенные значения.
1. showinfo()
Окно сообщений showinfo() используется там, где нам нужно показать пользователю некоторую релевантную информацию.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.showinfo("information","Information") top.mainloop()
Вывод:
2. showwarning()
Этот метод используется для отображения предупреждения пользователю. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.showwarning("warning","Warning") top.mainloop()
Вывод:
3. showerror()
Этот метод используется для отображения сообщения об ошибке пользователю. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.showerror("error","Error") top.mainloop()
Вывод:
4. askquestion()
Этот метод используется, чтобы задать пользователю вопрос, на который можно ответить утвердительно или нет. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.askquestion("Confirm","Are you sure?") top.mainloop()
Вывод:
5. askokcancel()
Этот метод используется для подтверждения действий пользователя в отношении некоторых действий приложения. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.askokcancel("Redirect","Redirecting you to www.javatpoint.com") top.mainloop()
Вывод:
6. askyesno()
Этот метод используется, чтобы спросить пользователя о каком-либо действии, на которое пользователь может ответить утвердительно или нет. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.askyesno("Application","Got It?") top.mainloop()
Вывод:
7. askretrycancel()
Этот метод используется, чтобы спросить пользователя, нужно ли снова выполнять определенную задачу. Рассмотрим следующий пример.
Пример:
# !/usr/bin/python3 from tkinter import * from tkinter import messagebox top = Tk() top.geometry("100x100") messagebox.askretrycancel("Application","try again?") top.mainloop()
Вывод:
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.