Пакет tkinter
содержит несколько модулей, предоставляющих доступ к уже готовым диалоговым окнам. Это окна различных сообщений, выбора по принципу «да-нет», открытия и сохранения файлов и др. В этом уроке рассмотрим примеры окон из модулей messagebox
и filedialog
пакета tkinter
.
Модули пакета необходимо импортировать отдельно. То есть вы импортируете содержимое tkinter
(например, from tkinter import *
) и отдельно входящий в состав пакета tkinter
модуль. Способы импорта на примере messagebox
и пример вызова одной из функций модуля:
-
import tkinter.messagebox → tkinter.messagebox.askyesno()
-
from tkinter.messagebox import * → askyesno()
-
from tkinter import messagebox → messagebox.askyesno()
-
from tkinter import messagebox as mb (вместо mb может быть любой идентификатор) → mb.askyesno()
В уроке мы будем использовать последний вариант.
Модуль messagebox – стандартные диалоговые окна
Окно выбора «да» или «нет» – askyesno
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from tkinter import * from tkinter import messagebox as mb def check(): answer = mb.askyesno(title="Вопрос", message="Перенести данные?") if answer: s = entry.get() entry.delete(0, END) label["text"] = s root = Tk() entry = Entry() entry.pack(pady=10) Button(text="Передать", command=check).pack() label = Label(height=3) label.pack() root.mainloop() |
Нажатие «Да» в диалоговом окне возвращает в программу True
, «Нет» вернет False
(также как закрытие окна через крестик). Таким образом в коде можно обработать выбор пользователя. В данном случае если последний соглашается, то данные переносятся из поля в метку.
Опции title
и message
являются позиционными, так что можно указывать только значения: askyesno("Вопрос", "Перенести данные?")
.
Подобные окна генерируются при использовании функции askokcancel
с надписями на кнопках «ОК» и «Отмена», askquestion
(возвращает не True
или False
, а строки ‘yes’ или ‘no’), askretrycancel
(«Повторить», «Отмена»), askyesnocancel
(«Да», «Нет», «Отмена»).
Другую группу составляют окна с одной кнопкой, которые служат для вывода сообщений различного характера. Это showerror
, showinfo
и showwarning
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from tkinter import * from tkinter import messagebox as mb def check(): s = entry.get() if not s.isdigit(): mb.showerror("Ошибка", "Должно быть введено число") else: entry.delete(0, END) label['text'] = s root = Tk() entry = Entry() entry.pack(pady=10) Button(text="Передать", command=check).pack() label = Label(height=3) label.pack() root.mainloop() |
Модуль filedialog – диалоговые окна открытия и сохранения файлов
Рассмотрим две функции из модуля filedialog
– askopenfilename
и asksaveasfilename
. Первая предоставляет диалоговое окно для открытия файла, вторая – для сохранения. Обе возвращают имя файла, который должен быть открыт или сохранен, но сами они его не открывают и не сохраняют. Делать это уже надо программными средствами самого Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from tkinter import * from tkinter import filedialog as fd def insert_text(): file_name = fd.askopenfilename() f = open(file_name) s = f.read() text.insert(1.0, s) f.close() def extract_text(): file_name = fd.asksaveasfilename( filetypes=(("TXT files", "*.txt"), ("HTML files", "*.html;*.htm"), ("All files", "*.*"))) f = open(file_name, 'w') s = text.get(1.0, END) f.write(s) f.close() root = Tk() text = Text(width=50, height=25) text.grid(columnspan=2) b1 = Button(text="Открыть", command=insert_text) b1.grid(row=1, sticky=E) b2 = Button(text="Сохранить", command=extract_text) b2.grid(row=1, column=1, sticky=W) root.mainloop() |
Опция filetype
позволяет перечислить типы файлов, которые будут сохраняться или открываться, и их расширения.
Примечание. В приведенном коде при размещении текстового поля методом grid
не указаны аргументы row
и column
. В таких случаях подразумевается, что их значениями являются нули.
Практическая работа
В приведенной в уроке программе с функциями askopenfilename
и asksaveasfilename
генерируются исключения, если диалоговые окна были закрыты без выбора или указания имени файлов.
Напишите код обработки данных исключений. При этом для пользователя должно появляться информационное диалоговое окно с сообщением о том, что файл не загружен или не сохранен.
Добавьте кнопку «Очистить», которая удаляет текст из поля. Перед удалением пользователь должен подтвердить свои намерения через соответствующее диалоговое окно.