获取触发事件的按钮名称的最佳方法?
在下面的代码中(灵感来源于这个代码片段),我使用了一个事件处理器buttonClick
来改变窗口的标题。目前,我需要判断事件的Id是否和按钮的Id对应。如果我决定添加50个按钮,而不是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.Bind(wx.EVT_BUTTON, self.buttonClick)
self.button2 = wx.Button(self.panel1, id=-1,
pos=(40, 20), size = (20,20))
self.button2.Bind(wx.EVT_BUTTON, self.buttonClick)
self.Show(True)
def buttonClick(self,event):
if event.Id == self.button1.Id:
self.SetTitle("Button 1 clicked")
elif event.Id == self.button2.Id:
self.SetTitle("Button 2 clicked")
application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()
7 个回答
7
我建议你为每个按钮使用不同的事件处理器来处理事件。如果这些按钮的处理逻辑有很多相似的地方,你可以把这些相似的部分放到一个函数里,这个函数会返回一个具有特定行为的函数。例如:
def goingTo(self, where):
def goingToHandler(event):
self.SetTitle("I'm going to " + where)
return goingToHandler
def __init__(self):
buttonA.Bind(wx.EVT_BUTTON, self.goingTo("work"))
# clicking will say "I'm going to work"
buttonB.Bind(wx.EVT_BUTTON, self.goingTo("home"))
# clicking will say "I'm going to home"
8
好好利用像Python这样的编程语言的特性。你可以给你的事件回调函数传递额外的参数,像这样。
import functools
def __init__(self):
# ...
for i in range(10):
name = 'Button %d' % i
button = wx.Button(parent, -1, name)
func = functools.partial(self.on_button, name=name)
button.Bind(wx.EVT_BUTTON, func)
# ...
def on_button(self, event, name):
print '%s clicked' % name
当然,这些参数可以是你想要的任何东西。
13
你可以给按钮起个名字,然后在事件处理程序中查看这个名字。
当你创建按钮的时候:
b = wx.Button(self, 10, "Default Button", (20, 20))
b.myname = "default button"
self.Bind(wx.EVT_BUTTON, self.OnClick, b)
当按钮被点击时:
def OnClick(self, event):
name = event.GetEventObject().myname