wxPython 菜单项,菜单和菜单栏
在顶层窗口的标题栏下方,保留了一个水平栏用于显示一系列菜单。它是 wxPython API 中的 wx.MenuBar 类的对象。
wx.Menu 类的对象被添加到菜单栏中。它也用于创建上下文菜单和弹出菜单。每个菜单可以包含一个或多个 wx.MenuItem 对象或级联菜单对象。
除了默认构造函数,wx.MenuBar 类还有一个带参数的构造函数。
wx.MenuBar()
wx.MenuBar(n, menus, titles, style)
参数 ‘n’ 表示菜单的数量。 菜单 是菜单和标题的数组,以及字符串的数组。如果样式参数设置为 wx.MB_DOCKABLE,菜单栏可以停靠。
以下是 wx.MenuBar 类的方法列表 –
序号 | 方法和描述 |
---|---|
1 | Append() 添加菜单对象到栏 |
2 | Check() 选中或取消选中菜单 |
3 | Enable() 启用或禁用菜单 |
4 | Remove() 从栏中移除菜单 |
A wx.Menu类对象是一个下拉列表,其中包含一个或多个菜单项,用户可以选择其中的一个。
下表显示了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() 返回菜单项列表 |
可以使用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类还具有不需要kind参数的AppendRadioItem()和AppendCheckItem()方法。
菜单项可以设置显示图标或快捷键。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()
上述代码产生以下输出 −