wxPython事件处理

一个事件是否向上展开至容器级,这是每个事件实例的一个动态属性,尽管实际上默认值几乎总是使用那几个。默认情况,只有wx.CommandEvent及其子类的实例向上展开至容器级。其它的所有事件不这样做。


1、按钮敲击事件得到处理。

wx.Button上敲击鼠标产生一个命令类型的事件wx.EVT_BUTTON由于wx.EVT_BUTTON属于一个wx.CommandEvent,所以wxPython在这个按钮对象中找寻绑定失败后,它将向上展开至容器级,先是按钮的父窗口panel。由于panel中没有相匹配的绑定,所以又向上至panel的父窗口frame。由于frame中有匹配的绑定,所以ProcessEvent()调用相关函数OnButtonClick()


2为什么鼠标进入和离开事件必须被绑定到按钮而不是框架?

由于鼠标事件不是wx.CommandEvent的子类,所以鼠标进入和离开事件不向上展开至容器级。如果鼠标进入和离开事件被绑定到了框架,那么当鼠标进入或离开框架时,wxPython触发鼠标进入或离开事件不向上展开至容器级。如果鼠标进入和离开事件被绑定到了框架,那么当鼠标进入或离开框架时,wxPython触发鼠标进入或离开事件


命令事件是被优先对待的。因为它们被认为是高级事件,表示用户正在应用程序空间中做一些事,而非窗口系统。窗口系统类型事件只对窗口部件感兴趣,而应用级事件对容器级。我们可以在任何地方声明绑定,不管被绑定的是什么对象或什么对象定义事件处理器。例如,即使这个绑定的鼠标敲击事件针对于按钮对象,而绑定则被定义在这个框架类中,且调用这个框架内的方法。换句话说,低级的非命令事件通常用于窗口部件或一些系统级的通知,如鼠标敲击、按键按下、绘画请求、调整大小或移动。另一方面,命令事件,如在按钮上敲击鼠标、或列表框上的选择,通常由窗口部件自己生成。例如,在适当的窗口部件上按下和释放鼠标后,按钮命令事件产生。

使用Skip()方法
事件的第一个处理器函数被发现并执行完后,该事件处理将终止,除非在处理器返回之前调用了该事件的Skip()方法。调用Skip()方法允许另外被绑定的处理器被搜索,搜索依据3.4.1节中的第四步中声明的规则,因此父类和父窗口被搜索,就如同这第一个处理器不存在一样。在某些情况下,你想继续处理事件,以便原窗口部件的默认行为和你定制的处理能被执行。下面的例子显示了一个使Skip()的例子,它使得程序能够同时响应同一按钮上的鼠标左按键按下和按钮敲击。


import wx
                        
class DoubleEventFrame(wx.Frame): 
	def __init__(self, parent, id): 
		wx.Frame.__init__(self, parent, id, ’Frame With Button’, size=(300, 100)) 
		self.panel = wx.Panel(self, -1) 
		self.button = wx.Button(self.panel, -1, ”Click Me”, pos=(100, 15)) 
		self.Bind(wx.EVT_BUTTON, self.OnButtonClick, self.button) #1 绑定按钮敲击事件 
		self.button.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown) #2 绑定鼠标左键按下事件 
	def OnButtonClick(self, event): 
		self.panel.SetBackgroundColour(‘Green’) 
		self.panel.Refresh()

                          
	def OnMouseDown(self, event):
                          
		self.button.SetLabel(“Again!”) 
		event.Skip() #3 确保继续处理

                          
if __name__ == '__main__':
     
	app = wx.PySimpleApp()
     	frame = DoubleEventFrame(parent=None, id=-1)
     	frame.Show()
     	app.MainLoop()


 
  
#1这行绑定按钮敲击事件到OnButtonClick()处理器,这个处理器改变框架的背景色。
#2这行绑定鼠标左键按下事件到OnMouseDown()处理器,这个处理器改变按钮的标签文本。由于鼠标左键按下事件不是命令事件,所以它必须被绑定到按钮(self.button.Bind)而非框架(self.Bind
#3当用户在按钮上敲击鼠标时,通过直接与底层操作系统交互,鼠标左键按下事件首先被产生。通常情况下,鼠标左键按下事件改变按钮的状态,随着鼠标左键的释放,产生了wx.EVT_BUTTON敲击事件。由于行#3Skip()
句, DoubleEventFrame维持处理。没有Skip()语句,事件处理规则发现在#2创建的绑定,而在按钮能产生wx.EVT_BUTTON事件之前停止。由于Skip()的调用,事件处理照常继续,并且按钮敲击被创建。
*记住,当绑定低级事件时如鼠标按下或释放, wxPython期望捕获这些低级事件以便生成进一步的事件,为了进一步的事件处理,你必须调用Skip()法,否则进一步的事件处理将被阻止。











你可能感兴趣的:(wxPython)