wxPython学习(3.一对一与一对多事件处理)

事件处理

在事件处理的过程中涉及4个要素:
1.事件。它是用户对界面的操作,在wxPython中事件被封装为事件类wx.Event及其子类。
例如按钮事件类是wx.CommandEvent,鼠标事件类是wx.MoveEvent。
2.事件类型。事件类型给出了事件的更多信息,它是一个整数。
例如鼠标事件wx.MoveEvent还可以有鼠标的右键按下(wx.EVT_LEFT_DOWN)和释放(wx.EVT_LEFT_UP)
3.事件源。它是事件发生的场所,就是各个控件,例如按钮事件的事件源就是按钮。
4.事件处理者。它是在wx.EvtHandler子类(事件处理类)中定义的一个方法。是一个处理程序。


绑定是通过事件处理类的Bind()方法实现,Bind()方法语法如下:
Bind(self,event,handler,source=None,id=wx.ID_ANY,id2=wx.ID_ANY)

self:当前对象绑定
event:事件类型,注意不是事件,例如鼠标左键按下或释放
handler:事件处理着,它对应到事件处理类中特定的方法,即事件处理方法
source:事件源,即各个控件
id:事件源的标识,可以省略source参数通过id绑定事件源,即事件源标识,比如按钮对象分配的id,具有唯一性
id2:设置要绑定事件源id范围,当有多个事件源绑定到同一个事件处理者时可以使用此参数,比如id~id2的范围内的控件都绑定到事件处理者上

一对一事件处理:
    一个事件源对应一个事件处理程序
    
代码:(点击ok按钮,在标签中显示hello world)

#一对一事件处理

import wx
#自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None,title="一对一事件处理",size=(400,300))
        #自定义frame,然后让它继承wxFrame,并提供构造方法
        self.Centre()#设置窗口居中
        
        #在frame中放一个面板,把其他控件和窗口放到面板中去
        panel = wx.Panel(parent=self)
        
        #把面板添加到某一个容器/窗口中,就让parent指向谁,parent为父容器/父窗口,self为当前的frame
        #statictext成员变量,因为要在onclick中访问
        self.statictext = wx.StaticText(parent=panel,pos=(110,20))
        #放一个静态文本框,相当于label,放到panel中,所以parent=panel,pos为位置
        
        b=wx.Button(parent=panel,label='OK',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):
    def OnInit(self):
        #创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True
    
    def OnExit(self):
        print('应用程序退出')
        return 0
    
#当前模块名是不是主模块,即应用程序的入口  
if __name__ == '__main__':
    app = App()#调用上面函数
    app.MainLoop()#进入主事件循环


一对多事件处理:
    多个按钮,可以每个按钮对应一个事件程序,也可以让一个事件处理程序对应多个按钮(事件源)
    
代码:(点击button1,在静态文本框中显示“button1 单击”,点击button2,在静态文本框中显示“button2 单击”)

#一对多事件处理,多个事件源绑定到同一个事件处理方法上

import wx
#自定义窗口类MyFrame
class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None,title="一对多事件处理",size=(400,300))
        #自定义frame,然后让它继承wxFrame,并提供构造方法
        self.Centre()#设置窗口居中
        
        #在frame中放一个面板,把其他控件和窗口放到面板中去
        panel = wx.Panel(parent=self)
        
        #把面板添加到某一个容器/窗口中,就让parent指向谁,parent为父容器/父窗口,self为当前的frame
        #statictext成员变量,因为要在onclick中访问
        self.statictext = wx.StaticText(parent=panel,pos=(110,20))
        #放一个静态文本框,相当于label,放到panel中,所以parent=panel,pos为位置
        
        #这使用的坐标都是绝对坐标,属于绝对布局
        b1=wx.Button(parent=panel,id=10,label='button1',pos=(100,45))
        b2=wx.Button(parent=panel,id=11,label='button2',pos=(100,85))
        #每个控件和窗口都有id,只是有时不设置,由系统自动为其设置
        
        #绑定事件有两种方法,1.分两次绑定,一对一,按钮很多会很麻烦

        #self.Bind(wx.EVT_BUTTON,self.on_click,b1)#当前对象调用绑定方法
        #self.Bind(wx.EVT_BUTTON,self.on_click,b2)
        
        #2.指定id,由id来绑定
        self.Bind(wx.EVT_BUTTON,self.on_click,id=10,id2=20)
        
        
        
    def on_click(self,event):
        #获取事件源id
        source_id =  event.GetId()
        
        print(source_id)
        if source_id == 10:           
            self.statictext.SetLabelText('button1 单击')
        else:
            self.statictext.SetLabelText('button2 单击')
#应用程序对象自定义,可以捕获应用程序生命周期
class App(wx.App):
    def OnInit(self):
        #创建窗口对象
        frame = MyFrame()
        frame.Show()
        return True
    
    def OnExit(self):
        print('应用程序退出')
        return 0
    
#当前模块名是不是主模块,即应用程序的入口  
if __name__ == '__main__':
    app = App()#调用上面函数
    app.MainLoop()#进入主事件循环

 

 

posted @ 2019-04-18 21:29  highlightyys  阅读(25)  评论(0编辑  收藏  举报