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 - 事件绑定及传播
请多多关注,评论,收藏,点赞,和转发。
任正非华为用三年时间内完成13000颗器件的替代开发4000电路板的反复换板开发3月17日,澎湃新闻记者获悉,华为创始人任正非在难题揭榜火花奖公司内外的获奖者及出题专家座谈会上表示,华为用三年时间内完成13000颗器件的替代开发4000电路板的反复换板开发,今
会顶胯的女人还挺有魅力的,王子文虽然穿得低调,但站姿真魅提起王子文,是不是不难想到三体女青年叶文洁?明明已经迈入三十岁女演员大军的她,却总是少女感十足,还是像个涉世未深的小女孩一样。外貌上逆生长,除了她在保养方面的高度自律,还少不了她永
青岛地标百年栈桥变身春日时装秀场模特身着盛装在青岛栈桥走秀。王海滨摄身着盛装的走秀模特吸引民众目光。王海滨摄一名模特在进行走秀。王海滨摄拥有百年历史的栈桥变身春日时装秀场。王海滨摄走秀活动吸引众多民众。王海滨摄数
杨幂不愧是大幂幂,穿肉色紧身裙凹凸感十足,36岁别有韵味杨幂是一名非常优秀的演员,童星出身的她演技非常出众,她在2011年,凭借着在电视剧宫锁玉心中饰演晴川一角红遍大江南北,成为了娱乐圈里面的当红小花旦。杨幂除了演技了得之外,颜值和身材
最像欧洲人的美国绝美模特艾莉萨米勒(AlyssaMiller)艾莉萨米勒(AlyssaMiller)职业模特年龄28身高1米75体重55公斤国籍美国出生地美国加州洛杉矶出生日期1989年7月4日艾莉萨米勒(AlyssaMiller)是一名美国
原来是说话不算话!那就怪不了前妻不念旧情了娱评大赏3月18日的中午,张隆的原配妻子在微博等互联网社交媒体发布了相关的文字和图片,爆出了这个被人们议论许久的出轨问题。目前,这一消息正在持续发酵!夫妻双方已谈妥离婚条件,男方净
春天,跳出孤岛,跃进人海我不是凯列班,但也经历了孤岛上的暴风雨。我们都经历了一次漫长的寒冬,前所未有的生病的寒冬。病和冬,都像囚笼,但也都会过去。过去了就是春天。回想一年前的春天,似乎更有理由珍惜摆脱被疫
春天来了3月18日,游客参观意大利罗马斗兽场。天气转暖,万物复苏,春天的气息已悄然降临。新华社记者金马梦妮摄3月18日,人们在意大利罗马的一处公园休闲。这是3月18日在德国柏林布里茨花园拍
上街里逛春天旅游艺术季启幕为持续打造老青岛上街里品牌,融汇时尚资源,打造最具街里艺术气息的旅游艺术主题活动,3月17日,2023青岛市南上街里逛春天旅游艺术季正式启动,这是青岛市南区为市民和游客朋友们精心准
一桌香椿宴香满上方山时下,北京市房山区上方山里已处处弥漫着春的气息。春天山间杏花桃花星星点点,谷雨到五一是采香椿的好季节夏季椿林满院,可观云海,品香茗,避暑乘凉正好秋季红叶翻飞色彩斑斓冬天山后的天然冰
孙颖莎登基,乒乓球天下初定2017年6月,未满17岁的孙颖莎第一次参加世界大赛日本公开赛。毫无征兆地,她夺得了女单和女双的冠军。一代天才就此诞生。孙颖莎出道即巅峰,迅速站上世界屋脊。然而,那时的乒坛霸主是陈