在使用wxPython进行GUI编程时,我们经常需要处理按钮点击事件。通常情况下,我们会使用一个事件处理函数来处理所有按钮的点击事件。但是,如果我们有50个按钮,那么在事件处理函数中使用长长的if/elif语句来判断哪个按钮被点击了,就会变得非常繁琐。
2、解决方案
我们可以使用以下几种方法来获取调用事件的按钮名称:
- 给按钮设置名称
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()
- 使用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()
- 使用字典
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()
- 使用不同的事件处理函数
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()