wxpython Bind增加传参

参考链接: 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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值