参考链接: https://wenda.so.com/q/1460394898725590
wxWidgets是一个事件驱动的体系,对于触发的事件,需要给它挂上相应的事件处理函数。在Python中这个函数的形式是这样的:
wx.Frame.Bind(self, event, handler, source=None, id=-1, id2=-1)
在一般使用时,我们基本上只会给定event、handler和source,event是事件的名称,handler是处理函数,source是事件的发生者,比如一个Button1被单击而发生了EVT_BUTTON事件,如果我们用self.OnButton1()来处理,会这么写:
self.Bind(wx.EVT_BUTTON, self.OnButton1, self.Button1)
这里self是一个Frame(wxPython中的窗体这样的东西),而Button1是放在这个Frame下面的一个Button,self.OnButton1就是事件处理函数。而wxPython定死了事件处理函数的形式:
def handler(self,event):
...
事件处理函数只能接受两个参数,一个还是self。至于event,一看就知道是那个发生的事件。但这样就有一个问题了:如果我想批量创建一些按钮或者菜单键(我想这种事情是很普遍的),并且希望用同一个函数来处理它们,这个函数该怎样辨别是哪个按钮触发的事件呢?显然我们希望能多传一些参数。Qt实现这一点很容易,但wxWidgets就显得很棘手了
现在我们要利用lambda函数增加传值参数.
实例代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
__author__ = 'huangbinghe@gmail.com'
import wx
class TestFrm(wx.Frame):
"""TestFrm"""
def __init__(self, *arg, **kw):
super().__init__(*arg, **kw)
panel = wx.Panel(self, -1)
box = wx.BoxSizer(wx.VERTICAL)
for i in range(5):
btn = wx.Button(panel, -1, label="test-{}".format(i))
btn.Bind(wx.EVT_BUTTON, lambda e, mark=i: self.on_click(e, mark))
box.Add(btn, 0, wx.LEFT)
panel.SetSizer(box)
def on_click(self, event, mark):
wx.MessageDialog(self, 'click mark:{}'.format(
mark), 'click btn', wx.ICON_INFORMATION).ShowModal()
if __name__ == '__main__':
app = wx.App()
frm = TestFrm(None, title="hello world")
frm.Show()
app.MainLoop()
关键代码:
btn.Bind(wx.EVT_BUTTON, lambda e, mark=i: self.on_click(e, mark))