pythonwx函数的简单介绍

wxpython中bind怎么传递参数函数触发

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

创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、做网站、班玛网络推广、小程序开发、班玛网络营销、班玛企业策划、班玛品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供班玛建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com

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

python wxpython/Image模块的问题

wx的Image中确实没有getNewBitmap这个函数。

你可以尝试一下wx.py.images模块下的getPyBitmap()函数,应该效果差不多。

import wx.py.images

help(wx.py.images.getPyBitmap)

Help on function getPyBitmap in module wx.py.images:

getPyBitmap(shellName='PyCrust')

====================================

或者你详细告知一下你要达到什么效果,应该能找到合适的替代函数或方法。

希望能帮到你!

python,wxpython的不同类间的数据传递问题

你问的是几个问题。ADD是wx frame的内部处理函数,不能从外部直接调用。具体原因,你可以查一下GUI的原理。GUI是一个事件驱动的封闭体系,是一个服务。你直接调用就破坏了人家的消息处理机制。所以是不允许的。

第二个问题就变量传递,在python里有多种办法,最简单的就是用global 修饰一个变量,这样就可以在不同的线程,不同的模块间直接使用。具体使用办法,你看一下帮助。 需要在使用前用global 指定要全局化的变量

第三个问题。点击按钮触发事件。这样的事情,直接在按钮事件处理函数里处理就可以了。不用调用外部函数。没有理由,也没有必要。

如果你希望让系统容易阅读一些,就把GUI的构建代码,事件处理代码,数据描述代码,业务逻辑代码分别写在不同的模块里。这就是典型的MVC模型。

还有一个简单的办法。shownum这个函数的入口,加一个参数,将frame传递进去。这样shownum就可以直接访问frame类的所有内置公开变量。打印更不在话下。

最后附带说明一下, 你的函数命名,变量命名一定要有意思。不要再用“按钮1”, “按钮2”, output这样的命名。 你的shownum命名就不错。

如何用python调用wxpython写的下拉框中的选项

你需要把你的ComboBox绑定(bind)一个动作,也就是一个需要执行的函数。把这个函数写成你需要的功能就可以了。

python中gui编程wx,事件函数怎样调用

可以用Bind方法

self.Bind(wx.EVT_BUTTON,self.OnAppend,button)

self是继承frame的类

OnAppend是定义的事件函数

button是在frame里增加的按钮

这里有详细介绍


文章标题:pythonwx函数的简单介绍
本文网址:http://scyanting.com/article/dooojdi.html