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 - 事件绑定及传播
请多多关注,评论,收藏,点赞,和转发。
金观平外资扩容彰显中国市场强大磁吸力全球资管机构正加快布局中国市场。今年以来,外资独资公募基金数量扩容至7家合格境外投资者资格也在不断扩容,年内又有6家机构获批。同时,多家外资机构表示看好中国市场中长期投资潜力。在国
24年后,再看凤凰传奇曾毅玲花的境遇,才明白55分账的重要性我在仰望,月亮之上,有多少梦想在自由地飞翔2005年的一首月亮之上几乎一夜之间火遍大江南北,全国各地的广场上播放的都是这首歌,所有人都知道了这个组合凤凰传奇。他们的歌可以说是自带M
放下焦虑,放过自己当下教育的焦虑曾经不能输在起跑线上这一句口号,坑害了多少个家庭老师的焦虑各种考核评比,各种绩效奖金和教学成绩挂钩父母的焦虑各种补课班培训班兴趣班,有的甚至辞职全职陪娃读书。娃的问题
春天排毒,一年不堵,春季要吃这排毒菜,给身体洗个澡大家好,我是美妈。很多人说春天要排毒,身体一年都健康,那为啥不是夏天排毒,或者秋天排毒呢?原来这是有很多说法的。1。春天是一切的开始,是生命和勃发的开始,在春意盎然的时候,很多细菌
焦虑症?无人诉说,还好可以在这里说说事情的起因2022年9月21日莫名的感觉头部有点疼痛,有点鼻塞,可能是天气变冷,不小心感冒了吧。晚上还跟朋友出去喝了几瓶啤酒,吃了一顿小烧烤,凌晨两点多才到家回去就睡着了,因为之前
吃晚饭时,长期喝点白酒的人,最后身体怎样了?医生说出实话我们常说喝酒有害健康,甚至连权威医学期刊柳叶刀也曾发表多篇研究,指出酒精是世界头号致癌物。但有些人还是不以为然,甚至在每天吃晚饭时喝点酒,觉得这样能够养生活血,那么每天晚饭喝点白酒
得开学焦虑症的到底是家长还是孩子?前一阵子全国大部分地区的学校幼儿园都在忙忙碌碌准备开学,我们当地也不例外。在开学的前两天一位本庄的大姐带着孩子找到我,说大妹子赶紧的,帮大姐复印点东西。正好啊,之前我为了自己充电学
每天坚持吃1个鸡蛋,对身体是好是坏?每天坚持吃1个鸡蛋,对身体是好是坏?真相来了!鸡蛋丢掉蛋黄,蛋黄胆固醇高,影响心血管。每天吃1个鸡蛋,患上糖尿病和高血压的风险大大增加!这些说法让很多人对自己的饮食习惯产生了怀疑,
惊蛰过后,无论贫富,记住4多吃3少吃,阳气足身体好,健康过春天惊蛰过后,无论贫富都要多吃3少吃,阳气足身体好,健康过春天。这是因为4多吃是指春天的食物,还有3少吃,为什么要这样说呢?惊蛰过后,无论贫富,记得4多吃春天来了,惊蛰是一个节气。这个
每天坚持吃1个鸡蛋,对身体是好是坏?最新研究来了!鸡蛋丢掉蛋黄,蛋黄胆固醇高,影响心血管。每天吃1个鸡蛋,患上糖尿病和高血压的风险大大增加!这让很多人对自己的饮食习惯产生了怀疑,每天坚持吃1个鸡蛋,对身体是好是坏?01hr研究每周
凝心聚力,与中国发展同频共振3月5日上午,第十四届全国人民代表大会第一次会议在北京人民大会堂开幕。国务院总理李克强作政府工作报告。同一时刻,许多身处不同时区的华侨华人对标北京时间,通过各种方式了解政府工作报告