Pygtk 简明教程
PyGTK - MenuBar,Menu and MenuItem
在 gtk.Window 的标题栏正下方的一根横向条保留用于显示一系列菜单。在 PyGTK API 中,它是一个 gtk.MenuBar 类的对象。
gtk.Menu 类的对象被添加到菜单栏中。它还用于创建上下文菜单和弹出菜单。每个菜单可以包含一个或多个 gtk.MenuItem 小部件。其中一些可以是子菜单,并拥有层叠的 MenuItem 按钮。
gtk.MenuBar 是从 gtk.MenuShell 类继承下来的。它有一个简单的默认构造函数 -
gtk.MenuBar()
要向 MenuBar 中添加菜单,请使用 MenuBar 类的 append() 方法。
为了构造菜单,请创建带有标签的 MenuItem 窗口小部件,该标签希望出现在菜单栏中,并将其设置为子菜单。
例如,以下代码用于设置文件菜单 -
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
现在,可以在菜单中添加 MenuItem 类的一个或多个窗口小部件。
item1 = gtk.MenuItem("New")
item2 = gtk.MenuItem("Open")
这些 MenuItems 将被添加到菜单窗口小部件中,然后将菜单对象添加到菜单栏中。
menu1.append(item1)
menu1.append(item2)
mb.append(menu1)
PyGTK 工具包提供了许多类型的 MenuItem 窗口小部件。ImageMenuItem 是与之关联图像的菜单项。您可以通过使用库存 ID 参数使用任何库存图像,或通过 set_image() 方法分配任何其他图像。
例如,“新建”菜单项具有图像,以以下方式创建 -
new = gtk.ImageMenuItem(gtk.STOCK_NEW)
menu1.append(new)
类似地,还可以使用以下代码添加 CheckMenuItem -
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
还可以使用此代码添加一组单选按钮 -
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
有时您可能希望在菜单项之间添加分隔线。为此, SeparatorMenuItem 也可用。
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
您还可以向菜单项分配键盘快捷键。PyGTK 有加速器。首先创建一个加速器组,并将其附加到顶层窗口。
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
要分配快捷键,请使用具有以下原型的 add_accelerator() 函数 -
Item1.add_accelerator(signal, group, key, modifier, flags)
以下是一些预定义的修饰符 -
-
SHIFT_MASK
-
LOCK_MASK
-
CONTROL_MASK
-
BUTTON1_MASK
-
BUTTON1_MASK
为了向新建菜单项分配 Ctrl+N 快捷键,请使用以下语法 -
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
Example
以下示例演示了上面讨论的功能 -
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("Menu Demo")
self.set_default_size(250, 200)
self.set_position(gtk.WIN_POS_CENTER)
mb = gtk.MenuBar()
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
menu1.append(new)
open = gtk.ImageMenuItem(gtk.STOCK_OPEN)
menu1.append(open)
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
exit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menu1.append(exit)
menu2 = gtk.Menu()
edit = gtk.MenuItem("_Edit")
edit.set_submenu(menu2)
copy = gtk.ImageMenuItem(gtk.STOCK_COPY)
menu2.append(copy)
cut = gtk.ImageMenuItem(gtk.STOCK_CUT)
menu2.append(cut)
paste = gtk.ImageMenuItem(gtk.STOCK_PASTE)
menu2.append(paste)
mb.append(file)
mb.append(edit)
vbox = gtk.VBox(False, 2)
vbox.pack_start(mb, False, False, 0)
self.add(vbox)
self.connect("destroy", gtk.main_quit)
self.show_all()
if __name__ == '__main__':
PyApp()
gtk.main()
以上代码将生成以下输出 −