Сохраняем данные в файле конфигурации — wxPython #16

Существует масса способов поместить свои данные в своё приложение. Когда вы пишите пользовательский интерфейс, вы часто будете попадать ситуацию, в которой требуется пользовательских настроек. Вы можете использовать простую базу данных вроде SQLite или файл конфигурации. В данном примере мы сделаем выбор в пользу файла конфигурации. В Python встроена удобная библиотека, которая называется configparser. Вы можете использовать её для создания и управления файлами конфигурации в wxPython. Как бы то ни было, я предпочитаю использовать ConfigObj, но это отдельный пакет, который вам нужно скачивать и устанавливать.

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

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

Telegram Чат & Канал

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

Паблик VK

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

Приступая к работе

ConfigObj немного проще использовать чем configparser. Более того, он позволяет провести валидацию. А ещё он может доставить из файла конфигурации типы Python, в то время как configparser достаёт только строки. Если ConfigObj не установлен у вас, то используйте pip:

Сразу же после установки создайте простой контроллер для создания файлов конфигурации и доступа к ним с помощью ConfigObj.

Создание контроллера

Использование парадигмы модель-вид-контроллер очень популярно во время разработки пользовательского интерфейса. Контролер обычно служит оболочкой для самого кода, который и выполняет поставленную функцию. Моделью являются описание базы данных или даже самих виджетов, ведь wxPython поддерживает и XRC. Видом здесь является код, который рисует интерфейс для пользователя, так что, в данном случае, он будет составлять большую часть кода wxPython. Сейчас нам не нужно беспокоится о модели, так что мы можем сразу начать с контроллера.

Этот фрагмент кода довольно прямолинеен. В функции create_config создаётся файл example.ini в той же директории, из которой запускался скрипт. Файл конфигурации получает 6 полей, но в нём отсутствуют секции. В функции get_config, код проверяет наличие файла конфигурации и, в случае отсутствия, создаёт его. Несмотря ни на что, функция возвращает объект ConfigObj к коллеру. Мы вставляем данный скрипт в controller.py.

Создание вида

Сохраняем данные в файле конфигурации - wxPython #16

Всё, что нам нужно для нашего вида – превратить класс wx.Dialog, чтобы создать диалог параметров. Этот фрагмент кода довольно длинный, так что давайте разберём его по кусочкам.



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

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

Код, написанный выше, позволяет нам загрузить конфигурацию из файла используя ConfigObj. Вы можете увидеть, как он работает, прочитав часть кода, где используется метод loadPreferences. Другой внушительный фрагмент кода посвящён сохранению данных после того, как пользователь внёс свои корректировки. Для этого, нам нужно обратить внимание на метод savePreferences. Это довольно прямолинейный метод, который позволяет захватывать различные значения из виджетов, используя специализированные функции для получения, доступные wx.

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

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

Вы также заметите, что для корректного закрытия диалогового окна, мы вызывали EndModal в методе onCancel.

Теперь, давайте представим, что специализация нашей программы изменилась настолько, что нам нужно убрать или заменить параметр. Всё, что нам нужно сделать – это удалить или добавить файл конфигурации. ConfigObj сам соберёт все изменения, нам нужно лишь запомнить о том, что нужно добавить или удалить соответствующие виджеты в нашем графическом интерфейсе. Самое лучшее в ConfigObj то, что он не будет переписывать данные в вашем файле, а просто добавить фрагменты, которые нужны для изменений. Попробуйте и убедитесь в том, что это невероятно просто!

Итоги

Теперь вы должны уметь создавать свои собственные диалоговые окна с параметрами и использовать ConfigObj для увеличения их количества. Я считаю, что ConfigObj лучше подходит Python в вопросах чтения и написания файлов конфигурации. Я думаю, что вы со мной согласитесь. Если вы хотите посоревноваться или просто размяться, то попробуйте открыть диалоговое окно «Параметры» в любой установленной на вашем компьютере программе, например, в Microsoft Word, а затем попробуйте создать его копию их используя wxPython. Это одно из лучших обучающих упражнений, так как вы будете сразу использовать несколько виджетов, что положительно скажется на вашей креативности в вопросах файлов конфигурации.