Помещаем объекты в виджеты ComboBox или ListBox — wxPython #43

автор

Эта статья появилась в результате обсуждения на IRC-канале wxPython, темой которой было помещение объектов в wx.ListBox. Позже, в этой же день, я наткнулся на аналогичный вопрос на StackOverflow, только там речь шла уже о wx.ComboBox. К счастью, оба эти виждета являются наследниками wx.ItemContainer и содержат метод Append, который позволяет вам ассоциировать объект с итемом в этих виджетах. Сейчас я расскажу вам как это делается!

Добавляем объекты в wx.ListBox

Мы начнём с ListBox. Сразу переходи к коду, я думаю, что так вам будет проще понять происходящее.

Теперь к тому, как это работает. Давайте потратим немного времени и в деталях разберём предложенный мной пример. Во-первых, мы создаём сверх-простой класс Car, в котором мы обозначаем четыре атрибута: id, модель, марку и год. Затем мы создаём простую рамку с панелью, на которой расположен виджет ListBox.

Как вы видите, мы используем унаследованный им метод, который называется Append, чтобы добавить к объекту «Марка» стринг, а потом уже и сам объект. Наконец, мы биндим ListBox к EVT_LISTBOX, чтобы мы могли понять, как получит доступ к объекту, когда мы выбираем итем из виджета.

Чтобы увидеть полную картинку, вам нужно ознакомиться с методом onSelect. Здесь мы можем увидеть, что нам нужно вызвать метод ListBox, который называется GetClientData и пропустить через него данные из текущей секции. Это вернёт объект, с которым мы ассоциировали ранее. Теперь мы получает доступ ко всем атрибутам метода. В нашем примере, мы просто печатаем это всё в stdout. Теперь давайте узнаем, как сделать то же самое, но используя wx.ComboBox.

Добавляем объекты в wx.ComboBox

Код для wx.ComboBox практический такой же, поэтому, забавы ради, мы его немного переработаем. Взгляните:

В данном примере, шаги точь-в-точь такие же, как и в предыдущем. Но что нам делать в случае, когда у на нас несколько ComboBox? Будет очень много лишнего кода. Таким образом, нам нужно написать простой вспомогательный метод, который называется widgetMaker, который сам выделит события и забиндит их вместо нас.

Мы можем заставить его встраивать виджеты, добавлять их в сайзеры, и ещё многое другое, но нашего примера это не касается вовсе. Как бы то ни было, чтобы всё заработало, мы пропускаем через виджет ComboBox список объектов, которые мы хотим добавить в этот виджет. widgetMaker выделит все эти объекты и перенесёт их в ComboBox вместо нас. В остальном – код полностью идентичен прошлому примеру, различие лишь в событии, к которому нам нужно было всё это привязать.

Итоги

Как вы могли заметить, это весьма прямолинейное маленькое упражнение, но оно делает интерфейс вашего приложения более простым и понятным для конечного пользователя. Эти знания можно использовать при создании приложений баз данных. Я чётко вижу, как совместить это с наборами результатов SqlAlchemy. Будьте креативными и, я уверен, вы найдёте ещё массу применений для данных умений!

Вам может быть интересно

Scroll Up