JcM*_*aco 4 python events user-interface wxpython event-handling
在下面的代码(灵感来自这个片段),我用一个单一的事件处理程序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()
Run Code Online (Sandbox Code Playgroud)
tom*_*m10 11
您可以为按钮指定名称,然后查看事件处理程序中的名称.
当你按下按钮
b = wx.Button(self, 10, "Default Button", (20, 20))
b.myname = "default button"
self.Bind(wx.EVT_BUTTON, self.OnClick, b)
Run Code Online (Sandbox Code Playgroud)
单击按钮时:
def OnClick(self, event):
name = event.GetEventObject().myname
Run Code Online (Sandbox Code Playgroud)
利用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
Run Code Online (Sandbox Code Playgroud)
当然,争论可以是你想要的任何东西.
我建议您使用不同的事件处理程序来处理每个按钮的事件.如果存在很多共性,则可以将其组合到一个函数中,该函数返回具有所需特定行为的函数,例如:
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"
Run Code Online (Sandbox Code Playgroud)