Использование ObjectListView вместо ListCtrl — wxPython #35

Не буду спорить wxPython ListCtrl – это очень удобный виджет, но иногда его бывает крайне неудобно использовать. Это утверждение побудило Филипа Пайпера, миссионера из Мозамбика, написать ObjectListView, враппер для wx.ListCtrl. Сейчас идея его использования активно поддерживается комьюнити пользователей wxPython.

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

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

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

Telegram Чат & Канал

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

Паблик VK

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

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

Стоит отметить, что ObjectListView не является заменой для стандартного контроля списков. Его настройка немного отличается. К счастью, вы можете установить ObjectListView используя pip.

Давайте взглянем на достаточно простой пример. Мы создадим простой класс, который ObjectListView будет использовать в качестве своей дата-модели.

Вы можете сохранить этот фрагмент в отдельный файл, или же сразу добавить в файл кода, который вы будете использовать по мере продвижения в этой статье. Всё, что этот класс делает, это определяет нашу дата-модель, которая будет совпадать с колонками в нашем виджете ObjectListView. Теперь мы переходим к коду wxPython:

Когда вы запустите этот код, то увидите приложение, которое должно выглядеть вот так:

Использование ObjectListView вместо ListCtrl - wxPython #35

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

Затем мы создаём стандартную панель и помещаем на неё ObjectListView и кнопочный виджет. Вы также заметите, что здесь есть короткий список объектов «Book». ObjectListView настроен на режим отчёта посредством флага стиля LC_REPORT. Также есть ещё два режима, но я не буду уделять им внимания в этой статье. Режим отчёта выглядит примерно также как режим деталей в Проводнике Windows.

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

Этот код приказывает нашему виджету разрешить редактирование всех ячеек в строке посредством двойного клика по ним. Я не знаю, почему он выглядит именно так, и почему в нём прописано, что вам нужно сделать лишь один клик. Даже документация говорит о том, что одного клика будет достаточно. Наверное, это какое-то ограничение Windows. В любом случае, чтобы отредактировать первую ячейку любой строки, просто выберите её и нажмите F2.

Последние несколько строк метода инициализации посвящены помещению виджетов в сайзеры. Следующим интересным фрагментом кода является метод updateControl, который собственно обновляет контент нашего ObjectListView. Здесь я показываю два разных способа обновления.

Первый: использование продуктивного листа объектов «Book» и вызов метода SetObjects, со вставленным в него списком. Второй: использование словаря. Ключи словаря должны соответствовать именам valueGetter в ColumnDefn (имена valueGetter вы могли заметить в методе setBooks). Значения словаря могут быть любыми. В моём примере, я действительно комбинирую список объектов «Book» и список словарей, а затем вызываю SetObjects для результатов.

В методе setBooks мы определяем колонки ObjectListView. Это делается посредством прохода списка объектов ColumnDefn через метод ObjectListView, который называется SetColumns. ColumnDefn обладает массой параметров, но нас интересуют только первые четыре из них.

Первый аргумент – заголовок колонки, второй аргумент – выравнивание всей колонки как единого целого, третий аргумент – это ширина колонки, четвёртый аргумент – это имя valueGetter. Имя должно соответствовать ключам в словаре (если вы используете метод со словарями, описанный выше) или свойствам класса, который вы используете (в нашем случае это класс Book). В обратном случае, некоторые данные могут не отобразиться в виджете.

Если вы хотите узнать больше о доступе к некоторой информации из объекта строки, тогда добавьте в своё приложение кнопку, а затем забиндите к ней соответствующую функцию:

Теперь вы можете выбрать строку и использовать метод ObjectListView, который называется GetSelectedObject, чтобы получить объект строки. Как только вы его получите – вам откроется доступ к свойствам объекта, таким как автор или заголовок, или что вы там у себя определяли. Таким образом всё получается гораздо проще, чем в ListCtrl, где нам нужно было получать колонку и строку, чтобы найти информацию о каждом итеме.

Итоги

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