Диалоговые окна в Tkinter

Пакет tkinter содержит несколько модулей, предоставляющих доступ к уже готовым диалоговым окнам. Это окна различных сообщений, выбора по принципу "да-нет", открытия и сохранения файлов и др. В этом уроке рассмотрим примеры окон из модулей messagebox и filedialog пакета tkinter.

Модули пакета необходимо импортировать отдельно. То есть вы импортируете содержимое tkinter (например, from tkinter import *) и отдельно входящий в состав пакета tkinter модуль. Способы импорта на примере messagebox и пример вызова одной из функций модуля:

В уроке мы будем использовать последний вариант.

Модуль 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 – диалоговые окна открытия и сохранения файлов

Рассмотрим две функции из модуля filedialogaskopenfilename и 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 генерируются исключения, если диалоговые окна были закрыты без выбора или указания имени файлов.

Напишите код так, чтобы исключения не выбрасывались. При этом для пользователя должно появляться информационное диалоговое окно с сообщением о том, что файл не загружен или не сохранен.

Добавьте кнопку "Очистить", которая удаляет текст из поля. Перед удалением пользователь должен подтвердить свои намерения через соответствующее диалоговое окно.

Tkinter. Программирование GUI на Python




Все разделы сайта