(二)Menus and Toolbars in wxPython
1 组成
一个菜单是由wx.MenuBar, wx.Menu 和 wx.MenuItem三个部分组成 wx.MenuBar是 wx.Menu的容器,wx.Menu是wx.MenuItem的容器
一个简单示例
2 Icons, shortcuts, events
一个带图标的例子
3 Submenus
菜单下面的menuitem可以有子菜单 便于分类 还可以添加分隔符
例子程序
4 Various menu items包含
normal item
check item
radio item
一个带有CheckItem的例子
5 Context menu
定义弹出式菜单 比如右键点击某个目标时候弹出的菜单
一个实例程序
6 Toolbars 快捷的工具栏
参数表CreateToolBar(long style=-1, int winid=-1, String name=ToolBarNameStr)
另一个例子 两个toolbar
纵向toolbar
带有分隔符的toolbar
#!/usr/bin/python
# toolbars.py
1 组成
一个菜单是由wx.MenuBar, wx.Menu 和 wx.MenuItem三个部分组成 wx.MenuBar是 wx.Menu的容器,wx.Menu是wx.MenuItem的容器
一个简单示例
![](http://zetcode.com/wxpython/images/simplemenu.png)
python 代码
- import wx
- #构造一个带菜单的窗口 继承wx.Frame
- class SimpleMenu(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(250,250))
- #构造一个MenuBar
- menubar=wx.MenuBar()
- #构造一个Menu
- file=wx.Menu()
- #给Menu添加一个MenuItem
- file.Append(-1,'Quit', 'Quit application')
- #给MenuBar添加一个Menu 就是上面的file
- menubar.Append(file, '&File')
- #让Frame加上这个menubar
- self.SetMenuBar(menubar)
- #用继承自windows的方法来设置位置
- self.Centre()
- self.Show(True)
- app = wx.App()
- SimpleMenu(None, -1, 'simple menu example')
- app.MainLoop()
2 Icons, shortcuts, events
一个带图标的例子
![](http://zetcode.com/wxpython/images/menuexample.png)
python 代码
- import wx
- class MenuExample(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(250,150))
- menubar = wx.MenuBar()
- file = wx.Menu()
- #这里用了添加MenuItem的另一种方法 先添加一个MenuItem Object而不是直接在Menu上Append
- #如果想添加图标就要自己手动的创建wx.MenuItem对象
- quit = wx.MenuItem(file, 1, '&Quit\tCtrl+q')
- #设置图标的地址
- quit.SetBitmap(wx.Bitmap('icons/bp_btn2.png'))
- file.AppendItem(quit)
- #添加一个事件
- self.Bind(wx.EVT_MENU, self.onQuit, id=1)
- menubar.Append(file, '&File')
- self.SetMenuBar(menubar)
- self.Centre()
- self.Show(True)
- #定义关闭按钮事件
- def onQuit(self, event):
- self.Close()
- app = wx.App()
- MenuExample(None, -1, '')
- app.MainLoop()
3 Submenus
菜单下面的menuitem可以有子菜单 便于分类 还可以添加分隔符
例子程序
![](http://zetcode.com/wxpython/images/submenu.png)
python 代码
- import wx
- ID_QUIT = 1
- class SubmenuExample(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(350,250))
- #构造一个wx.MenuBar
- menubar = wx.MenuBar()
- #构造一个wx.Menu 并添加wx.MeunItem 和一个分隔符
- file = wx.Menu()
- file.Append(-1, '&New')
- file.Append(-1, '&Open')
- file.Append(-1, '&Save')
- file.AppendSeparator()
- #新构造一个wx.Menu
- imp = wx.Menu()
- imp.Append(-1, 'Import newsfeed list...')
- imp.Append(-1, 'Import bookmarks...')
- imp.Append(-1, 'Import mail...')
- #把这个菜单作为file的子菜单添加进来 用 AppenMenu() 方法
- file.AppendMenu(-1, '&Import', imp)
- quit = wx.MenuItem(file, ID_QUIT, '&Quit\tCtrl+W')
- quit.SetBitmap(wx.Bitmap('icons/bp_btn2.png'))
- file.AppendItem(quit)
- self.Bind(wx.EVT_MENU, self.OnQuit, id=ID_QUIT)
- menubar.Append(file, '&File')
- self.SetMenuBar(menubar)
- self.Centre()
- self.Show(True)
- def OnQuit(self, event):
- self.Close()
- app = wx.App()
- SubmenuExample(None, -1, 'Submenu')
- app.MainLoop()
4 Various menu items包含
normal item
check item
radio item
一个带有CheckItem的例子
![](http://zetcode.com/wxpython/images/checkmenuitem.png)
python 代码
- import wx
- ID_STAT = 1
- ID_TOOL = 2
- class CheckMenuItem(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(350, 250))
- menubar = wx.MenuBar()
- file = wx.Menu()
- view = wx.Menu()
- #在view这个Menu上加上两个check item id用在前面定义的ID_STAT和ID_TOOL
- #如果想定义为check类型的item就要在Append()后面加上一个参数kind=wx.ITEM_CHECK 默认的是wx.ITEM_NORMAL
- #Append返回的是一个wx.MeunItem
- self.shst = view.Append(ID_STAT, 'show statubar', 'Show StatuBar', kind=wx.ITEM_CHECK)
- self.shtl = view.Append(ID_TOOL, 'show toolbar', 'Show ToolBar', kind=wx.ITEM_CHECK)
- #默认把这两项勾选上
- view.Check(ID_STAT, True)
- view.Check(ID_TOOL, True)
- #绑定这两个check item的事件函数
- self.Bind(wx.EVT_MENU, self.ToggleStatusBar, id=ID_STAT)
- self.Bind(wx.EVT_MENU, self.ToggleToolBar, id=ID_TOOL)
- menubar.Append(file, '&File')
- menubar.Append(view, '&View')
- #把这个menubar天到Frame上
- self.SetMenuBar(menubar)
- #给Frame添加一个toolbar
- self.toolbar = self.CreateToolBar()
- self.toolbar.AddLabelTool(3, '', wx.Bitmap('icons/bp_btn2.png'))
- #给Frame添加一个statubar
- self.statusbar = self.CreateStatusBar()
- self.Centre()
- self.Show(True)
- #定义StatusBar的check事件
- def ToggleStatusBar(self, event):
- #如果勾选了 就显示StatusBar
- if self.shst.IsChecked():
- self.statusbar.Show()
- #如果没有勾选 就隐藏StatusBar
- else:
- self.statusbar.Hide()
- #同样的定义toolbar的check事件
- def ToggleToolBar(self, event):
- if self.shtl.IsChecked():
- self.toolbar.Show()
- else:
- self.toolbar.Hide()
- app = wx.App()
- CheckMenuItem(None, -1, 'check menu item')
- app.MainLoop()
5 Context menu
定义弹出式菜单 比如右键点击某个目标时候弹出的菜单
一个实例程序
python 代码
- import wx
- #创建一个分离的Menu class
- class MyPopupMenu(wx.Menu):
- def __init__(self, parent):
- wx.Menu.__init__(self)
- self.parent = parent
- #定义一个最小化窗口的item
- minimize = wx.MenuItem(self, wx.NewId(), 'Minimize')
- self.AppendItem(minimize)
- self.Bind(wx.EVT_MENU, self.OnMinimize, id=minimize.GetId())
- #定义一个关闭窗口的item
- close = wx.MenuItem(self, wx.NewId(), 'Close')
- #给Menu添加这个Close的Item 用的是AppendItem方法 因为是在Menu上添加,不是在MenuBar上添加
- self.AppendItem(close)
- self.Bind(wx.EVT_MENU, self.OnClose, id=close.GetId())
- #最小化窗口
- def OnMinimize(self, event):
- self.parent.Iconize()
- #关闭窗口
- def OnClose(self, event):
- self.parent.Close()
- class ContextMenu(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(250,150))
- #出发弹出窗口的事件是wx.EVT_RIGHT_DOWN 调用 OnRightDown
- self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
- self.Centre()
- self.Show()
- def OnRightDown(self, event):
- #第一个参数是弹出的窗口 第二个参数是位置
- self.PopupMenu(MyPopupMenu(self), event.GetPosition())
- app = wx.App()
- frame = ContextMenu(None, -1, 'context menu')
- app.MainLoop()
6 Toolbars 快捷的工具栏
参数表CreateToolBar(long style=-1, int winid=-1, String name=ToolBarNameStr)
![](http://zetcode.com/wxpython/images/simpletoolbar.jpg)
python 代码
- #!/usr/bin/python
- # simpletoolbar.py
- import wx
- class SimpleToolbar(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(300, 200))
- toolbar = self.CreateToolBar()
- #self.toolbar.AddLabelTool(wx.ID_EXIT, '', wx.Bitmap('icons/bp_btn2.png'))
- #AddSimpleTool方法来创建一个tool 不知道为什么调用上面的方法不其作用
- toolbar.AddSimpleTool(wx.ID_EXIT, wx.Image('icons/bp_btn2.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- #添加tool完了以后 调用此方法 在linux上不需要
- toolbar.Realize()
- #给这个tool添加事件处理
- self.Bind(wx.EVT_TOOL, self.OnExit, id=wx.ID_EXIT)
- self.Centre()
- self.Show(True)
- #定义这个tool bind的事件处理函数
- def OnExit(self, event):
- self.Close()
- app = wx.App()
- SimpleToolbar(None, -1, 'simple toolbar')
- app.MainLoop()
另一个例子 两个toolbar
![](http://zetcode.com/wxpython/images/toolbars.jpg)
python 代码
- #!/usr/bin/python
- # toolbars.py
- import wx
- class Toolbars(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(300, 200))
- #用一个BoxSizer容器来控制显示这两个toolbar
- vbox = wx.BoxSizer(wx.VERTICAL)
- toolbar1 = wx.ToolBar(self, -1)
- toolbar1.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_red.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar1.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_green.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar1.AddSimpleTool(wx.ID_ANY, wx.Image('icons/process.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar1.Realize()
- toolbar2 = wx.ToolBar(self, -1)
- toolbar2.AddSimpleTool(wx.ID_EXIT, wx.Image('icons/customcontrol.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar2.Realize()
- vbox.Add(toolbar1, 0, wx.EXPAND)
- vbox.Add(toolbar2, 0, wx.EXPAND)
- self.Bind(wx.EVT_TOOL, self.OnExit, id=wx.ID_EXIT)
- self.SetSizer(vbox)
- self.Centre()
- self.Show(True)
- def OnExit(self, event):
- self.Close()
- app = wx.App()
- Toolbars(None, -1, 'toolbars')
- app.MainLoop()
纵向toolbar
![](http://zetcode.com/wxpython/images/verticaltoolbar.jpg)
python 代码
- #!/usr/bin/python
- # verticaltoolbar.py
- import wx
- class VerticalToolbar(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(240, 300))
- #wx.TB_VERTICAL是纵向 wx.VERTICAL 是横向
- toolbar = self.CreateToolBar(wx.TB_VERTICAL)
- toolbar.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_red.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_green.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar.AddSimpleTool(wx.ID_REDO, wx.Image('icons/process.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar.AddSimpleTool(wx.ID_EXIT, wx.Image('icons/customcontrol.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar.Realize()
- self.Centre()
- self.Show(True)
- def OnExit(self, event):
- self.Close()
- app = wx.App()
- VerticalToolbar(None, -1, 'vertical toolbar')
- app.MainLoop()
带有分隔符的toolbar
#!/usr/bin/python
# toolbars.py
![](http://zetcode.com/wxpython/images/enabledisable.jpg)
python 代码
- import wx
- class Toolbars(wx.Frame):
- def __init__(self, parent, id, title):
- wx.Frame.__init__(self, parent, id, title, size=(300, 200))
- #这里如果不加wx.VERTICAL就编程一排的了
- vbox = wx.BoxSizer(wx.VERTICAL)
- toolbar1 = wx.ToolBar(self, -1)
- toolbar1.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_red.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar1.AddSimpleTool(wx.ID_ANY, wx.Image('icons/book_green.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- #添加一个分隔符
- toolbar1.AddSeparator()
- toolbar1.AddSimpleTool(wx.ID_REDO, wx.Image('icons/process.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar1.EnableTool(wx.ID_REDO, False)
- toolbar1.Realize()
- toolbar2 = wx.ToolBar(self, -1)
- toolbar2.AddSimpleTool(wx.ID_EXIT, wx.Image('icons/customcontrol.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')
- toolbar2.Realize()
- vbox.Add(toolbar1, 0, wx.EXPAND)
- vbox.Add(toolbar2, 0, wx.EXPAND)
- self.Bind(wx.EVT_TOOL, self.OnExit, id=wx.ID_EXIT)
- self.SetSizer(vbox)
- self.Centre()
- self.Show(True)
- def OnExit(self, event):
- self.Close()
- app = wx.App()
- Toolbars(None, -1, 'toolbars')
- app.MainLoop()