Как получить выбранные ячейки сетки — wxPython #54

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

Выбор ячеек сетки

Как получить выбранные ячейки сетки - wxPython #54

В интернете есть интересная статья, посвящённая данной теме. Вы можете прочесть её здесь: http://ginstrom.com/scribbles/2008/09/07/getting-the-selected-cells-from-a-wxpython-grid/ (или вот вариант покороче http://bit.ly/2eqafsB). Как бы то ни было, в ней встречается несколько проблем, которые мы и будем рассматривать. Вот, взгляните на код:

А теперь давайте разбираться со всем этим. В первую очередь, мы создаём объект сетки, который мы называем self.myGrid. Мы биндим два узконаправленных события: EVT_GRID_SELECT_CELL и EVT_GRID_RANGE_SELECT. Это сделано лишь с целью демонстрации, ведь обычно вам не нужно биндить EVT_GRID_SELECT_CELL. Для события выделения одной ячейки мы вызываем хэндлер onSingleSelect.

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

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

Telegram Чат & Канал

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

Паблик VK

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

В нём мы используем объект события, чтобы захватить правильные столбик и ряд. Если вы просматривали статью, ссылку на которую я давал выше, вы заметили, что они использовали GetGridCursorRow и GetGridCursorCol. Я обнаружил, что они лишь возвращают клетки, уже были выбраны ранее, а не ту, которая выбрана в данный момент. Именно по этой причине мы используем метод объекта события вместо предложенного.

Также учтите, что мы обновляем значение self.currentlySelectedCell до равному тому, что соответствует выбранной в данный момент ячейке.

Другое событие сетки привязано к onDragSelection. В данном хэндлере события мы вызываем метод сетки под названием GetSelectionBlockTopLeft() и проверяем, чтобы убедиться в том, что он что-то возвращает. Если не возвращает – то мы ничего больше и не делаем.

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

Учтите, что метод theprintSelectedCells не работает корректно в wxPython Phoenix.

Последний метод, достойный вашего внимания, это хэндлер события кнопки: onGetSelection. Данный метод вызывает метод сетки под названием GetSelectedCells(). Это вернёт клетки, которые были выделены кликами. Он также подойдёт, если пользователь выделил несколько клеток сразу. Если пользователь выбрал лишь одну клетку, тогда мы напечатаем self.currentlySelectedCell, так как он всегда идентичен значению текущего выбора.

Итоги

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