如何获取调用事件的按钮名称?

81 阅读1分钟

在使用wxPython进行GUI编程时,我们经常需要处理按钮点击事件。通常情况下,我们会使用一个事件处理函数来处理所有按钮的点击事件。但是,如果我们有50个按钮,那么在事件处理函数中使用长长的if/elif语句来判断哪个按钮被点击了,就会变得非常繁琐。

2、解决方案

我们可以使用以下几种方法来获取调用事件的按钮名称:

  1. 给按钮设置名称
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        self.button1 = wx.Button(self.panel1, id=-1,
            pos=(10, 20), size = (20,20))
        self.button1.name = "Button 1"
        self.button1.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.button2 = wx.Button(self.panel1, id=-1,
            pos=(40, 20), size = (20,20))
        self.button2.name = "Button 2"
        self.button2.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.Show(True)

    def buttonClick(self,event):
        button_name = event.GetEventObject().name
        self.SetTitle(button_name + " clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()
  1. 使用functools.partial
import wx
import functools

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        for i in range(2):
            name = 'Button %d' % i
            button = wx.Button(self.panel1, id=-1, label=name)
            func = functools.partial(self.buttonClick, name=name)
            button.Bind(wx.EVT_BUTTON, func)

        self.Show(True)

    def buttonClick(self, event, name):
        self.SetTitle(name + " clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()
  1. 使用字典
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        self.buttons = {}

        self.button1 = wx.Button(self.panel1, id=-1,
            pos=(10, 20), size = (20,20))
        self.buttons[self.button1.Id] = "Button 1"
        self.button1.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.button2 = wx.Button(self.panel1, id=-1,
            pos=(40, 20), size = (20,20))
        self.buttons[self.button2.Id] = "Button 2"
        self.button2.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.Show(True)

    def buttonClick(self,event):
        button_name = self.buttons[event.Id]
        self.SetTitle(button_name + " clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()
  1. 使用不同的事件处理函数
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        self.button1 = wx.Button(self.panel1, id=-1,
            pos=(10, 20), size = (20,20))
        self.button1.Bind(wx.EVT_BUTTON, self.button1Click)

        self.button2 = wx.Button(self.panel1, id=-1,
            pos=(40, 20), size = (20,20))
        self.button2.Bind(wx.EVT_BUTTON, self.button2Click)

        self.Show(True)

    def button1Click(self,event):
        self.SetTitle("Button 1 clicked")

    def button2Click(self,event):
        self.SetTitle("Button 2 clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()