博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
给wxPython事件处理函数传递参数
阅读量:5320 次
发布时间:2019-06-14

本文共 2190 字,大约阅读时间需要 7 分钟。

给wxPython事件处理函数传递参数

 
2014-04-30 07:47:08segmentfault-博客--点击数:39       (转载)
 
 
 

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

 

def OnClick(evt,agrv):    print agrv    print evt    def func(evt,function):    function(evt)    func(2,lambda evt,argv=4:OnClick(evt,argv))

 

#!/usr/bin/env python# !-*-coding:utf-8-*-__author__ = 't'import time""" 过了某段时间案就执行 callback"""def func(t, callback, arg):    time.sleep(t)    callback(arg)def test(name,other):    print "my name is %s" %name    print other    print "well done!"# now, I want to pass some params to callback, how?func(2,lambda name,other="asdf":test(name,other),"nihao")

 

转载于:https://www.cnblogs.com/canbefree/p/4029553.html

你可能感兴趣的文章
音视频基础知识(一)
查看>>
JAVA⑤
查看>>
CyclicBarrier的使用
查看>>
Intent 传值和 Bundle传值的区别
查看>>
thinkphp的select和find的区别
查看>>
小程序开发笔记
查看>>
Web框架高级功能之模板、拦截器、Json、打包
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
JSON和GSON操作json数据
查看>>
对于计算机考研似乎每个人都有话说
查看>>
安装scikit-learn过程记录
查看>>
数据库的标识符可以有多长
查看>>
新手村之循环!循环!循环!
查看>>
在创业公司上班的感受
查看>>
Shell脚本
查看>>
masm32V11配置
查看>>
ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath
查看>>
Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
查看>>
通过Python、BeautifulSoup爬取Gitee热门开源项目
查看>>
正则表达式的用法
查看>>