wxPython - 菜单项、菜单和菜单栏

  • 简述

    顶层窗口标题栏正下方的水平条保留用于显示一系列菜单。它是一个对象wx.MenuBar class在 wxPython API 中。
    wx.Menu 类的对象被添加到菜单栏。它还用于创建上下文菜单和弹出菜单。每个菜单可能包含一个或多个 wx.MenuItem 对象或级联菜单对象。
    wx.MenuBar 类除了默认构造函数外还有一个参数化构造函数。
    
    wx.MenuBar()  
    wx.MenuBar(n, menus, titles, style)
    
    参数“n”代表菜单的数量。Menu是一个菜单和标题数组,以及一个字符串数组。如果 style 参数设置为 wx.MB_DOCKABLE,则可以停靠菜单栏。
    以下是 wx.MenuBar 类的方法列表 -
    序列号 方法和描述
    1
    Append()
    将菜单对象添加到栏
    2
    Check()
    选中或取消选中菜单
    3
    Enable()
    启用或禁用菜单
    4
    Remove()
    从栏中删除菜单
    wx.Menu 类对象是一个或多个菜单项的下拉列表,其中一个可以由用户选择。
    下表显示了 wx.Menu 类的常用方法 -
    序列号 方法和描述
    1
    Append()
    在菜单中添加一个菜单项
    2
    AppendMenu()
    添加子菜单
    3
    AppendRadioItem()
    附加一个可选择的单选项目
    4
    AppendCheckItem()
    附加一个可检查的菜单项
    5
    AppendSeparator()
    添加分隔线
    6
    Insert()
    在给定位置插入一个新菜单
    7
    InsertRadioItem()
    在给定位置插入一个单选项目
    8
    InsertCheckItem()
    在给定位置插入一个新的检查项
    9
    InsertSeparator()
    插入分隔线
    10
    Remove()
    从菜单中删除一个项目
    11
    GetMenuItems()
    返回菜单项列表
    一种Menu Item可以直接使用 Append() 函数添加,也可以使用 wx.MenuItem 类的对象进行追加。
    
    wx.Menu.Append(id, text, kind)
      
    Item = Wx.MenuItem(parentmenu, id, text, kind) 
    wx.Menu.Append(Item)
    
    为了定义一个菜单项,必须提到要添加它的菜单。
    wxPython 有大量的标准 ID 分配给标准菜单项。在某些操作系统平台上,它们也与标准图标相关联。
    wx.ID_SEPARATOR
    wx.ID_ANY
    wx.ID_OPEN
    wx.ID_CLOSE
    wx.ID_NEW
    wx.ID_SAVE
    wx.ID_SAVEAS
    wx.ID_EDIT
    wx.ID_CUT
    wx.ID_COPY
    wx.ID_PASTE
    但是,任何唯一的整数都可以指定为 ID。text 参数是它的标题。Kind 参数采用以下枚举数之一 -
    序列号 参数及说明
    1
    wx.ITEM_NORMAL
    普通菜单项
    2
    wx.ITEM_CHECK
    检查(或切换)菜单项
    3
    wx.ITEM_RADIO
    收音机菜单项
    wx.Menu 类还有 AppendRadioItem() 和 AppendCheckItem() 不需要 kind 参数。
    可以设置菜单项以显示图标或快捷方式。wx.MenuItem 类的 SetBitmap() 函数需要显示位图对象。
    
    wx.MenuItem.SetBitmap(wx.Bitmap(image file))
    
    EVT_MENU 事件绑定器有助于处理菜单选择。
    
    self.Bind(wx.EVT_MENU, self.menuhandler)
    
  • 例子

    以下示例演示了 wxPython 中菜单系统的大部分上述功能。它显示了在菜单栏中显示的文件菜单。增加了普通菜单项、子菜单、单选项和检查项。还存在具有图标的菜单项。
    事件处理程序在调用时检索与事件关联的 ID,并且可以进一步处理。例如,如果选择了“新建”菜单项,则会在框架上的文本框中回显。
    完整的代码如下 -
    
    import wx  
    class Mywin(wx.Frame): 
                
       def __init__(self, parent, title): 
          super(Mywin, self).__init__(parent, title = title, size = (250,150))  
          self.InitUI() 
             
       def InitUI(self):    
          menubar = wx.MenuBar() 
          
          fileMenu = wx.Menu() 
          newitem = wx.MenuItem(fileMenu,wx.ID_NEW, text = "New",kind = wx.ITEM_NORMAL) 
          newitem.SetBitmap(wx.Bitmap("new.bmp")) 
          fileMenu.AppendItem(newitem) 
          
          fileMenu.AppendSeparator()
          
          editMenu = wx.Menu() 
          copyItem = wx.MenuItem(editMenu, 100,text = "copy",kind = wx.ITEM_NORMAL)
          copyItem.SetBitmap(wx.Bitmap("copy.bmp")) 
          
          editMenu.AppendItem(copyItem) 
          cutItem = wx.MenuItem(editMenu, 101,text = "cut",kind = wx.ITEM_NORMAL) 
          cutItem.SetBitmap(wx.Bitmap("cut.bmp")) 
          
          editMenu.AppendItem(cutItem) 
          pasteItem = wx.MenuItem(editMenu, 102,text = "paste",kind = wx.ITEM_NORMAL) 
          pasteItem.SetBitmap(wx.Bitmap("paste.bmp")) 
          
          editMenu.AppendItem(pasteItem) 
          fileMenu.AppendMenu(wx.ID_ANY, "Edit", editMenu) 
          fileMenu.AppendSeparator() 
             
          radio1 = wx.MenuItem(fileMenu, 200,text = "Radio1",kind = wx.ITEM_RADIO) 
          radio2 = wx.MenuItem(fileMenu, 300,text = "radio2",kind = wx.ITEM_RADIO) 
          
          fileMenu.AppendItem(radio1) 
          fileMenu.AppendItem(radio2) 
          fileMenu.AppendSeparator() 
             
          fileMenu.AppendCheckItem(103,"Checkable") 
          quit = wx.MenuItem(fileMenu, wx.ID_EXIT, '&Quit\tCtrl+Q') 
          
          fileMenu.AppendItem(quit) 
          menubar.Append(fileMenu, '&File') 
          
          self.SetMenuBar(menubar) 
          self.text = wx.TextCtrl(self,-1, style = wx.EXPAND|wx.TE_MULTILINE) 
          self.Bind(wx.EVT_MENU, self.menuhandler) 
          self.SetSize((350, 250)) 
          self.Centre() 
          self.Show(True)
          
       def menuhandler(self, event): 
          id = event.GetId() 
          if id == wx.ID_NEW: 
             self.text.AppendText("new"+"\n")
             
    ex = wx.App() 
    Mywin(None,'MenuBar demo') 
    ex.MainLoop() 
    
    上面的代码产生以下输出 -
    菜单栏输出