Введение в XRC — wxPython #49

Вы когда-либо задумывались о создании программы, которая будет использовать XML в wxPython? Что, я тоже никогда не задумывался, но способ есть и называется он XRC. На самом деле wxPython идёт в комплекте с редактором XRCed, посредством которого вы можете отображать ваш графический интерфейс и генерировать XML-код.

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

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

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

Telegram Чат & Канал

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

Паблик VK

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

Создание экрана входа с помощью XRC

Введение в XRC - wxPython #49

Одним из наиболее часто встречающихся диалогов является диалог входа. Я использовал XRCed, чтобы создать следующий XML-код:

Чтобы использовать XRC-код в вашем wxPython, вам нужно всего лишь выполнить “import wx.xrc” или использовать “from wx import xrc”. Давайте взглянем на то, как выглядит код в Python:

В коде выше, мы используем метод XRC, который называется XmlResource для того, чтобы открыть XML-файл и загрузить его в нашу программу. Затем, мы используем результирующую переменную, чтобы загрузить определённые виджеты из файла. В данном случае, мы загружаем только фрейм, вызывая LoadFrame.

Учтите, что мы превратили None в вызов LoadFrame. Первый аргумент – это перент-аргумент, а так как у фрейма не должно быть перента, мы вводили None. Наконец, мы вызвали метод фрейма под названием Show, так что мы действительно можем увидеть нашу программу. Вот и всё! Теперь давайте перейдём к чему-то более сложному.

Создаём Notebook с помощью XRC

Создание виджета Notebook немного сложнее, чем просто создание рамки. Хотя бы потому, что, когда вы создаёте Notebook, вы обычно прикрепляете на него несколько панелей. Присоединение сложных панелей может быть удручающим. Таким образом, мы рассмотрим, как можно создать простой Notebook, а затем его гораздо более сложную версию. Давайте начнём с простого. Если вы хотите следовать за мной пошагово, откройте XRCed, и попробуйте создать макет, аналогичный тому, что на скриншоте ниже:

Введение в XRC - wxPython #49

Трюк добавления страниц в ваш notebook состоит в том, что вам нужно выбрать дочерние панели и выбрать переключение NotebookPage, которое будет отображаться справа. В нём вы можете задавать ярлыки для вкладок. Давайте взглянем на сгенерированный XML:

Он практически такой же, как и в первом примере. Учтите, что теперь мы можем встраивать флаги сайзера в сам XML (например, wxALL|wx.EXPAND). Это довольно круто! Код, который загружает notebook почти идентичен коду, который мы использовали для загрузки диалога входа ранее:

Единственными различиями являются название фрейма и файла XRC. Теперь же давайте перейдём к более сложному примеру Notebook. В нём мы создадим XRC-файл для Notebook и XRC-файла панели, которые мы сможем использовать в качестве вкладок нашего Notebook. XML нашего нового Notebook такой же, как и прошлый, так что его мы пропустим. Но давайте остановимся и взглянем на XRC-код панелей. Вот код для первой панели:

Вы заметите, что эта панель загружена как TabOne (заглавная «Т» обязательна) и она включает два текстовых контроля. XRC-код второй панели выглядит так:

Данный фрагмент XML просто создаёт невероятно простую пустую инстанцию ListCtrl, которая создана так, чтобы вписываться в панель. Теперь наше внимание переносится на Pythonкод, который загружает эти XRC-файлы:

Введение в XRC - wxPython #49

Здесь мы просто извлекаем объекты фрейм, панель и notebook из первого xrc-файла, и используем и в качестве базы для добавления других контролей. Загрузка оставшихся двух панелей это лишь закрепление материала, так как мы делаем в точности то же, что делали с оригинальной панелью.

Затем мы добавляем новые панели в наш notebook, используя до боли знакомую методологию AddPage. Как только это сделано, мы отображаем рамку и готово! Вторая панель содержит пустой ListCtrl, и, когда я создавал её впервые, то постоянно получал сообщения об ошибке, так как я забыл указать её стиль. Убедитесь в том, что настроили List, Report или какую-то другую модель, если вы столкнулись с той же проблемой.

Добавление контролей не из XRC

Введение в XRC - wxPython #49

Главным недостатком XRC является поддержка маленького поднабора доступных виджетов. К счастью, существует способ «научить» XRC использовать новые контроли, но находятся вне поля ознакомительной статьи.

Вместо этого, я покажу вам как добавлять контроли не из XRC. Концепция такая же, как при использовании обычных виджетов, так что её очень просто понять. На самом деле, мы собираемся взять второй пример notebook и добавить на него PlateButton:

Учтите, что всё, что нам нужно было сделать – взять любой виджет панели XRC и сделать его перентом PlateButton. Затем мы добавили notebook и вертикально расположенный сайзер. Теперь вы знаете как комбинировать обычные виджеты и XRC-виджеты в ваших приложениях.

Итоги

К этому моменту вы должны понимать, как использовать XRC для создания вашего пользовательского интерфейса в wxPython. Он достаточно гибок и позволяет отделить вашу logic от вашего view, так что вы можете следовать парадигме model-view-controller. Я надеюсь, что данная статья дала вам массу полезных знаний, которые вы сможете применить в своей работе.