最近捣鼓Python,也就天然捣鼓上了wxPython。我曾经用过Qt和Gtk+写GUI,但几乎全部的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了。在Qt和Gtk+之间我更喜欢Qt,由于它跨平台作得很好,并且商业化也不错。但wxWidget给人的感受就彻底不一样了。小程序
若是说wxWidgets相对于Qt有什么优点的话,大概就只有体积较小了。从开发效率上看,若是不和Python组合真的比不上Qt;从商业支持上看wxWidgets根本没有。不过和Python组合以后,开发效率大大提升,虽然用来作很正式的商业软件并不合适,但写写小程序仍是很方便的。函数
如今切入正题,wxWidgets是一个事件驱动的体系,对于触发的事件,须要给它挂上相应的事件处理函数。在Python中这个函数的形式是这样的:code
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就显得很棘手了。get
我并无用C++写过wxWidgets的程序——确切地讲是复制过一个example的,可是不知道是我英语太差没能找到仍是真的没有,我没有在wxWidgets的入门指南中找到编译指令,最后无法编译它。所以我不知道这个限制是否是C++也有,可是Python能够经过lambda来解决这个问题。如下的例子我用的是菜单。编译
首先咱们建一个OnMenusClick函数:入门
def OnMenusClick(self, event, mark): ....
这个函数多接收一个mark,绑定的时候,就不是把OnMenusClick直接绑定上去,而是传递一个被lambda包装过的函数。下面这个例子就会创建一堆Menu的按键,并给他们编号,OnMenusClick就能够接收到它们的编号了:event
menu=wx.Menu() for i in range(0,N): btn=menu.Append(wx.NewId(), str(i)) self.Bind(wx.EVT_MENU, lambda evt, mark=i : self.OnMenusClick(evt,mark) ,btn )
完成了!是否是感受有点magic?关键在于这句lambda效率
lambda evt, mark=i : self.OnMenusClick(evt,mark)
这句实际上产生了只接收evt一个参数的函数,并将其传递给了self.OnMenusClick,这样就可以实现给事件处理函数传递更多参数的目的了。