Языки программирования

Библиотека Tkinter: Диалоговые окна

Библиотека Tkinter содержит несколько модулей, предоставляющих доступ к уже готовым диалоговым окнам. Это окна различных сообщений, выбора по принципу «да-нет», открытия и сохранения файлов.

В этой статье мы рассмотрим примеры окон из модулей messagebox и filedialog пакета tkinter.

Для вызова диалоговых окон открытия и сохранения файлов и работу с ними необходимо импортировать «подмодуль» Tkinter — tkinter.filedialog, в котором описаны классы для окон данного типа. Рассмотрим пример:
from tkinter import *
from tkinter.filedialog import *
    
root = Tk()
root.title("Пример работы диалоговых окон")
root.minsize(width=500, height=400)

op = askopenfilename()
sa = asksaveasfilename()

root.mainloop()
Здесь создаются два объекта (op и sa): один вызывает диалоговое окно «Открыть», а другой «Сохранить как…». При выполнении программы, они друг за другом выводятся на экран после появления главного окна.

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

Метод input модуля fileinput может принимать в качестве аргумента адрес файла, читать его содержимое, формируя список строк.

Далее с помощью цикла for можно извлекать строки последовательно и помещать их, например, в текстовое поле. Пример:
from tkinter import *
from tkinter.filedialog import *
import fileinput
    
root = Tk()
root.title("Пример работы диалоговых окон")
root.minsize(width=500, height=400)

txt = Text(root, width=40, height=15, font="14")
txt.pack()

op = askopenfilename()

for i in fileinput.input(op):
   txt.insert(END, i)

root.mainloop()
Видео по уроку:

Программа «Редактор файлов»

Для закрепления теории создадим небольшую программу. Полный листинг:
from tkinter import *
from tkinter.filedialog import *
import fileinput

# открытие файла
def _open():
  op = askopenfilename()
  print(op)
  f = open(op, "r", encoding='utf-8')
  content = f.read()
  txt.delete(1.0,END)
  txt.insert(END, content)

# сохранение файла  
def _save():
  sa = asksaveasfilename()
  content = txt.get(1.0,END)
  f = open(sa, "w", encoding='utf-8')
  f.write(content)
  f.close()
    
root = Tk()
root.title("Текстовый редактор")
root.minsize(width=500, height=400)
m = Menu(root)
root.config(menu=m)

fm = Menu(m)
m.add_cascade(label="Файл", menu=fm)
fm.add_command(label="Открыть...", command=_open)
fm.add_command(label="Сохранить как...", command=_save)

txt = Text(root, width=40, height=15, font=" Courier 14")
txt.pack()

root.mainloop()
Программа напоминает простейший редактор файлов. В программе есть небольшое меню. Загрузка и сохранение файла осуществляется с вызовом диалога открытия файла. Для открытия и сохранения мы создали две функции.

Вывод программы:
Видео по созданию программы:

MessageBox — вывод различных сообщений

Еще одна группа диалоговых окон описана в модуле tkinter.messagebox. Это окна различных сообщений, выбора по принципу «да-нет». Дополним нашу программу: «Редактор файлов». Листинг:
from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
import fileinput

# открытие файла
def _open():
  op = askopenfilename()
  print(op)
  f = open(op, "r", encoding='utf-8')
  content = f.read()
  txt.delete(1.0,END)
  txt.insert(END, content)

# закрытие файла  
def _save():
  sa = asksaveasfilename()
  content = txt.get(1.0,END)
  f = open(sa, "w", encoding='utf-8')
  f.write(content)
  f.close()

# выход из программы  
def close_win():
  if askyesno("Выход", "Вы уверены?"):
    root.destroy()

# вывод справки    
def about():
  showinfo("Редактор", "Простейший текстовый редактор от сайта: https://it-black.ru")
    
root = Tk()
root.title("Текстовый редактор v 2.0")
root.minsize(width=500, height=400)
m = Menu(root)
root.config(menu=m)

fm = Menu(m)
m.add_cascade(label="Файл", menu=fm)
fm.add_command(label="Открыть...", command=_open)
fm.add_command(label="Сохранить как...", command=_save)
fm.add_command(label="Выход", command=close_win)

hm = Menu(m)
m.add_cascade(label="Справка", menu=hm)
hm.add_command(label="О программе", command=about)

txt = Text(root, width=40, height=15, font=" Courier 14")
txt.pack()

root.mainloop()
Мы создали две дополнительные функции и пункты меню. В функции about происходит вызов окна showinfo, позволяющее выводить сообщение для пользователя с кнопкой ОК. Первый аргумент — это то, что выведется в заголовке окна, а второй — то, что будет содержаться в теле сообщения.

В функции close_win вызывается окно askyenso, которое позволяет получить от пользователя два ответа (true и false). При положительном ответе сработает ветка if и главное окно будет закрыто. В случае нажатия пользователем кнопки «Нет» окно просто закроется.

Вывод программы:
В данной статье мы создали неплохой текстовый редактор и теперь вы можете самостоятельно его улучшать. Пишите в комментариях свои варианты нашей программы.

Видео по созданию программы:
Библиотека Tkinter