wxPython事件标识符
实战wxPython系列013
在wxPython事件系统中,事件是通过标识来区分的,每个事件标识在其实就是一个独一无二的整数,常见的事件标识有窗口标识,标准标识以及定制事件标识等等。
一、窗口标识符(Windowsids)
在事件系统中,窗口标识符是唯一确定窗口标识的整数。有三种方法可以创建窗口标识符。让系统自动生成一个标志符;使用系统中定义的标志符;创建自己使用的标识符。wx。Button(parent,1)wx。Button(parent,wx。IDANY)
在上面的语句中,我们将标志符参数设置为1或者wx。IDANY,则表示让wxPython系统为我们自动生成一个标志符。自动创建的标识符的值总是为负值,而用户自己指定的标志符则必须为正值。通常在我们不需要更改控件(widget)的状态时使用让系统自动生成一个标志符。比如,在应用程序生命周期内一直不需要更改的静态文本控件。但是,如果我们在需要获得控件的标志符的时候,可以使用方法GetId()来获得控件的标识符。
下面的示例程序演示了如何让系统自动生成标志符,以及如何获得该标志符:窗口标识演示importwxclassSampleWindowsIds(wx。Frame):definit(self,args,kw):super(SampleWindowsIds,self)。init(args,kw)self。InitUi()defInitUi(self):panelwx。Panel(self)exitButtonwx。Button(panel,wx。IDANY,退出,(10,10))self。Bind(wx。EVTBUTTON,self。OnExit,idexitButton。GetId())self。SetTitle(实战wxPython:自动分配标识)self。Centre()defOnExit(self,e):self。Close()defmain():appwx。App()sampleSampleWindowsIds(None)sample。Show()app。MainLoop()ifnamemain:main()
在上面的例子中,我们并不关心exitButton按钮具体的标志符值,在使用Bind方法self。Bind(wx。EVTBUTTON,self。OnExit,idexitButton。GetId())
我们调用exitButton。GetId()方法,就可以自动获得该按钮的标志符值。
图1:自动生成控件标志符演示
二、wxPython中的标准标识符
在wxPython系统中,包含一些标准标志符,比如wx。IDSAVE,wx。IDNew等等,下面的代码演示了如何使用标志标志符。标准标识演示importwxclassSampleStandardIdx(wx。Frame):definit(self,args,kw):super(SampleStandardIdx,self)。init(args,kw)self。InitUi()defInitUi(self):panelwx。Panel(self)gridwx。GridSizer(3,2,0,0)grid。AddMany(〔(wx。Button(panel,wx。IDCANCEL),0,wx。TOPwx。LEFT,9),(wx。Button(panel,wx。IDDELETE),0,wx。TOP,9),(wx。Button(panel,wx。IDSAVE),0,wx。LEFT,9),(wx。Button(panel,wx。IDEXIT)),(wx。Button(panel,wx。IDSTOP),0,wx。LEFT,9),(wx。Button(panel,wx。IDNEW))〕)self。Bind(wx。EVTBUTTON,self。OnQuitApp,idwx。IDEXIT)panel。SetSizer(grid)self。SetTitle(实战wxPython:标准标识)self。Centre()defOnQuitApp(self,e):self。Close()defmain():appwx。App()sampleSampleStandardIdx(None)sample。Show()app。MainLoop()ifnamemain:main()
在上面的示例代码中,我们使用一些标准按钮标志符,如果在Linux系统中运行,则会自动添加相应的图标在这些按钮上。grid。AddMany(〔(wx。Button(pnl,wx。IDCANCEL),0,wx。TOPwx。LEFT,9),(wx。Button(pnl,wx。IDDELETE),0,wx。TOP,9),(wx。Button(pnl,wx。IDSAVE),0,wx。LEFT,9),(wx。Button(pnl,wx。IDEXIT)),(wx。Button(pnl,wx。IDSTOP),0,wx。LEFT,9),(wx。Button(pnl,wx。IDNEW))〕)
在网格调节器上上,我们添加了六个按钮,它们使用了六个标准标志符wx。IDCANCEL,wx。IDDELETE,wx。IDSAVE,wx。IDEXIT,wx。IDSTOP和wx。IDNew。
在Windows系统下,运行结果如图2所示:
图2:标准标志符演示
在wxPython系统中,建议在可能的情况下,使用标准标识符,因为这些标准标志符可以在某些平台上提供一些标准的图形或者行为。
三、自定义事件标识符
下面的代码演示如何使用自定义事件标志符:自定义标识符importwxIDMENUNEWwx。NewId()IDMENUOPENwx。NewId()IDMENUSAVEwx。NewId()classSampleCustomIds(wx。Frame):definit(self,args,kw):super(SampleCustomIds,self)。init(args,kw)self。InitUi()defInitUi(self):self。CreateMenuBar()self。CreateStatusBar()self。SetSize(350,250)self。SetTitle(实战wxPython:自定义标识)self。Centre()defCreateMenuBar(self):mbarwx。MenuBar()fMenuwx。Menu()fMenu。Append(IDMENUNEW,新建)fMenu。Append(IDMENUOPEN,打开)fMenu。Append(IDMENUSAVE,保存)mbar。Append(fMenu,文件(F))self。SetMenuBar(mbar)self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUNEW)self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUOPEN)self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUSAVE)defDisplayMessage(self,e):sbarself。GetStatusBar()eide。GetId()ifeidIDMENUNEW:msg新建菜单项被选择elifeidIDMENUOPEN:msg打开菜单项被选择elifeidIDMENUSAVE:msg保存菜单项被选择sbar。SetStatusText(msg)defmain():appwx。App()sampleSampleCustomIds(None)sample。Show()app。MainLoop()ifnamemain:main()
在上述示例代码中,创建了一个包括单个菜单项的菜单,菜单项的标志符通过代码IDMENUNEWwx。NewId()IDMENUOPENwx。NewId()IDMENUSAVEwx。NewId()
创建,方法wx。NewId()可创建一个新的独一无二的标志符。self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUNEW)self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUOPEN)self。Bind(wx。EVTMENU,self。DisplayMessage,idIDMENUSAVE)
在进行事件绑定的时候,使用了各自的标志符。eide。GetId()ifeidIDMENUNEW:msgNewmenuitemselectedelifeidIDMENUOPEN:msgOpenmenuitemselectedelifeidIDMENUSAVE:msgSavemenuitemselected
在事件处理方法DisplayMessage中通过GetId()函数获得被点击菜单项的标识符值,通过判断该值,就可以确定当前被点击的菜单项,然后显示相应的信息。
图3:自定义标志符演示
四、本文知识点什么是事件标志符及其在事件系统中的作用;使用自动生成标志符;使用系统标准标识符;使用自定义标志符。
前一篇:wxPython事件绑定及传播
请多多关注,评论,收藏,点赞,和转发。