6. Tkinter. Диалоговые окна¶
Диалоговые окна, как элементы графического интерфейса, предназначены для вывода сообщений пользователю, получения от него какой-либо информации, а также управления.
Создадим свое диалоговое окно. Для примера оно создается используя несколько виджетов:
from tkinter import * window = Tk() window.title("Message box title") window.geometry("300x75") lbl = Label(window, text="My message content!") btn = Button(window, text="Ok", width=10, command=window.destroy) lbl.pack() btn.pack(side=RIGHT) window.mainloop()

Мы получили простейшее диалоговое окно, и хотя диалоговые окна весьма разнообразны, их вид уже устоялся. Нет необходимости создавать диалоговые окна с нуля, для это можно использовать «заготовки».
6.2. 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') #shows warning message

Окно с возникшей ошибкой ПО думаю встречал каждый, на питоне его можно создать, написав следующий код:
from tkinter import messagebox messagebox.showerror('Message error title', 'Message error content') #shows error message

6.3. Messagebox — окно с вопросом¶
Следующие примеры диалоговых окон, служат для ведения диалога с пользователем и сохранением его ответа в переменной. Попробуйте создать следующие примеры диалоговых окон, подумайте об их различий и где они могут применяться? Напишите комментарий в коде к каждому диалоговому окну:
from tkinter import messagebox res = messagebox.askquestion('Message title', 'Message ask content') res = messagebox.askyesno('Message title', 'Message y/n content') res = messagebox.askyesnocancel('Message title', 'Message y/n/cancel content') res = messagebox.askokcancel('Message title', 'Message ok/cancel content') res = messagebox.askretrycancel('Message title', 'Message retry/cancel content')
6.4. Окна открытия и сохранения файлов¶
Рассмотрим, как запрограммировать с помощью Tkinter вызов диалоговых окон открытия и сохранения файлов и работу с ними. При этом требуется дополнительно импортировать «подмодуль» Tkinter — tkinter.filedialog, в котором описаны классы для окон данного типа:
from tkinter import * from tkinter.filedialog import * root = Tk() op = askopenfilename() sa = asksaveasfilename() root.mainloop()
Здесь создаются два объекта (op и sa): один вызывает диалоговое окно «Открыть», а другой «Сохранить как…». При выполнении скрипта, они друг за другом выводятся на экран после появления главного окна. Если не создать root, то оно все-равно появится на экране, однако при попытке его закрытия в конце возникнет ошибка.
Оглавление
- 6. Tkinter. Диалоговые окна
- 6.1. Создание диалогового окна
- 6.2. Messagebox — окно с информацией
- 6.3. Messagebox — окно с вопросом
- 6.4. Окна открытия и сохранения файлов
Всплывающее окно
Добрый день. В окне есть знак вопроса, при наведении на него мышкой, появляется подсказка в виде комментария. Мышку убираем, комментарий исчезает. Необходимо реализовать функцию onfocus для элемента label (знак вопроса). Буду рад любой информации.
ues = Label(root, text="?",font=("Arial Bold", 16)).grid(column = 1, row = 1)
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Всплывающее окно с ошибкой
Вот такая программа: import sys import math from untitled import * class MyWin.
Всплывающее окно при входе на сайт (windows окно)
Как сделать чтобы при переходе на страницу появлялось такое же всплывающее окно как здесь? .Всплывающее окно (окно ошибки) в ASP.NET
Добрый день. Помоги пожалуйста с проблемой: У меня есть GridView, TxtBox и Button. По нажатию на.
Всплывающее окно перекрывает окно отчёта
Доброго времени суток форумчане! Помогите пожалуйста победит всплывающию окошку, сделать так чтобы.Всплывающее окно
Здраствуйте. Ребят мне нужна помощь: нужен код чтобы всплывающее окно открывалось при загрузке.Окна
По умолчанию приложение Tkinter имеет одно главное окно, которое представляет класс tkinter.Tk . Запуск приложение приводит к запуску главного окно, в рамках которого помещаются все виджеты. Закрытие главного окна приводит к завершению работы приложения. Однако в рамках главного окна также можно запускать вторичные, неглавные окна. Например, октроем новое окно по нажатию на кнопку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()Здесь по нажатию на кнопку создается новый объект window, у него устанавливается заголовок и размеры.

Стоит отметить, что приложение завершит работу, когда будут закрыты все его окна.
Как и главное окно, вторичные окна могут иметь виджеты. Например, определим на новом окне метку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") label=ttk.Label(window, text="Принципиально новое окно") label.pack(anchor=CENTER, expand=1) button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()Единственное не надо забывать у добавляемых виджетов устанавливать окно в качестве родительского контейнера

Удаление окна
Для удаления окна применяется меnод destroy()
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") close_button = ttk.Button(window, text="Закрыть окно", command=lambda: window.destroy()) close_button.pack(anchor="center", expand=1) open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()В данном случае в новом окне по нажатию на кнопку close_button срабатывает метод window.destroy() , который закрывает окно и по сути аналогичен нажатию на крестик в верхнем правом углу окна.
Определение окна в объектно-ориентированном стиле
В примере выше новое окно, его параметры и вложенные виджеты определялись внутри функции, однако это приводит к разбуханию кода функции. И гораздо проще вынести определение окна в отдельный класс:
from tkinter import * from tkinter import ttk class Window(Tk): def __init__(self): super().__init__() # конфигурация окна self.title("Новое окно") self.geometry("250x200") # определение кнопки self.button = ttk.Button(self, text="закрыть") self.button["command"] = self.button_clicked self.button.pack(anchor="center", expand=1) def button_clicked(self): self.destroy() root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Window() open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()Здесь определение окна вынесено в отдельный класс Window, который наследуется от класса tkinter.Tk. Благодаря этому мы можем вынести весь код определения окна в отдельную структурную единицу — класс, что позволит упростить управление кодом.
Окно поверх других окон
Для создания диалогового окна, которое располагается поверх главного окна, применяется класс Toplevel :
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def dismiss(window): window.grab_release() window.destroy() def click(): window = Toplevel() window.title("Новое окно") window.geometry("250x200") window.protocol("WM_DELETE_WINDOW", lambda: dismiss(window)) # перехватываем нажатие на крестик close_button = ttk.Button(window, text="Закрыть окно", command=lambda: dismiss(window)) close_button.pack(anchor="center", expand=1) window.grab_set() # захватываем пользовательский ввод open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()Toplevel по сути то же самое окно Tk, которое располагается поверх других окон. В примере выше оно также имеет кнопку. Но кроме того, чтобы пользователь не мог перейти обратно к главному окну пока не закроет это диалоговое окно, применяется ряд методов. Прежде всего захватываем весь пользовательский ввод с помощью метода grab_set() :
window.grab_set()
В функции dismiss() , которая закрывает окно, освобождаем ввод с помощью метода grab_release()
window.grab_release()
Tkinter как сделать всплывающее окно
Tkinter обладает рядом встроенных диалоговых окон для различных задач. Рассмотрим некоторые из них.
filedialog
Модуль filedialog предоставляет функциональность файловых диалоговых окон, которые позволяют выбрать файл или каталог для различных задач. В частности в модуле для работы с файлами определены следующие функции:
- askopenfilename() : открывает диалоговое окно для выбора файла и возвращает путь к выбранному файлу. Если файл не выбран, возвращается пустая строка «»
- askopenfilenames() : открывает диалоговое окно для выбора файлов и возвращает список путей к выбранным файлам. Если файл не выбран, возвращается пустая строка «»
- asksaveasfilename() : открывает диалоговое окно для сохранения файла и возвращает путь к сохраненному файлу. Если файл не выбран, возвращается пустая строка «»
- asksaveasfile() : открывает диалоговое окно для сохранения файла и возвращает сохраненный файл. Если файл не выбран, возвращается None
- askdirectory() : открывает диалоговое окно для выбора каталога и возвращает путь к выбранному каталогу. Если файл не выбран, возвращается пустая строка «»
- askopenfile() : открывает диалоговое окно для выбора файла и возвращает выбранный файл. Если файл не выбран, возвращается None
- askopenfiles() : открывает диалоговое окно для выбора файлов и возвращает список выбранных файлов
Рассмотрим открытие и сохранение файла на примере:
from tkinter import * from tkinter import ttk from tkinter import filedialog root = Tk() root.title("METANIT.COM") root.geometry("250x200") root.grid_rowconfigure(index=0, weight=1) root.grid_columnconfigure(index=0, weight=1) root.grid_columnconfigure(index=1, weight=1) text_editor = Text() text_editor.grid(column=0, columnspan=2, row=0) # открываем файл в текстовое поле def open_file(): filepath = filedialog.askopenfilename() if filepath != "": with open(filepath, "r") as file: text =file.read() text_editor.delete("1.0", END) text_editor.insert("1.0", text) # сохраняем текст из текстового поля в файл def save_file(): filepath = filedialog.asksaveasfilename() if filepath != "": text = text_editor.get("1.0", END) with open(filepath, "w") as file: file.write(text) open_button = ttk.Button(text="Открыть файл", command=open_file) open_button.grid(column=0, row=1, sticky=NSEW, padx=10) save_button = ttk.Button(text="Сохранить файл", command=save_file) save_button.grid(column=1, row=1, sticky=NSEW, padx=10) root.mainloop()
Здесь определены две кнопки. По нажатию по на кнопку open_button вызывается функция filedialog.askopenfilename() . Она возвращает путь к выбранному файлу. И если в диалоговом окне не нажата кнопка отмены (то есть путь к файлу не равен пустой строке), то считываем содержимое текстового файла и добавляем его в виджет Text
def open_file(): filepath = filedialog.askopenfilename() if filepath != "": with open(filepath, "r") as file: text =file.read() text_editor.delete("1.0", END) text_editor.insert("1.0", text)По нажатию на кнопку save_button срабатывает функция filedialog.asksaveasfilename() , которая возвращает путь к файлу для сохранения текста из виджета Text. И если файл выбран, то открываем его и сохраняем в него текст:
def save_file(): filepath = filedialog.asksaveasfilename() if filepath != "": text = text_editor.get("1.0", END) with open(filepath, "w") as file: file.write(text)Эти функции могут принимать ряд параметров:
- confirmoverwrite : нужно ли подтверждение для перезаписи файла (для диалогового окна сохранения файла)
- defaultextension : расширение по умолчанию
- filetypes : шаблоны типов файлов
- initialdir : стартовый каталог, который открывается в окне
- initialfile : файл по умолчанию
- title : заголовок диалогового окна
- typevariable : переменная, к которой привязан выбранный файл
filedialog.askopenfiles(title="Выбор файла", initialdir="D://tkinter", defaultextension="txt", initialfile="hello.txt")
Выбор шрифта
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") label = ttk.Label(text="Hello World") label.pack(anchor=NW, padx=10, pady=10) def font_changed(font): label["font"] = font def select_font(): root.tk.call("tk", "fontchooser", "configure", "-font", label["font"], "-command", root.register(font_changed)) root.tk.call("tk", "fontchooser", "show") open_button = ttk.Button(text="Выбрать шрифт", command=select_font) open_button.pack(anchor=NW, padx=10, pady=10) root.mainloop()По нажатию на кнопку вызывается функция select_font, в которой вначале производится настройка диалогового окна установки шрифта
root.tk.call("tk", "fontchooser", "configure", "-font", label["font"], "-command", root.register(font_changed))В частности, значение «configure» указывает, что в данном случае производится настройка диалогового окна. Аргумент «-font» указывает, что следующее значение представляет настройка шрифта, который будет выбран в диалоговом окне по умолчанию. В качестве такового здесь используется шрифт метки label.
Аргумент «-command» указывает, что дальше идет определение функции, которая будет срабатывать при выборе шрифта. Здесь такой функцией является функция font_changed . Функция выбора шрифта должна принимать один параметр — через него будет передаваться выбранный шрифт. В данном случае просто переустанавливаем шрифт метки.
Для отображения окна выбора шрифта выполняется вызов
root.tk.call("tk", "fontchooser", "show")Таким образом, при нажатии на кнопку откроется окно выбора шрифта, а после его выбора он будет применен к метке:

Выбор цвета
Для выбора цвета применяется функции из модуля colorchooser.askcolor() :
from tkinter import * from tkinter import ttk from tkinter import colorchooser root = Tk() root.title("METANIT.COM") root.geometry("250x200") label = ttk.Label(text="Hello World") label.pack(anchor=NW, padx=10, pady=10) def select_color(): result = colorchooser.askcolor(initialcolor="black") label["foreground"] = result[1] open_button = ttk.Button(text="Выбрать цвет", command=select_color) open_button.pack(anchor=NW, padx=10, pady=10) root.mainloop()Здесь по нажатию на кнопку вызывается функция select_color. В этой функции вызывается функция colorchooser.askcolor . С помощью параметра initialcolor устанавливаем цвет, который выбран по умолчанию в диалоговом окне. В данном случае это черный цвет («black»)
Результатом функции является кортеж с определениями выбранного цвета. Например, для красного цвета кортеж будет выглядеть следующим образом: ((255, 0, 0), «#ff0000») . То есть, обратившись к второму элементу кортежа, можно получить шестнадцатиричное значение цвета. Здесь выбранный цвет применяется для установки цвета шрифта метки:
label["foreground"] = result[1]