wxPython事件标识符
实战wxPython系列-013
在wxPython事件系统中,事件是通过标识来区分的,每个事件标识在其实就是一个独一无二的整数,常见的事件标识有窗口标识,标准标识以及定制事件标识等等。
一、窗口标识符(Windows ids)
在事件系统中,窗口标识符是唯一确定窗口标识的整数。有三种方法可以创建窗口标识符。让系统自动生成一个标志符;使用系统中定义的标志符;创建自己使用的标识符。wx.Button(parent, -1) wx.Button(parent, wx.ID_ANY)
在上面的语句中,我们将标志符参数设置为-1或者wx.ID_ANY,则表示让wxPython系统为我们自动生成一个标志符。自动创建的标识符的值总是为负值,而用户自己指定的标志符则必须为正值。通常在我们不需要更改控件(widget)的状态时使用让系统自动生成一个标志符。比如,在应用程序生命周期内一直不需要更改的静态文本控件。但是,如果我们在需要获得控件的标志符的时候,可以使用方法GetId()来获得控件的标识符。
下面的示例程序演示了如何让系统自动生成标志符,以及如何获得该标志符:#窗口标识演示 import wx class SampleWindowsIds(wx.Frame): def __init__(self, *args, **kw): super(SampleWindowsIds, self).__init__(*args, **kw) self.InitUi() def InitUi(self): panel = wx.Panel(self) exitButton = wx.Button(panel, wx.ID_ANY, "退出", (10, 10)) self.Bind(wx.EVT_BUTTON, self.OnExit, id=exitButton.GetId()) self.SetTitle("实战wxPython: 自动分配标识") self.Centre() def OnExit(self, e): self.Close() def main(): app = wx.App() sample = SampleWindowsIds(None) sample.Show() app.MainLoop() if __name__ == "__main__": main()
在上面的例子中,我们并不关心exitButton按钮具体的标志符值,在使用Bind方法self.Bind(wx.EVT_BUTTON, self.OnExit, id=exitButton.GetId())
我们调用exitButton.GetId()方法,就可以自动获得该按钮的标志符值。
图1:自动生成控件标志符演示
二、wxPython中的标准标识符
在wxPython系统中,包含一些标准标志符,比如wx.ID_SAVE,wx.ID_New等等,下面的代码演示了如何使用标志标志符。#标准标识演示 import wx class SampleStandardIdx(wx.Frame): def __init__(self, *args, **kw): super(SampleStandardIdx, self).__init__(*args, **kw) self.InitUi() def InitUi(self): panel = wx.Panel(self) grid = wx.GridSizer(3, 2, 0, 0) grid.AddMany([(wx.Button(panel, wx.ID_CANCEL), 0, wx.TOP | wx.LEFT, 9), (wx.Button(panel, wx.ID_DELETE), 0, wx.TOP, 9), (wx.Button(panel, wx.ID_SAVE), 0, wx.LEFT, 9), (wx.Button(panel, wx.ID_EXIT)), (wx.Button(panel, wx.ID_STOP), 0, wx.LEFT, 9), (wx.Button(panel, wx.ID_NEW))]) self.Bind(wx.EVT_BUTTON, self.OnQuitApp, id=wx.ID_EXIT) panel.SetSizer(grid) self.SetTitle("实战wxPython: 标准标识") self.Centre() def OnQuitApp(self, e): self.Close() def main(): app = wx.App() sample = SampleStandardIdx(None) sample.Show() app.MainLoop() if __name__ == "__main__": main()
在上面的示例代码中,我们使用一些标准按钮标志符,如果在Linux系统中运行,则会自动添加相应的图标在这些按钮上。grid.AddMany([(wx.Button(pnl, wx.ID_CANCEL), 0, wx.TOP | wx.LEFT, 9), (wx.Button(pnl, wx.ID_DELETE), 0, wx.TOP, 9), (wx.Button(pnl, wx.ID_SAVE), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_EXIT)), (wx.Button(pnl, wx.ID_STOP), 0, wx.LEFT, 9), (wx.Button(pnl, wx.ID_NEW))])
在网格调节器上上,我们添加了六个按钮, 它们使用了六个标准标志符wx.ID_CANCEL, wx.ID_DELETE, wx.ID_SAVE, wx.ID_EXIT, wx.ID_STOP和wx.ID_New。
在Windows系统下,运行结果如图2所示:
图2:标准标志符演示
在wxPython系统中,建议在可能的情况下,使用标准标识符, 因为这些标准标志符可以在某些平台上提供一些标准的图形或者行为。
三、自定义事件标识符
下面的代码演示如何使用自定义事件标志符:#自定义标识符 import wx ID_MENU_NEW = wx.NewId() ID_MENU_OPEN = wx.NewId() ID_MENU_SAVE = wx.NewId() class SampleCustomIds(wx.Frame): def __init__(self, *args, **kw): super(SampleCustomIds, self).__init__(*args, **kw) self.InitUi() def InitUi(self): self.CreateMenuBar() self.CreateStatusBar() self.SetSize(350, 250) self.SetTitle("实战wxPython: 自定义标识") self.Centre() def CreateMenuBar(self): mbar = wx.MenuBar() fMenu = wx.Menu() fMenu.Append(ID_MENU_NEW, "新建") fMenu.Append(ID_MENU_OPEN, "打开") fMenu.Append(ID_MENU_SAVE, "保存") mbar.Append(fMenu, "文件(&F)") self.SetMenuBar(mbar) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_NEW) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_OPEN) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_SAVE) def DisplayMessage(self, e): sbar = self.GetStatusBar() eid = e.GetId() if eid == ID_MENU_NEW: msg = "新建菜单项被选择" elif eid == ID_MENU_OPEN: msg = "打开菜单项被选择" elif eid == ID_MENU_SAVE: msg = "保存菜单项被选择" sbar.SetStatusText(msg) def main(): app = wx.App() sample = SampleCustomIds(None) sample.Show() app.MainLoop() if __name__ == "__main__": main()
在上述示例代码中,创建了一个包括单个菜单项的菜单,菜单项的标志符通过代码ID_MENU_NEW = wx.NewId() ID_MENU_OPEN = wx.NewId() ID_MENU_SAVE = wx.NewId()
创建,方法wx.NewId()可创建一个新的独一无二的标志符。self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_NEW) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_OPEN) self.Bind(wx.EVT_MENU, self.DisplayMessage, id=ID_MENU_SAVE)
在进行事件绑定的时候,使用了各自的标志符。eid = e.GetId() if eid == ID_MENU_NEW: msg = "New menu item selected" elif eid == ID_MENU_OPEN: msg = "Open menu item selected" elif eid == ID_MENU_SAVE: msg = "Save menu item selected"
在事件处理方法DisplayMessage中通过GetId()函数获得被点击菜单项的标识符值,通过判断该值,就可以确定当前被点击的菜单项,然后显示相应的信息。
图3:自定义标志符演示
四、本文知识点什么是事件标志符及其在事件系统中的作用;使用自动生成标志符;使用系统标准标识符;使用自定义标志符。
前一篇: wxPython - 事件绑定及传播
请多多关注,评论,收藏,点赞,和转发。
四川省政协委员嘉绒姐姐何瑜娟以乡村文旅帮助妇女就业,提升农村妇女幸福感高鼻深目,两颊微红,网名为嘉绒姐姐阿娟的四川省政协委员何瑜娟,其实是个汉族姑娘。曾经作为国际导游游遍了48个国家,在2017年因为爱情嫁到了阿坝州嘉绒藏区。目睹当时消息闭塞交通落后
中国银行普洱市分行被罚贷款三查严重不尽职来源中国经济网银保监会网站13日公布的中国银保监会普洱监管分局行政处罚信息公开表(普银保监罚决字202221号)显示,中国银行股份有限公司普洱市分行贷款三查不尽职,导致部分信贷资金
马来西亚公开赛结束4强争夺国羽五组进四强关注极客老爹。为您带来最新最精彩的羽球赛事报道。昨日马来西亚公开赛结束4强争夺。国羽六场外战输两场,刘欧组合遭淘汰,总体表现稳定。男单方面,奈良冈功大对战印度老将普兰诺伊,依旧是苦
小年,许一个小期待剑客明珠三剑客跨年夜的钟声已然敲响,桌上的日历本已然换成了新的。可昨天弄脏的衣服,今天需要去清洗,昨天没处理完的事情,今天同样需要继续去处理。本质上,这依然是两个普通的连续的日子,
陈昱东首夺男子单人滑冠军小将陈昱东逆转夺冠20222023全国花样滑冰锦标赛男单比赛于12日全部结束,18岁小将陈昱东在自由滑比赛中获得124。23分排名第一,最终以总分193分逆转夺冠。韩文宝以191。
新民艺评智能电视,岂能将智能用在收费上演员李嘉明日前通过网络发布视频,公开指责电视收费乱象,他说以前打开电视就是电视,现在打开电视全是收费的,花大几千买的电视看不了。他的仗义执言引起网友共鸣,获得了超过50万的点赞。的
退而不休的曹铁嘴走了,他曾让中日擂台赛家喻户晓著名围棋评论家前国手曹志林八段于1月12日19时在上海因病逝世,享年75岁。曹志林曹志林出生于1947年,1964年入上海围棋队,1965年入国家围棋队,1974年和1977年两度
警训当如吴亦凡,恋爱当如鹿晗,品行当如刘德华,爱国当如王嘉尔近日,王嘉尔的20222023年MAGICMAN世界巡回演唱会在英国伦敦举行,在当晚表演间隙,王嘉尔用英语公开发表爱国言论,怒斥外媒造谣抹黑中国的虚假报道。现场他义正言辞,表示事实
科学家证实南京花内含胚珠为侏罗纪已出现被子植物添新证南京花的复原图。南古所供图中新网南京1月11日电(记者杨颜慈)记者11日从中国科学院南京地质古生物研究所获悉,该所王鑫研究员傅强研究员等利用微CT技术穿透南京花化石揭示了肉眼无法直
QQ音乐Flyme版上线,清爽界面展现用户关怀!门店信息有眉目去年魅族的魅友大会2022活动公布之时,QQ音乐Flyme版消息也同步释出。这款双方合作的诚意之作将在今年1月份上线,为大家带来海量正版曲库灵动语音唤醒智能听歌识曲AliveDes
普吉风情别样的人妖秀早听说过泰国的人妖,此行一见,与我的想象还是很有差距,因为他们比我想象的还美,而且多才多艺,看了他们的表演,我的感情很复杂,心情久久无法平静。导游说,在泰国,美的是妖,不美的是人。