wxPython一对一事件处理

一、认识事件

上次我们讲完了wx中的Panel面板,今天我们就来说一说关于事件。事件就是指在当前frame窗口中由用户与机器交互时人为产生的要求机器捕获并处理的动作,统称为事件,而机器捕获到事件称为捕获事件,机器捕获后对其执行称为响应事件,从捕获到响应这段时间称为响应时间,响应事件后要执行一些动作,通常为调用函数来实现反应用户的操作。事件通常可以是一个按钮被按下、鼠标移动、键盘按键捕获。wxPython可以处理的事件很多,这里不再过多叙述,大家可以另行了解,或查阅wxPython帮助文件。

事件处理的过程涉及4个要素:

  1. 事件。 它是用户对界面操作,在wxPython中事件被封装成事件类wx.Event及其子类,例如按钮事件类wx.CommandEvent。
  2. 事件类型。 事件类型给出了更多地信息,它是一个整数
  3. 事件源。 它是事件发生的场所,就是各个控件,例如按钮事件的事件源是按钮
  4. 事件处理者。 它是在wx.EvtHeadler子类(事件处理类)中定义的一个方法

认识了事件,我们下面来看看语法。

二、绑定事件

绑定事件,顾名思义,就是将控件和执行的方法关联在一起。那么如何绑定呢?就用wx提供的Bind函数来绑定就行了。话不多说,先上语法:

Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY) 

事件绑定后,单击绑定的控件,就可以执行相应的方法。
下面来讲讲Bind方法的参数:
1.self参数:指的是谁来绑定,self是自动传参,形参时写上,实参时不用,由于非常简单,这个不讲。
2.event参数:这里有一个易错点,注意参数event是一个事件类型,不是事件。
3.handler参数:指定处理函数,注意只写名称不带括号。
4.source参数:事件源,可省略,用id来指定控件。
5.id参数:该参数指定控件id,只能写一个。
6.id2参数:用于和id参数搭配指定范围,如id=1,id2=10是指id是1~10的控件都绑定到handler方法中。
下面,我们就分几种情况来认识一下事件处理。

三、事件处理

我们的事件处理分几种情况:一对一事件处理和一对多事件处理。
一对一事件处理程序是一个控件绑定一个方法上。
一对多是指一多个控件绑定在一个多个方法上。
我们这节课只讲述一对一事件处理。

下面我们来看具体的代码实现:

import wx
class MyFrame(wx.Frame):  #该对象继承于wx.Frame框架
	def __init__(self):
		super().__init__(parent=None,title="窗口",size=400,300),pos=(100,100))
		panel = wx.Panel(parent=self)#将父级容器定义为窗口(就是这个当前窗口对象self)
		statictext = wx.StaticText(parent=panel,label='文字1',pos=(20,20))#文字标签
		#TODO
class App(wx.App):        #该对象继承于wx.App框架
	def OnInit(self):     #直接实例化该对象并调用此函数,相当于显示,然后直接在main中进入主事件循环
		frame = MyFrame()#执行窗口定义
		frame.Show()
		return True
	def OnExit(self):     #可以在这里释放一些资源
		print("应用程序退出")
		return 0

if __name__ == '__main__':#判断是否是主进程
	app=App()
	app.MainLoop()         #在这里调用主事件循环

这是我们上节课的代码。上节课我们学习了Panel面板,编写了一个程序。我们也得出了一个结论:这应该就是自己编写的wxPython模板了吧?是的,我们以后再添加代码,就在TODO那里写代码就行了。那么今天,我们就用上次的框架为基础开始编写吧。
代码如下:

import wx
class MyFrame(wx.Frame):  #该对象继承于wx.Frame框架
	def __init__(self):
		super().__init__(parent=None,title="一对一事件处理",size=(300,180))
		self.Center()#居中设置
		panel = wx.Panel(parent=self)#将父级容器定义为窗口(就是这个当前窗口对象self)
		self.statictext = wx.StaticText(parent=panel,pos=(20,20))#标签没有内容,省略label标签
		b = wx.Button(parent=panel,label='按钮',pos=(100,50))
class App(wx.App):        #该对象继承于wx.App框架
	def OnInit(self):     #直接实例化该对象并调用此函数,相当于显示,然后直接在main中进入主事件循环
		frame = MyFrame()#执行窗口定义
		frame.Show()
		return True
	def OnExit(self):     #可以在这里释放一些资源
		print("应用程序退出")
		return 0

if __name__ == '__main__':#判断是否是主进程
	app=App()
	app.MainLoop()         #在这里调用主事件循环

我们来看看运行状况:wxPython一对一事件处理_第1张图片
还不错,但还没有绑定。下面来看看如何绑定:

import wx
class MyFrame(wx.Frame):  #该对象继承于wx.Frame框架
	def __init__(self):
		super().__init__(parent=None,title="一对一事件处理",size=(300,180))
		self.Center()#居中设置
		panel = wx.Panel(parent=self)#将父级容器定义为窗口(就是这个当前窗口对象self)
		self.statictext = wx.StaticText(parent=panel,pos=(20,20))#标签没有内容,省略label标签
		b = wx.Button(parent=panel,label='按钮',pos=(100,50))
		self.Bind(wx.EVT_BUTTON,self.on_click,b)
	def on_click(self,event):
		print(event)
		self.statictext.SetLabelText('Hello,World')
class App(wx.App):        #该对象继承于wx.App框架
	def OnInit(self):     #直接实例化该对象并调用此函数,相当于显示,然后直接在main中进入主事件循环
		frame = MyFrame()#执行窗口定义
		frame.Show()
		return True
	def OnExit(self):     #可以在这里释放一些资源
		print("应用程序退出")
		return 0

if __name__ == '__main__':#判断是否是主进程
	app=App()
	app.MainLoop()         #在这里调用主事件循环

我们定义的on_click函数中有一个event参数用于接受事件。而这个SetLabelText函数用于更改标签文字。

四、总结

这节课我们讲述了事件的绑定和处理,希望读者能从中学到知识,对事件处理进一步加深理解,感谢您的阅读!

你可能感兴趣的:(wxPython一对一事件处理)