一对多事件处理

一、导入

我们上次简单讲述了一对一事件处理,今天我们来讲一讲一对多事件处理。

二、一对多处理简介

无按钮按下按钮1按下按钮2按下
在这个界面中,有两个按钮和一行文字标签。初始是“无按键按下”,当点击button1时,文字标签的内容改变了为“按钮1按下”,button2亦是如此。
我们上次也讲过绑定事件,可以使用一个控件绑定一个事件处理者。但是现在呢,我们也可以使用多个控件绑定一个事件处理者。这就是一对多事件处理。

三、具体案例

以下是我们上一次写的代码:

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=(110,15))#标签没有内容,省略label标签
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50))
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70))
		#self.Bind(wx.EVT_BUTTON,self.on_click,)
	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()         #在这里调用主事件循环

我们这里声明了两个按钮,暂时不绑定事件。
如果我们声明了许多按钮,而功能差不多,就需要绑定很多次,不仅代码多,而且可读性很差。这是,就可以用到一对多事件处理。
还记得Bind函数中,可通过id进行绑定的情况吗?没错,就是通过id来绑定,我们来回顾一下Bind函数原型:

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

而这个id参数和id2参数就是用来指定id范围的,例如:我声明了100个按钮,id是连续的从零开始的自然数,我要绑定,就可以使用范围绑定,把id=0,id2=99就可以了。注意,在声明按钮时,不要再将id设为-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=(110,15))#标签没有内容,省略label标签
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50),id=1)
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70),id=2)
		self.Bind(wx.EVT_BUTTON,self.on_click,id=1,id2=2)#从id为1的到id为2的统统绑定到on_click事件上
	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()         #在这里调用主事件循环

但是呢,这个两个按钮肯定是有所不同的,如何区分呢?既然id是按钮的标识,那我们还用id进行区分。我们在调用on_click函数时,传入了一个event参数,这个event参数有一个GetId()函数,利用该函数来进行区分。

def on_click(self,event):
	event_id=event.GetId()
	print(event_id)
	if event_id==1:
		self.statictext.SetLabelText('按钮1按下')
	else:
		self.statictext.SetLabelText('按钮2按下')

这时,event_id变量记录着该控件的id。我们可以通过判断来决定将文字标签更改为什么。完整代码如下:

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=(110,15))#标签没有内容,省略label标签
		b1 = wx.Button(parent=panel,label='Button1',pos=(100,50),id=1)
		b2 = wx.Button(parent=panel,label='Button2',pos=(120,70),id=2)
		self.Bind(wx.EVT_BUTTON,self.on_click,id=1,id2=2)#从id为1的到id为2的统统绑定到on_click事件上
	def on_click(self,event):
        event_id=event.GetId()
	print(event_id)
	if event_id==1:
		self.statictext.SetLabelText('按钮1按下')
	else:
		self.statictext.SetLabelText('按钮2按下')
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()         #在这里调用主事件循环

四、结束语

今天我们讲了关于一对多的事件处理,希望大家能自行进一步研究一对多处理。感谢您的阅读!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值