Генерируем диалог из файла конфигурации — wxPython #15

После написания статьи о чудесном пакете ConfigObj в своём блоге, один из моих читателей спросил о том, есть ли способ использовать файл конфигурации для генерирования диалога. Что же, я решил дать этой идее шанс. Для выполнения указаний из этой статьи вам нужно установить ConfigObj в дополнение к wxPython. Если у вас он даже не скачан, вам нужно использовать pip для его установки:

Теперь, когда он установлен, можем продолжать.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Файл конфигурации

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

Данный файл конфигурации содержит 2 секции: ярлыки и значения. Секция ярлыков содержит ярлыки, который мы используем при создании управления для wx.StaticText. Секция значения содержит несколько примерных значений, которые мы можем использовать для корреспонденции между виджетами управления текстом и одним комбо-боксом.

Обратите внимание, что поле agency_choices является списком. Первый итем в списке будет опцией по умолчанию в комбо-боксе, а другие два итема будут реальным контентом виджета.

Создаём пользовательский интерфейс

Генерируем диалог из файла конфигурации - wxPython #15

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

 

Сначала мы превращаем wx.Dialog в подкласс и используем метод createWidgets. Этот метод прочтёт ваш файл конфигурации и использует данные из него для создания дисплея. Сразу же после прочтения файла конфигурации, мы loop over ключей в секции ярлыков, и создаём статичные текстовые контроли, если нужно. Далее, мы loop over значений в другой секции и используем условия, чтобы проверить тип виджета. В данном случае, нас интересуют только wx.TextCtrl и wx.Combobox. Как раз здесь ConfigObj и приходит к нам на помощь: он позволяет внести несколько записей для тайпкаста в файл конфигурации. Если вы используете configspec, вы можете сделать тайпкаст более зернистым, и это может стать направлением, которое я когда-то рассмотрю в своей статье. Учтите, что для текстового контроля и комбо-бокса, я задавал поле с именем. Это очень важно для сохранения данных, в чём мы и убедимся, когда захотим сделать код универсальным.

Как бы то ни было, в обеих петлях, мы используем вертикальные BoxSizers, чтобы держать наши виджеты. Вы можете захотеть сменить его на GridBagSizer и FlexGridSizer для специальных частей вашего интерфейса. Лично я предпочитаю BoxSizers. Я также использовал StdDialogButtonSizer для кнопок. Если вы используете корректные стандартные id для кнопок, то сайзер расположит их в правильном порядке на всех платформах. Он очень удобен, а также не требует никаких значений.

Следующий метод, который нас интересует, называется onSave. Здесь мы сохраняем всё, что ввёл пользователь. Ранее в программе, я захватывал имена виджетов из файла конфигурации, и как раз их мы сейчас и loop over. Мы вызываем wx.FindWindowByName для того, чтобы найти виджет по его имени. Затем мы снова используем isinstance, чтобы выяснить какого типа этот виджет. Как только это произошло, мы захватываем значение, которое содержится в виджете, с помощью GetValue и назначаем это значение в корректное поле в нашей конфигурации. Когда loop, закончится, мы записываем данные на диск. Последним шагом является вызов EndModal(0) для закрытия диалога, а затем, в свою очередь, и приложения.

Итоги

Теперь вы ознакомились с азами генерирования диалога из файла конфигурации. Я думаю, что использование чего-то вроде словаря с названиями типов виджетов (скорее всего в стрингах), позволит вам использовать данный скрипт с другими виджетами. Вы также заметите, что в данном примере напрочь отсутствует валидация! Это первое, что вам нужно сделать, расширяя этот фрагмент кода. Используйте своё воображение и сообщите мне, что у вас получилось.