Создание модальных пользовательских диалогов

sozdanie modalnyh polzovatelskih dialogov Экскурсия по tkinter, часть 1

Если запустить сценарий, передав ему аргумент в командной строке (например, python dlgcustom.py 1), окно диалога будет сделано модальным. Так как модальные диалоги сосредоточивают на себе все внимание интерфейса, главное окно становится недоступным, пока не будет закрыто окно диалога — пока диалог открыт, нельзя даже щелкнуть на корневом окне, чтобы активизировать его. Поэтому невозможно создать на экране больше одного всплывающего окна, как показано на рис. 8.19.

Рис. 8.19. Модальный пользовательский диалог в действии

 

Фактически функция dialog в этом сценарии не возвращает управление, пока диалог в левой части не будет закрыт нажатием кнопки OK. В результате модальные диалоги накладывают на модель программирования, в других случаях управляемую событиями, модель вызова функций — введенные пользователем данные можно обрабатывать сразу, а не в обработчике события, который вызывается в какой-то неопределенный момент времени в будущем.

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

win.focus_set()

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

win.grab_set()

Блокирует доступ ко всем другим окнам приложения, пока не будет закрыто данное окно. В это время пользователь не может взаимодействовать с другими окнами программы.

win.wait_window()

Приостанавливает вызвавшую программу, пока не будет уничтожен виджет win, но при этом главный цикл обработки событий (mainloop) остается активным. Это означает, что графический интерфейс в целом остается активным во время ожидания. Например, его окна перерисовываются при скрытии под другими окнами или открытии. Когда окно закрывается вызовом метода destroy, оно удаляется с экрана, блокировка приложения автоматически снимается и происходит возврат из данного метода.

Так как сценарий ждет события закрытия окна, он должен предоставить обработчик события, уничтожающий окно в ответ на взаимодействие с виджетами в диалоговом окне (единственном, которое активно). Диалог в этом примере является простым информационным диалогом, поэтому его кнопка OK вызывает метод destroy окна. В диалогах для ввода данных можно установить обработчик события нажатия клавиши Enter, который извлечет данные, введенные в элемент Entry, и после этого вызовет destroy (как будет показано далее в этой главе).

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий