Прикрепляем несколько виджетов к одному хэндлэру — wxPython #17

автор

Иногда вам нужно, чтобы несколько кнопок вызывали один и тот же хэндлер событий. Обычно это происходит если у вас в программе несколько кнопок со схожими задачами. В некоторых случаях стоит привязать и кнопку закрытия окна, и итем закрытия окна в меню к одному и тому же хэндлеру событий, чтобы не писать разные фрагменты кода для выполнения одинаковых задач. Для этого нужно ознакомиться с принципом Don’t Repeat Yourself (DRY), что переводится как «Не повторяй себя».

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

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

Сначала мы создаём 3 объекта кнопок. Чтобы избавится от лишней суеты, мы сразу помещаем их в список, а затем повторяем внутри списка, чтобы добавить кнопки в сайзер и привязать их к хэндлеру событий. Это отличный способ сокращения скопированного и вставленного кода, ведь так он выглядит чище и в нём проще искать баги. Иногда люди на этом не останавливаются и применяют сложные продуманные вспомогательные методы вроде buildButtons, ведь он может работать со многими виджетами, что делает программирование более гибким.

Часть, на которую нам стоит обратить внимание – это сам хэндлер событий. Самый простой способ поместить виджет в хэндлер событий называется методом GetEventObject. Он вернёт виджет и вы сможете делать всё, что захотите. Некоторые люди меняют значение или ярлык виджета, другие используют ID виджета или уникальное имя и добавляют различные условные структуры, которые запускают определённое действие при нажатии кнопки. То есть функциональность полностью зависит исключительно от вас.

Второй способ получить виджет – двухэтапный процесс, в рамках которого нам нужно сначала извлечь ID из события используя метод GetID(). Затем же мы передаём результаты в наш объект фрейма, используя метод FindWindowById() и мы снова have the widget in question

Итоги

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

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

Scroll Up