Статьи

wxPython: привязка нескольких виджетов к одному и тому же обработчику

Если вы были в сообществе wxPython более пары месяцев, вы, вероятно, узнаете следующий вопрос: «Как связать несколько кнопок с одним и тем же обработчиком событий и заставить их делать разные вещи?» Ну, эта статья покажет вам, как это сделать.

Примечание. Эта статья основана на некотором коде из предыдущей статьи о кнопках этого самого блога!

Давайте начнем

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

import wx
 
########################################################################
class MyForm(wx.Frame):
 
    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Button Tutorial")
        panel = wx.Panel(self, wx.ID_ANY)
 
        sizer = wx.BoxSizer(wx.VERTICAL)
        buttonOne = wx.Button(panel, label="One", name="one")
        buttonTwo = wx.Button(panel, label="Two", name="two")
        buttonThree = wx.Button(panel, label="Three", name="three")
        buttons = [buttonOne, buttonTwo, buttonThree]
 
        for button in buttons:
            self.buildButtons(button, sizer)
 
        panel.SetSizer(sizer)
 
    #----------------------------------------------------------------------
    def buildButtons(self, btn, sizer):
        """"""
        btn.Bind(wx.EVT_BUTTON, self.onButton)
        sizer.Add(btn, 0, wx.ALL, 5)
 
    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        This method is fired when its corresponding button is pressed
        """
        button = event.GetEventObject()
        print "The button you pressed was labeled: " + button.GetLabel()
        print "The button's name is " + button.GetName()
 
        button_id = event.GetId()
        button_by_id = self.FindWindowById(button_id)
        print "The button you pressed was labeled: " + button_by_id.GetLabel()
        print "The button's name is " + button_by_id.GetName()
 
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

Для начала мы создаем три объекта кнопки. Затем, чтобы сделать вещи немного менее беспорядочными, мы помещаем их в список и перебираем список, чтобы добавить кнопки в классификатор и связать их с обработчиком событий. Это хороший способ сократить объем кода спагетти (т. Е. Скопировать и вставить код) и сделать его немного чище и проще в отладке. Некоторые люди идут дальше и создают некоторые сложные вспомогательные методы, такие как buildButton, которые могут обрабатывать другие виджеты и являются более гибкими.

Тем не менее, часть, о которой мы действительно заботимся, это сам обработчик событий. Самый простой способ получить виджет в обработчике события — вызвать метод GetEventObject () объекта события . Это вернет виджет, и тогда вы сможете делать все что угодно. Некоторые люди будут изменять значение или метку виджета, другие будут использовать идентификатор или уникальное имя виджета и настраивать некоторые условные структуры, чтобы что-то делать, если нажата эта кнопка, и делать что-то еще, если нажата другая кнопка. Функциональность зависит от вас.

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

Завершение

Теперь вы знаете «секрет» привязки нескольких виджетов к одному и тому же обработчику событий. Идите вперед и закодируйте, как будто завтра нет, и создайте что-то удивительное! Код можно скачать в репозитории Mercurial нового блога .

Дополнительные ресурсы

Источник: http://www.blog.pythonlibrary.org/2011/09/20/wxpython-binding-multiple-widgets-to-the-same-handler/