打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于 wxPython 中创建自定义事件步骤的理解,有一点疑问
 《wxPython in action》中提到创建自定义事件的步骤如下:

1、定义一个新的事件类,它是wxPython的wx.PyEvent类的子类。如果你想这个事件被作为命令事件,你可以创建wx.PyCommandEvent的子类。像许多wxPython中的覆盖一样,一个类的py版本使得wxWidget系统明白用Python写的覆盖C++方法的方法。

2、创建一个事件类型和一个绑定器对象去绑定该事件到特定的对象。

3、添加能够建造这个新事件实例的代码,并且使用ProcessEvent()方法将这个实例引入事件处理系统。一旦该事件被创建,你就可以像使用其它的wxPython事件一样创建绑定和处理器方法。


  1. import wx


  2. class TwoButtonEvent(wx.PyCommandEvent):   #1 定义事件         
  3.     def __init__(self, evtType, id):
  4.         wx.PyCommandEvent.__init__(self, evtType, id)
  5.         self.clickCount = 0

  6.     def GetClickCount(self):
  7.         return self.clickCount

  8.     def SetClickCount(self, count):
  9.         self.clickCount = count

  10. myEVT_TWO_BUTTON = wx.NewEventType() #2 创建一个事件类型   
  11. EVT_TWO_BUTTON = wx.PyEventBinder(myEVT_TWO_BUTTON, 1)  #3 创建一个绑定器对象

  12. class TwoButtonPanel(wx.Panel):
  13.     def __init__(self, parent, id=-1, leftText="Left",
  14.             rightText="Right"):
  15.         wx.Panel.__init__(self, parent, id)
  16.         self.leftButton = wx.Button(self, label=leftText)
  17.         self.rightButton = wx.Button(self, label=rightText,
  18.                                      pos=(100,0))
  19.         self.leftClick = False
  20.         self.rightClick = False
  21.         self.clickCount = 0
  22. #4 下面两行绑定更低级的事件
  23.         self.leftButton.Bind(wx.EVT_LEFT_DOWN, self.OnLeftClick)
  24.         self.rightButton.Bind(wx.EVT_LEFT_DOWN, self.OnRightClick)

  25.     def OnLeftClick(self, event):
  26.         self.leftClick = True
  27.         self.OnClick()
  28.         event.Skip()   #5 继续处理


  29.     def OnRightClick(self, event):
  30.         self.rightClick = True
  31.         self.OnClick()
  32.         event.Skip()   #6 继续处理


  33.     def OnClick(self):
  34.         self.clickCount += 1
  35.         if self.leftClick and self.rightClick:
  36.             self.leftClick = False
  37.             self.rightClick = False
  38.             evt = TwoButtonEvent(myEVT_TWO_BUTTON, self.GetId()) #7 创建自定义事件   
  39.             evt.SetClickCount(self.clickCount)   # 添加数据到事件
  40.             self.GetEventHandler().ProcessEvent(evt)  #8 处理事件

  41. class CustomEventFrame(wx.Frame):
  42.     def __init__(self, parent, id):
  43.         wx.Frame.__init__(self, parent, id, 'Click Count: 0',
  44.                           size=(300, 100))
  45.         panel = TwoButtonPanel(self)
  46.         self.Bind(EVT_TWO_BUTTON, self.OnTwoClick, panel) #9 绑定自定义事件  

  47.     def OnTwoClick(self, event):   #10 定义一个事件处理器函数                              
  48.         self.SetTitle("Click Count: %s" % event.GetClickCount())


  49. if __name__ == '__main__':
  50.     app = wx.PySimpleApp()
  51.     frame = CustomEventFrame(parent=None, id=-1)
  52.     frame.Show()
  53.     app.MainLoop()
复制代码


疑问 1:
------------------------------------------------------------------------------------------------------------------------------
EVT_TWO_BUTTON = wx.PyEventBinder(myEVT_TWO_BUTTON, 1)  #3 创建一个绑定器对象
------------------------------------------------------------------------------------------------------------------------------
这句中,给 PyEventBinder 传递一个参数 1 做啥?我试了一下,不给这个参数,直接使用默认参数 0,这个程序也可以正常运行。


疑问 2:
我自己对于事件处理步骤的理解:

1. 首先创建一个事件类。
2. 由于事件类本身需要两个参数:evtType 和 id,因此还需要再创建一个 evtType 并提供 id(这里的 id 就是触发事件的 widgets 的 id?我想不是,因为并不是每个 widgets 的构造函数都有 id 这个参数。那么,这个 id 到底是什么?)
3. 提供 evtType 和 id 后,即可实例化事件类,创建一个事件实例(例如对于鼠标事件来说,创建一个“鼠标左键按下”的实例)。然后通过 bind 函数,将具体的事件实例(例如鼠标左键按下事件)与某个事件处理函数绑定到一起。

不知道这样理解对不对?

疑问 3:
------------------------------------------------------------------------------------------------------------------------------
self.Bind(EVT_TWO_BUTTON, self.OnTwoClick, panel) #9 绑定自定义事件
------------------------------------------------------------------------------------------------------------------------------
我查了一下, bind 函数的参数如下:Bind(self, event, handler, source=None, id=-1, id2=-1),这里怎么用了一个绑定器对象 (EVT_TWO_BUTTON) 作为参数啦?
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
wxPython:python 首选的 GUI 库
wxPython:一曲MFC的挽歌,理想主义的绝唱
编写wxPython程序代码风格的说明
Linux wxPyhton指南(1)
wxpython 开发的记事本
燃爆了!wxPython PyOpenGL 打造三维数据分析的利器!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服