wxpython 右键菜单_wxPython menu 详解

本章内容包括:

创建菜单 使用菜单项工作 添加子菜单、弹出菜单和自定义菜单 菜单的设计准则

难以想象一个应用程序的顶部没 有我们常见的以File和Edit开头,以Help结尾的栏目。这太糟糕了。菜单是那些隐藏在背 后并不太重视绘制的标准界面工具的一个公共的部分,由于菜单使得用户能够快速而容易地访问所有的功能,所以它实实在在是一个革命。

在 wxPython中有三个主要的类,它们管理菜单的功能。类wx.MenuBar管 理菜单栏自身,而wx.Menu管理一个单独的下拉或弹出菜单。当然,一个wx.MenuBar实例可以包含多个wx.Menu实 例。类wx.MenuItem代表一个wx.Menu中的一个特定项目。

在第二章中我们对菜单作了一个简要的介绍,在例5.5中我们提供了一个容易创建菜单项的机制,在第7章中我对特殊的菜 单效果作了一些介绍。在这一章,我们将对wxPython菜单的创建和使用提供更多的细节。

创建菜单

首先,我们将讨论菜单栏。要使用一个菜单栏,就要执行下面这些行动:

·创建菜单栏 ·把菜单栏附加给 框架 ·创建单个的菜单 ·把菜单附加给菜单栏或一个父菜单 ·创建单个的菜单项 · 把这些菜单项附加给适当的菜单 ·为每个菜单项创建一个事件绑定

上 面行动的执行顺序可以灵活点,只要你在使用之前创建所有项目,并且所有行动在框架的初始化方法中完成就可以了。在这 个过程中你可以以后来处理菜单,但是在框架可见后,你的执行顺序将影响用户所见到的东西。例如,如果你在框架创建后将菜单栏附加给框架,或等到直到所有其 它的过程完成了。考虑到可读性和维护的目的,我们推荐你将相关的部分分整理在一起。对于如何组织菜单的创建的建议,请看第5章的重构。在接下来的部分,我 们将涉及基本的菜单任务。

如何创建一 个菜单栏并把它附加到一个框架?

要创建一个菜单栏,使用wx.MenuBar构造函数,它没有参数:

切换行号显示切换行号显示 1 wx.MenuBar()

一 旦菜单栏被创建了,使用SetMenuBar()方法将它附加给一个wx.Frame(或其子类)。通常这些都在框 架的__init__或OnInit()方法中实施:

切换行号显示切换行号显示 1 menubar = wx.MenuBar()

2 self.SetMenuBar

你 不必为菜单栏维护一个临时变量,但是这样做将使得添加菜单到菜单栏多少更简单点。要掌握程序中的其它地方的菜单栏,使用wx.Frame.GetMenuBar()。

如何创 建一个菜单并把它附加到菜单栏?

wxPython菜单栏由一个个的菜单组成,其中的每个菜单都需要分别被创建。下面显示了wx.Menu的 构造函数:

切换行号显示切换行号显示 1 wx.Menu(title="", style=0)

对 于wx.Menu只有一个有效的样式。在GTK下,样式wx.MENU_TEAROFF使得菜单 栏上的菜单能够被分开并作为独立的选择器。在其它平台下,这个样式没有作用。如果平台支持,那么菜单被创建时可以有一个标题。图10.1显示了一个带有三 个菜单的空白窗口。例10.1显示了被添到一个菜单栏上的一系列菜单,这些菜单没有被添加菜单项。

图10.1

例10.1 添加菜单到一个菜单栏

切换行号显示切换行号显示 1 import wx

2

3 class MyFrame(wx.Frame):

4 def __init__(self):

5 wx.Frame.__init__(self, None, -1, "Simple Menu Example")

6 p = wx.Panel(self)

7 menuBar = wx.MenuBar()# 创建一个菜单栏

8 menu = wx.Menu()# 创建一个菜单

9 menuBar.Append(menu, "Left Menu")# 添加菜单到菜单栏

10 menu2 = wx.Menu()

11 menuBar.Append(menu2, "Middle Menu")

12 menu3 = wx.Menu()

13 menuBar.Append(menu3, "Right Menu")

14 self.SetMenuBar(menuBar)

15

16 if __name__ == "__main__":

17 app = wx.PySimpleApp()

18 frame = MyFrame()

19 frame.Show()

20 app.MainLoop()

在 wxPython的 菜单API中,一个对象的大部分处理是由它的容器类来管理的。在本章的后面,我们将讨论wx.Menu的特定的方 法,因为这些方法的大多数涉及到菜单中的菜单项的处理。在这一节的剩余部分,由于我们正在谈论处理wx.Menu对象,所以我们将列出 wx.MenuBar的 那些涉及到菜单的方法。表10.1显示了wx.MenuBar中的四个方法,它们处理菜单栏的内容。

表10.1 在菜单栏处理菜单的wx.MenuBar的 方法

Append(menu, title)

将menu参数添加到菜单栏的尾部(靠右显示)。title参 数被用来显示新的菜单。如果成功返回True,否则返回False。

Insert(pos, menu, title)

将 给定的menu插入到指定的位置pos(调用这个函数之后,GetMenu(pos) == menu成立)。就像在列表中插入一样,所有后面的菜单将被右移。菜单的索引以0开始,所以pos为0等同 于将菜单放置于菜单栏的左端。使用GetMenuCount()作为pos等同于使用Append。title被 用于显示名字。函数如果成功则返回True。

Remove(pos)

删除位于pos的菜单,之后的其它菜单左移。函数返回被删除的菜单。

Replace(pos, menu, title)

使用给定的menu,和title替换位置pos处 的菜单。菜单栏上的其它菜单不受影响。函数返回替换前的菜单。

wx.MenuBar包 含一些其它的方法。它们用另外的方式处理菜单栏中的菜单,如表10.2所示。

表10.2 wx.MenuBar的菜单属性方法

EnableTop(pos, enable)

设置位置pos处的菜单的可用/不可用状态。如果enable是True, 那么该菜单是可用的,如果是False,那么它不可用。

GetMenu(pos)

返回给定位置处的菜单对象。

GetMenuCount()

返回菜单栏中的菜单的数量。

FindMenu(title)

返回菜单栏有给定title的菜单的整数索引。如果没有这样的菜单,那么函数返回 常量wx.NOT_FOUND。该方法将忽略快捷键,如果有的话。

GetLabelTop(pos),SetLabelTop(pos, label)

得到或设置给定位置的菜单的标签。

如何给下拉菜单填加项目?

这里有一对机制用于将新的菜单项添加给一个下拉菜单。较容易的是使用wx.Menu的Append()方 法:

切换行号显示切换行号显示 1 Append(id, string, helpStr="", kind=wx.ITEM_NORMAL)

参 数id是一个wxPython ID。参数string是将被显示在菜单上的 字符串。当某个菜单高亮时,如果设置了参数helpStr,那么该参数将被显示在框架的状态栏中。kind参数使你 能够设置菜单项的类型,通过该参数可以将菜单项设置为开关类型。在这一章的后面,我们将讨论管理开关项的更好的方法。Append方法 把新的项放到菜单的尾部。

例10.2 显示了一个使用Append()方 法来建立一个有两个项链和一个分隔符的菜单。

例10.2 添加项目到一个菜单的示例代码

切换行号显示切换行号显示 1 import wx

2

3 class MyFrame(wx.Frame):

4 def __init__(self):

5 wx.Frame.__init__(self, None, -1, "Simple Menu Example")

6 p = wx.Panel(self)

7 self.CreateStatusBar()

8 menu = wx.Menu()

9 simple = menu.Append(-1, "Simple menu item", "This is some help text")

10 menu.AppendSeparator()

11 exit = menu.Append(-1, "Exit")

12 self.Bind(wx.EVT_MENU, self.OnSimple, simple)

13 self.Bind(wx.EVT_MENU, self.OnExit, exit)

14 menuBar = wx.MenuBar()

15 menuBar.Append(menu, "Simple Menu")

16 self.SetMenuBar(menuBar)

17

18 def OnSimple(self, event):

19 wx.MessageBox("You selected the simple menu item")

20

21 def OnExit(self, event):

22 self.Close()

23

24 if __name__ == "__main__":

25 app = wx.PySimpleApp()

26 frame = MyFrame()

27 frame.Show()

28 app.MainLoop()

图10.2 显示了一个带有分隔符和状态文本的菜单。

图10.2

连同Append()一起,这里还有两个另外的用于菜单项插入的方法。要把一个菜单项放在菜单的开 头,使用下面两个方法之一:

·Prepend(id, string, helpStr=”", kind=wx.ITEM_NORMAL) ·PrependSeparator()

要把新的项放入菜单中的任一位置,使用这下面的insert方法之一:

·Insert(pos, id, string, helpStr=”", kind=wx.ITEM_NORMAL) ·InsertSeparator(pos)

参数pos是菜单项要插入的位置的索引,所以如果索引为0,则新的项被放置在开头,如果索引值为菜单 的尺寸,那么新的项被放置在尾部。所以在插入点后的菜单项将被向下移动。

所有的这些插入方法都隐含 地创建一个wx.MenuItem类的实例。你也可以使用该类的构造函数显式地创建该类的一个实例,以便设置该菜单项的除了标签以外的 其它的属性。比如你可以设置自定义的字体或颜色。wx.MenuItem的构造函数如下:

wx.MenuItem(parentMenu=None, id=ID_ANY, text=”",

helpString=”", kind=wx.ITEM_NORMAL, subMenu=None)

参 数parentMenu必须是一个wx.Menu实例(如果设置了的话)。当 构造时,这个新的菜单项不是自动被添加到父菜单上显示的。你必须自己来实现。这个行为与wxPython窗口部件和它们的容器的通常的 行为不同。参数id是新项的标识符。参数text是新项显示在菜单中的字符串,参数helpString是 当该菜单项高亮时显示在状态栏中的字符串。kind是菜单项的类型,wx.ITEM_NORMAL代表纯菜单项;我 们以后会看到开关菜单项有不同的类型值。如果参数subMenu的值不是null,那么这个新的菜单项实际上就是一 个子菜单。我们不推荐你使用这个机制来创建子菜单;替而代之,可以使用在10.3节中说明的机制来装扮你的菜单。

不像大多数窗口部件,创建菜单项并不将它添加到指定的父菜单。要将新的菜单项添加到一个菜单中,使用下面的wx.Menu方 法之一:

·AppendItem(aMenuItem) ·InsertItem(pos, aMenuItem) ·PrependItem(aMenuItem)

要 从菜单中删除一个菜单项,使用方法Remove(id), 它要求一个wxPython ID,或RemoveItem(item),它要求一个菜单项作为 参数。删除一个菜单项后,后面的菜单项将上移。Remove()方法将返回所删除的实际的菜单项。这使你能够存储该菜单项以备后用。与 菜单栏不同,菜单没有直接替换菜单项的方法。替换必须通过先删除再插入来实现。

wx.Menu类 也有两个用来获取它的菜单项的信息的get*方法。GetMenuItemCount()返回菜单中项目的数量,GetMenuItems()返 回菜单中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值