wxPython:一曲MFC的挽歌,理想主义的绝唱( 五 )


鼠标事件:鼠标左右中键和滚轮动作 , 以及鼠标移动等事件
键盘事件:用户敲击键盘产生的事件
控件事件:发生在控件上的事件 , 比如按钮被按下、输入框内容改变等
系统事件:关闭窗口、改变窗口大小、重绘、定时器等事件
事实上 , 这个分类方法不够严谨 。 比如 , wx.Frame作为一个控件 , 关闭和改变大小也是控件事件 , 不过这一类事件通常都由系统绑定了行为 。 基于此 , 可以重新定义所谓的控件事件 , 是指发生在控件上的、系统并未预定义行为的事件 。
常用的鼠标事件包括:
wx.EVT_LEFT_DOWN-左键按下
wx.EVT_LEFT_UP-左键弹起
wx.EVT_LEFT_DCLICK-左键双击
wx.EVT_RIGHT_DOWN-右键按下
wx.EVT_RIGHT_UP-右键弹起
wx.EVT_RIGHT_DCLICK-右键双击
wx.EVT_MOTION-鼠标移动
wx.EVT_MOUSEWHEEL-滚轮滚动
wx.EVT_MOUSE_EVENTS-所有的鼠标事件
常用的键盘事件有:
wx.EVT_KEY_DOWN-按键按下
wx.EVT_KEY_UP-按键弹起
常用的系统事件包括:
wx.EVT_CLOSE-关闭
wx.EVT_SIZE-改变大小
wx.EVT_TIMER-定时器事件
wx.EVT_PAINT-重绘
wx.EVT_ERASE_BACKGROUND-背景擦除
常用的控件事件包括:
wx.EVT_BUTTON-点击按钮
wx.EVT_CHOICE-下拉框改变选择
wx.EVT_TEXT-输入框内容改变
wx.EVT_TEXT_ENTER-输入框回车
wx.EVT_RADIOBOX-单选框改变选择
wx.EVT_CHECKBOX-点击复选框
4.2事件绑定
事件驱动机制有三个要素:事件、事件函数和事件绑定 。 比如 , 当一个按钮被点击时 , 就会触发按钮点击事件 , 该事件如果绑定了事件函数 , 事件函数就会被调用 。 所有的事件函数都以事件对象为参数 , 事件对象提供了事件的详细信息 , 比如键盘按下事件的事件对象就包含了被按下的键的信息 。
下面这个例子演示了如何定义事件函数 , 以及绑定事件和事件函数之间的关联关系 。
importwxclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE)self.SetTitle('事件和事件函数的绑定')self.SetIcon(wx.Icon('res/wx.ico'))self.SetBackgroundColour((224,224,224))#设置窗口背景色self.SetSize((520,220))self._init_ui()self.Center()def_init_ui(self):"""初始化界面"""wx.StaticText(self,-1,'第一行输入框:',pos=(40,50),size=(100,-1),style=wx.ALIGN_RIGHT)wx.StaticText(self,-1,'第二行输入框:',pos=(40,80),size=(100,-1),style=wx.ALIGN_RIGHT)self.tip=wx.StaticText(self,-1,u'',pos=(145,110),size=(150,-1),style=wx.ST_NO_AUTORESIZE)self.tc1=wx.TextCtrl(self,-1,'',pos=(145,50),size=(150,-1),name='TC01',style=wx.TE_CENTER)self.tc2=wx.TextCtrl(self,-1,'',pos=(145,80),size=(150,-1),name='TC02',style=wx.TE_PASSWORD|wx.ALIGN_RIGHT)btn_mea=wx.Button(self,-1,'鼠标左键事件',pos=(350,50),size=(100,25))btn_meb=wx.Button(self,-1,'鼠标所有事件',pos=(350,80),size=(100,25))btn_close=wx.Button(self,-1,'关闭窗口',pos=(350,110),size=(100,25))self.tc1.Bind(wx.EVT_TEXT,self.on_text)#绑定文本内容改变事件self.tc2.Bind(wx.EVT_TEXT,self.on_text)#绑定文本内容改变事件btn_close.Bind(wx.EVT_BUTTON,self.on_close,btn_close)#绑定按键事件btn_close.Bind(wx.EVT_MOUSEWHEEL,self.on_wheel)#绑定鼠标滚轮事件btn_mea.Bind(wx.EVT_LEFT_DOWN,self.on_left_down)#绑定鼠标左键按下btn_mea.Bind(wx.EVT_LEFT_UP,self.on_left_up)#绑定鼠标左键弹起btn_meb.Bind(wx.EVT_MOUSE_EVENTS,self.on_mouse)#绑定所有鼠标事件self.Bind(wx.EVT_CLOSE,self.on_close)#绑定窗口关闭事件self.Bind(wx.EVT_SIZE,self.on_size)#绑定改变窗口大小事件self.Bind(wx.EVT_KEY_DOWN,self.on_key_down)#绑定键盘事件defon_text(self,evt):"""输入框事件函数"""obj=evt.GetEventObject()objName=obj.GetName()text=evt.GetString()ifobjName=='TC01':self.tc2.SetValue(text)elifobjName=='TC02':self.tc1.SetValue(text)defon_size(self,evt):'''改变窗口大小事件函数'''print('你想改变窗口 , 但是事件被Skip了 , 所以没有任何改变')evt.Skip()#注释掉此行(事件继续传递) , 窗口大小才会被改变defon_close(self,evt):"""关闭窗口事件函数"""dlg=wx.MessageDialog(None,'确定要关闭本窗口?','操作提示',wx.YES_NO|wx.ICON_QUESTION)if(dlg.ShowModal()==wx.ID_YES):self.Destroy()defon_left_down(self,evt):"""左键按下事件函数"""self.tip.SetLabel('左键按下')defon_left_up(self,evt):"""左键弹起事件函数"""self.tip.SetLabel('左键弹起')defon_wheel(self,evt):"""鼠标滚轮事件函数"""vector=evt.GetWheelRotation()self.tip.SetLabel(str(vector))defon_mouse(self,evt):"""鼠标事件函数"""self.tip.SetLabel(str(evt.EventType))defon_key_down(self,evt):"""键盘事件函数"""key=evt.GetKeyCode()self.tip.SetLabel(str(key))if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。