实战wxPython:007 - 复选菜单项和上下文菜单

复选菜单项

菜单项有三种样式:

  • 常规样式(normal item)
  • 复选样式(check item)
  • 单选样式(radio item)

在下面的例子中,我们将演示复选菜单项。复选菜单项由菜单中的对勾直观表示。

import wx
import os
 
class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)
        
        self.SetTitle('实战wxPython: 菜单Check操作')
        self.SetSize(400, 300)
        
        self.InitUi()
        
        self.Centre()
        
    def InitUi(self):
        menubar = wx.MenuBar()
        viewMenu  = wx.Menu()
        
        self.showStatus = viewMenu.Append(wx.ID_ANY, '显示状态条','显示状态条', kind=wx.ITEM_CHECK)
        self.showTool = viewMenu.Append(wx.ID_ANY, '显示工具条', '显示工具条', kind=wx.ITEM_CHECK)
        
        viewMenu.Check(self.showStatus.GetId(), True)
        viewMenu.Check(self.showTool.GetId(), True)
        
        self.Bind(wx.EVT_MENU, self.ToggleStatusBar, self.showStatus)
        self.Bind(wx.EVT_MENU, self.ToggleToolBar, self.showTool)
               
        menubar.Append(viewMenu, '视图(&V)')
        self.SetMenuBar(menubar)
        
        self.toolbar = self.CreateToolBar()
        self.toolbar.AddTool(1, '', wx.Bitmap(os.path.dirname(__file__) + '/file_new.png'))
        self.toolbar.AddTool(1, '', wx.Bitmap(os.path.dirname(__file__) + '/file_open.png'))
        self.toolbar.AddTool(1, '', wx.Bitmap(os.path.dirname(__file__) + '/file_save.png'))
        self.toolbar.Realize()
        
        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetStatusText('就绪')
        
    def ToggleStatusBar(self, e):
 
        if self.showStatus.IsChecked():
            self.statusbar.Show()
        else:
            self.statusbar.Hide()
 
    def ToggleToolBar(self, e):
 
        if self.showTool.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()
        
def main():
    app = wx.App()
    window = Example(None)
    window.Show()
    app.MainLoop()
    
if __name__ == '__main__':
    main()

创建一个视图菜单,其中有两个复选菜单项。这两个菜单项将显示和隐藏状态栏和工具栏。

self.showStatus = viewMenu.Append(wx.ID_ANY, '显示状态条','显示状态条', kind=wx.ITEM_CHECK)
self.showTool = viewMenu.Append(wx.ID_ANY, '显示工具条', '显示工具条', kind=wx.ITEM_CHECK)

如果要添加复选菜单项,将参数kind设置为wx.ITEM_CHECK即可。kind的默认参数为wx.ITEM_NORMAL。

viewMenu.Check(self.showStatus.GetId(), True)
viewMenu.Check(self.showTool.GetId(), True)

当应用程序启动时,工具栏和状态栏都是可见的,因为使用wx.Menu的方法Check()复选上创建的两个菜单项。

def ToggleStatusBar(self, e):
    if self.showStatus.IsChecked():
        self.statusbar.Show()
    else:
        self.statusbar.Hide()

根据复选菜单项的状态显示或者隐藏状态栏。使用IsChecked()方法可以获得菜单项是否处于复选状态。工具栏的情况也一样。

示例程序的运行结果如下图所示:

复选菜单项演示

上下文菜单

上下文菜单常常也称作弹出菜单,在一个交互窗口中,上下文菜单就是一组操作命令的列表。例如,在常见的Firefox浏览器中,到我们右键单击网页时,将会弹出一个上下文菜单。在这些菜单项里,我们可重新加载页面,返回或者查看页面源。如果右键单击工具栏,则会弹出另外一个用于管理工具栏的上下文菜单。

import wx
 
class MyPopupMenu(wx.Menu):
    def __init__(self, parent):
        super(MyPopupMenu, self).__init__()
        
        self.parent = parent
        
        menuItemMin = wx.MenuItem(self, wx.NewId(), '最小化')
        self.Append(menuItemMin)
        self.Bind(wx.EVT_MENU, self.OnMinimize, menuItemMin)
        
        menuItemClose = wx.MenuItem(self, wx.NewId(), '关闭')
        self.Append(menuItemClose)
        self.Bind(wx.EVT_MENU, self.OnClose, menuItemClose)
        
    def OnMinimize(self, e):
        self.parent.Iconize()
        
    def OnClose(self, e):
        self.parent.Close()
 
class Example(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs)
        
        self.SetTitle('实战wxPython: 上下文菜单')
        self.SetSize(400, 300)
        
        self.InitUi()
        
        self.Centre()
        
    def InitUi(self):
        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
        
    def OnRightDown(self, e):
        self.PopupMenu(MyPopupMenu(self), e.GetPosition())
        
def main():
    app = wx.App()
    window = Example(None)
    window.Show()
    app.MainLoop()
    
if __name__ == '__main__':
    main()

在这个示例中,我们为主窗口创建了一个上下文菜单。它有两个菜单项,一个菜单项执行最小化应用程序,另一个菜单项将终止应用程序。

class MyPopupMenu(wx.Menu):
    def __init__(self, parent):
        super(MyPopupMenu, self).__init__()

创建一个单独的继承自wx.Menu的MyPopupMenu类。

menuItemMin = wx.MenuItem(self, wx.NewId(), '最小化')
self.Append(menuItemMin)
self.Bind(wx.EVT_MENU, self.OnMinimize, menuItemMin)

创建一个菜单项,并将其添加到上下文菜单。然后将事件处理程序绑定到此菜单项。

如果右键单击窗口,将触发窗口的wx.EVT_RIGHT_DOWN事件,该事件绑定的方法将调用窗口的onRightDown()方法。

def OnRightDown(self, e):
    self.PopupMenu(MyPopupMenu(self), e.GetPosition())

在onRightDown()方法中,调用PopupMenu()方法显示上下文菜单。其中第一个参数为要显示的菜单。第二个参数是上下文菜单出现的位置。上下文菜单出现在鼠标光标点击的位置(调用事件对象的GetPosition()方法获得鼠标的点击位置)。

上下文菜单示例运行结果如下图:

 上下文菜单示例

本文知识点

  • 复选菜单项和单选菜单项。
  • 上下文菜单。

前一篇:实战wxPython: 006 - 怎样给一个菜单添加子菜单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值