最近捣鼓Python,也就自然捣鼓上了wxPython。我曾经用过Qt和Gtk+写GUI,但几乎所有的Python书都告诉我说最好用的是wxPython,我没有尝试PyQt和PyGtk就开始研究wxPython了。在Qt和Gtk+之间我更喜欢Qt,因为它跨平台做得很好,而且商业化也不错。但wxWidget给人的感觉就完全不同了。

如果说wxWidgets相对于Qt有什么优势的话,大概就只有体积较小了。从开发效率上看,如果不和Python组合真的比不上Qt;从商业支持上看wxWidgets根本没有。不过和Python组合之后,开发效率大大提高,虽然用来做很正式的商业软件并不合适,但写写小程序还是很方便的。

现在切入正题,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就显得很棘手了。

我并没有用C++写过wxWidgets的程序——确切地讲是复制过一个example的,但是不知道是我英语太差没能找到还是真的没有,我没有在wxWidgets的入门指南中找到编译指令,最后没法编译它。因此我不知道这个限制是不是C++也有,但是Python可以通过lambda来解决这个问题。以下的例子我用的是菜单。

首先我们建一个OnMenusClick函数:

def OnMenusClick(self, event, mark):....

这个函数多接收一个mark,绑定的时候,就不是把OnMenusClick直接绑定上去,而是传递一个被lambda包装过的函数。下面这个例子就会建立一堆Menu的按键,并给他们编号,OnMenusClick就可以接收到它们的编号了:

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,这样就能够实现给事件处理函数传递更多参数的目的了。

原文地址:

http://blog.segmentfault.com/sweetdum/1190000000487499

给wxPython事件处理函数传递参数相关推荐

  1. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  2. js中函数传递参数,究竟是值传递还是引用传递?

    记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!! 下面是js红包书里面的例子: function setName(obj) { obj.name = "Ni ...

  3. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  4. C++11向线程函数传递参数

    template< class Function, class... Args > explicit thread( Function&& f, Args&& ...

  5. pthread_create函数详解(向线程函数传递参数)

    一.pthread_create函数: 1.简介:pthread_create是UNIX环境创建线程的函数 2.头文件:#include <pthread.h> 3.函数声明: int p ...

  6. pthread_create函数的详细讲解(包括向线程函数传递参数详解)

    pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...

  7. python 函数传递参数的多种方法

    python中函数根据是否有返回值可以分为四种:无参数无返回值,无参数有返回值,有参数无返回值,有参数有返回值. Python中函数传递参数的形式主要有以下五种,分别为位置传递,关键字传递,默认值传递 ...

  8. c语言如何传递结构体指针,注意使用结构体指针给函数传递参数。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体. 最著名的例子就是用Win32API HANDLE CreateThrea ...

  9. [转]Delphi过程函数传递参数的几种方式

    在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 procedure TForm1.ProcNormal( ...

最新文章

  1. Android点击图标重新启动问题
  2. LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)
  3. 用户体验——减少用户的操作!
  4. C# ERROR.未能找到程序集“Microsoft.QualityTools.Testing.Fakes”。请检查磁盘上是否存在该程序集。
  5. ***检测与网络审计产品是孪生兄弟吗?
  6. Kolmogorov 的数学观与业绩
  7. 机器学习 之 客户分群案例
  8. C# 连接本地数据库
  9. android 指南针图片,如何在android中制作自定义指南针视图
  10. oracle 查询去年同期,问个算去年同期值的sql,该怎么处理
  11. 2021年上半年系统集成项目管理工程师上午试题参考解析(二)
  12. 一个公司有m名推销员,他们都推销n种不同的产品。其中m>=l;m<=100,n>=l,n<=10。每天,每个推销员都要为售出的每一种产品交上来一个卡片。
  13. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记39 AlertActionSheet
  14. 上学歌计算机音乐数字乐谱,儿童歌曲上学歌简谱
  15. 宇视阿宇摄像机夜间效果好吗?画面可以看清楚吗?
  16. webStrom 2018 激活破解(最新)
  17. XP计算机管理员账户隐藏了怎么办,xp administrator隐藏如何找回解决方案
  18. VMware虚拟机 linux NAT网络模式下 网关地址默认为192.168.1.2
  19. AI语音识别常见算法简介--目录参考
  20. 日语假名原来可以这么漂亮的书写(日语假名书写演示软件)

热门文章

  1. Hadoop For Windows
  2. 使用脚本编写 Vim 编辑器,第 4 部分: 字典
  3. Scala基础教程(三):访问修饰符、运算符
  4. 涉足计算机视觉领域要知道的
  5. 3分钟学会Mysql查询之表连接,左连接,右连接,内连接…
  6. 微信小程序中的渐变色
  7. Stack View 自定义间隙
  8. ync 小技巧-14-为用户启用统一的联系人存储库-Lync-无联系人
  9. CentOS环境下tomcat启动超级慢的解决方案
  10. Python补充01 序列的方法