菜单项、菜单和菜单栏
顶层窗口标题栏正下方的水平栏被保留用于显示一系列菜单。 它是wxPython API 中wx.MenuBar 类 的一个对象。
一个wx.Menu类的对象被添加到菜单栏。 它还用于创建上下文菜单和弹出菜单。 每个菜单可能包含一个或多个 wx.MenuItem 对象或级联的 Menu 对象。
wx.MenuBar 类除了默认构造函数外还有一个参数化构造函数。
wx.MenuBar() wx.MenuBar(n, menus, titles, style)
参数'n'表示菜单的数量。 Menu 是一个菜单和标题数组,以及一个字符串数组。 如果样式参数设置为wx.MB_DOCKABLE,则菜单栏可以停靠。
下面是wx.MenuBar类的方法列表 −
S.N. | 方法与说明 |
---|---|
1 | Append() 将菜单对象添加到栏 |
2 | Check() 选中或取消选中菜单 |
3 | Enable() 启用或禁用菜单 |
4 | Remove() 从栏中删除菜单 |
wx.Menu 类对象是一个或多个菜单项的下拉列表,用户可以选择其中一个。
下表显示了 wx.Menu 类的常用方法 −
S.N. | 方法与说明 |
---|---|
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。 文本参数是它的标题。 种类参数采用以下枚举数之一 −
S.N. | 参数 & 说明 |
---|---|
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()
以上代码产生如下输出 −