- # Messagebox — Диалоговые окна
- # Модуль messagebox – стандартные диалоговые окна
- # Модуль filedialog – диалоговые окна открытия и сохранения файлов
- # Упражнения
- Диалоговые окна
- Модуль messagebox – стандартные диалоговые окна
- Модуль filedialog – диалоговые окна открытия и сохранения файлов
- Практическая работа
- # Создание диалогового окна
- # Messagebox — окно с информацией
- # Messagebox — окно с вопросом
- # Упражнения
- # Окна открытия и сохранения файлов
- # Упражнения
# Messagebox — Диалоговые окна
Пакет 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() :
from tkinter import * from tkinter.ttk import * from tkinter import messagebox as mb def check(): answer = mb.askyesno(title="Вопрос", message="Перенести данные?") if answer == True: 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() label.pack() root.mainloop()
Нажатие «Да» в диалоговом окне возвращает в программу True , «Нет» вернет False (также как закрытие окна через крестик). Таким образом в коде можно обработать выбор пользователя. В данном случае если последний соглашается, то данные переносятся из поля в метку.
Опции title и message являются позиционными, так что можно указывать только значения: askyesno(«Вопрос», «Перенести данные?»).
Подобные окна генерируются при использовании функций:
- askokcancel() — с надписями на кнопках «ОК» и «Отмена»,
- askquestion() — возвращает не True или False , а строки „yes“ или „no“,
- askretrycancel() — «Повторить», «Отмена»,
- askyesnocancel() — «Да», «Нет», «Отмена».
Другую группу составляют окна с одной кнопкой, которые служат для вывода сообщений различного характера:
… def check(): s = entry.get() if s.isdigit() == False: mb.showerror("Ошибка", "Должно быть введено число") else: entry.delete(0, END) label['text'] = s …
# Модуль filedialog – диалоговые окна открытия и сохранения файлов
Рассмотрим две функции из модуля filedialog – askopenfilename() и asksaveasfilename() . Первая предоставляет диалоговое окно для открытия файла, вторая – для сохранения. Обе возвращают имя файла, который должен быть открыт или сохранен, но сами они его не открывают и не сохраняют. Делать это уже надо программными средствами самого Python.
from tkinter import * from tkinter.ttk import * from tkinter import filedialog as fd def insertText(): file_name = fd.askopenfilename() f = open(file_name) s = f.read() text.insert(1.0, s) f.close() def extractText(): 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=insertText) b1.grid(row=1, sticky=E) b2 = Button(text="Сохранить", command=extractText) b2.grid(row=1, column=1, sticky=W) root.mainloop()
Опция filetype позволяет перечислить типы файлов, которые будут сохраняться или открываться, и их расширения.
Примечание. В приведенном коде при размещении текстового поля методом grid() не указаны аргументы row и column. В таких случаях подразумевается, что их значениями являются нули.
# Упражнения
В приведенной в уроке программе с функциями askopenfilename() и asksaveasfilename() генерируются исключения, если диалоговые окна были закрыты без выбора или указания имени файлов.
- Напишите код обработки данных исключений. При этом для пользователя должно появляться информационное диалоговое окно с сообщением о том, что файл не загружен или не сохранен.
- Добавьте кнопку «Очистить», которая удаляет текст из поля. Перед удалением пользователь должен подтвердить свои намерения через соответствующее диалоговое окно.
Диалоговые окна
Пакет 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 :
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 .
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.
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 генерируются исключения, если диалоговые окна были закрыты без выбора или указания имени файлов.
Напишите код обработки данных исключений. При этом для пользователя должно появляться информационное диалоговое окно с сообщением о том, что файл не загружен или не сохранен.
Добавьте кнопку «Очистить», которая удаляет текст из поля. Перед удалением пользователь должен подтвердить свои намерения через соответствующее диалоговое окно.
Курс с примерами решений практических работ: pdf-версия
Tkinter. Программирование GUI на Python
# Создание диалогового окна
Диалоговые окна, как элементы графического интерфейса, предназначены для вывода сообщений пользователю, получения от него какой-либо информации, а также управления.
Создадим свое диалоговое окно. Для примера оно создается используя несколько виджетов:
from tkinter import * window = Tk() window.title("Message box title") window.geometry("300x75") label = Label(window, text="My message content!") label.pack() button = Button(window, text="Ok", width=10, command=window.destroy) button.pack(side=RIGHT) window.mainloop()
Мы получили простейшее диалоговое окно, и хотя диалоговые окна весьма разнообразны, их вид уже устоялся. Нет необходимости создавать диалоговые окна с нуля, для это можно использовать «заготовки».
# Messagebox — окно с информацией
Для информирования пользователя о процессах происходящих в ПК можно использовать messagebox — окно с информацией. При этом требуется дополнительно импортировать «подмодуль» tkinter — tkinter.messagbox , в котором описаны классы для окон данного типа.
Код созданного информационного окна может быть следующим:
from tkinter import messagebox messagebox.showinfo('Message title', 'Message info content')
Для привлечения внимания можно использовать окно предупреждения:
from tkinter import messagebox messagebox.showwarning('Message warning title', 'Message warning content') # show warning message
Окно с возникшей ошибкой ПО думаю встречал каждый, на питоне его можно создать, написав следующий код:
from tkinter import messagebox messagebox.showerror('Message error title', 'Message error content') # show error message
# Messagebox — окно с вопросом
Следующие примеры диалоговых окон, служат для ведения диалога программы с пользователем и сохранением его ответа в переменной.
Попробуйте создать следующие примеры диалоговых окон, подумайте об их различий и где они могут применяться? Напишите комментарий в коде к каждому диалоговому окну:
from tkinter import messagebox response = messagebox.askquestion('Message title', 'Message ask content') response = messagebox.askyesno('Message title', 'Message y/n content') response = messagebox.askyesnocancel('Message title', 'Message y/n/cancel content') response = messagebox.askokcancel('Message title', 'Message ok/cancel content') response = messagebox.askretrycancel('Message title', 'Message retry/cancel content')
# Упражнения
- Исследование: после каждого вызова диалогового окна добавьте команду print(response) , которая выведет в консоль значение выбранного варианта ответа.
# Окна открытия и сохранения файлов
Рассмотрим, как запрограммировать с помощью tkinter вызов диалоговых окон открытия и сохранения файлов и работу с ними. При этом требуется дополнительно импортировать «подмодуль» tkinter — tkinter.filedialog , в котором описаны классы для окон данного типа:
from tkinter import * from tkinter import filedialog root = Tk() document_open = filedialog.askopenfilename() document_save = filedialog.asksaveasfilename() root.mainloop()
Здесь создаются два объекта ( document_open и document_save ): один вызывает диалоговое окно «Открыть», а другой «Сохранить как…». При выполнении скрипта, они друг за другом выводятся на экран после появления главного окна. Если не создать root, то оно все-равно появится на экране, однако при попытке его закрытия в конце возникнет ошибка.
# Упражнения
- Исследование: выведите в консоль результат вашего выбора в диалоговом окне.
- Что будет результатом вывода в консоль при выборе папок/файлов в диалоговых окнах и нажатии кнопки «ок»?
- Напишите программу с вызовом всех типов диалоговых окон для работы с файлами. Сколько их? И какие различия? (подскажет их PyCharm, когда наберете filedialog.ask )