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 - 事件绑定及传播

请多多关注,评论,收藏,点赞,和转发。

展开阅读全文

页面更新:2024-04-22

标签:标识符   事件   控件   演示   标识   按钮   标志   窗口   标准   系统

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top