Все встреченные нами до сих пор диалоги имеют стандартный внешний вид и способы взаимодействия. Для многих задач этого достаточно, но иногда требуется нечто более специфическое. Например, формы, требующие заполнения нескольких полей ввода (например, имя, возраст и размер обуви), не поддерживаются непосредственно библиотекой стандартных диалогов. Можно было бы поочередно выводить диалоги для ввода каждого значения, но такой интерфейс нельзя назвать дружественным.
Пользовательские диалоги поддерживают произвольные интерфейсы, но работать с ними сложнее. Впрочем, многого для этого не требуется: создать окно, такое как Toplevel, с прикрепленными виджетами и добавить обработчик события, который соберет данные, введенные пользователем (если они есть), и закроет окно. Чтобы сделать такой диалог модальным, необходимо передать окну фокус ввода, сделать другие окна неактивными и ожидать события. Реализация такого диалога демонстрируется в примере 8.13.
Пример 8.13. PP4E\Gui\Tour\dlg—custom.py
import sys
from tkinter import *
makemodal = (len(sys.argv) > 1)
def dialog():
win = Toplevel() # создать новое окно
Label(win, text=’Hard drive reformatted!’).pack() # добавить виджеты Button(win, text=’OK’, command=win.destroy).pack() # установить обработчик if makemodal:
win.focus_set() # принять фокус ввода, win.grab_set() # запретить доступ к др. окнам, пока открыт диалог
win.wait_window() # ждать, пока win не будет уничтожен
print(‘dialog exit’) # иначе — сразу вернуть управление
root = Tk()
Button(root, text=’popup’, command=dialog).pack() root.mainloop()
Этот сценарий создает модальное или немодальное окно, в зависимости от значения глобальной переменной makemodal. Если запустить его без аргументов командной строки, выбирается немодальный стиль, как показано на рис. 8.18.
Рис. 8.18. Немодальные пользовательские диалоги в действии
Окно справа сверху — это корневое окно. При нажатии в нем кнопки popup создается новое диалоговое окно. Поскольку в этом режиме диалоги являются немодальными, корневое окно сохраняет активность после вывода диалога. Немодальные диалоги не блокируют другие окна, поэтому кнопку в корневом окне можно нажать несколько раз и создать столько копий диалога, сколько поместится на экране. Любые из этих окон можно закрыть щелчком на их кнопках OK, при этом остальные окна останутся на экране.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011