原文: http://zetcode.com/gui/pygtk/menus/

在 PyGTK 编程教程的这一部分中,我们将使用菜单。

菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用所花费的时间。

简单菜单

在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。

simplemenu.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows a simple menu
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. class PyApp(gtk.Window):
  11. def __init__(self):
  12. super(PyApp, self).__init__()
  13. self.set_title("Simple menu")
  14. self.set_size_request(250, 200)
  15. self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
  16. self.set_position(gtk.WIN_POS_CENTER)
  17. mb = gtk.MenuBar()
  18. filemenu = gtk.Menu()
  19. filem = gtk.MenuItem("File")
  20. filem.set_submenu(filemenu)
  21. exit = gtk.MenuItem("Exit")
  22. exit.connect("activate", gtk.main_quit)
  23. filemenu.append(exit)
  24. mb.append(filem)
  25. vbox = gtk.VBox(False, 2)
  26. vbox.pack_start(mb, False, False, 0)
  27. self.add(vbox)
  28. self.connect("destroy", gtk.main_quit)
  29. self.show_all()
  30. PyApp()
  31. gtk.main()

这是一个最小的菜单栏功能示例。

  1. mb = gtk.MenuBar()

MenuBar小部件已创建。

  1. filemenu = gtk.Menu()
  2. filem = gtk.MenuItem("File")
  3. filem.set_submenu(filemenu)

创建顶层MenuItem

  1. exit = gtk.MenuItem("Exit")
  2. exit.connect("activate", gtk.main_quit)
  3. filemenu.append(exit)

将创建出口MenuItem,并将其附加到文件MenuItem中。

  1. mb.append(filem)

顶级MenuItem被附加到MenuBar小部件。

  1. vbox = gtk.VBox(False, 2)
  2. vbox.pack_start(mb, False, False, 0)

与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框。

PyGTK 中的菜单 - 图1

图:简单菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 加速器是用于激活菜单项的键盘快捷键。

imagemenu.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows a menu with
  5. # images, accelerators and a separator
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. class PyApp(gtk.Window):
  12. def __init__(self):
  13. super(PyApp, self).__init__()
  14. self.set_title("Image menu")
  15. self.set_size_request(250, 200)
  16. self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
  17. self.set_position(gtk.WIN_POS_CENTER)
  18. mb = gtk.MenuBar()
  19. filemenu = gtk.Menu()
  20. filem = gtk.MenuItem("_File")
  21. filem.set_submenu(filemenu)
  22. agr = gtk.AccelGroup()
  23. self.add_accel_group(agr)
  24. newi = gtk.ImageMenuItem(gtk.STOCK_NEW, agr)
  25. key, mod = gtk.accelerator_parse("<Control>N")
  26. newi.add_accelerator("activate", agr, key,
  27. mod, gtk.ACCEL_VISIBLE)
  28. filemenu.append(newi)
  29. openm = gtk.ImageMenuItem(gtk.STOCK_OPEN, agr)
  30. key, mod = gtk.accelerator_parse("<Control>O")
  31. openm.add_accelerator("activate", agr, key,
  32. mod, gtk.ACCEL_VISIBLE)
  33. filemenu.append(openm)
  34. sep = gtk.SeparatorMenuItem()
  35. filemenu.append(sep)
  36. exit = gtk.ImageMenuItem(gtk.STOCK_QUIT, agr)
  37. key, mod = gtk.accelerator_parse("<Control>Q")
  38. exit.add_accelerator("activate", agr, key,
  39. mod, gtk.ACCEL_VISIBLE)
  40. exit.connect("activate", gtk.main_quit)
  41. filemenu.append(exit)
  42. mb.append(filem)
  43. vbox = gtk.VBox(False, 2)
  44. vbox.pack_start(mb, False, False, 0)
  45. self.add(vbox)
  46. self.connect("destroy", gtk.main_quit)
  47. self.show_all()
  48. PyApp()
  49. gtk.main()

我们的示例显示了具有三个子菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器处于活动状态。

  1. agr = gtk.AccelGroup()
  2. self.add_accel_group(agr)

要使用加速器,我们创建一个全局AccelGroup对象。 稍后将使用。

  1. newi = gtk.ImageMenuItem(gtk.STOCK_NEW, agr)

ImageMenuItem已创建。 图片来自图片库。

  1. key, mod = gtk.accelerator_parse("<Control>N")

gtk.accelerator_parse()函数解析指定的加速器字符串,并返回一个 2 元组,其中包含与加速器相对应的键值和修饰符掩码。

  1. newi.add_accelerator("activate", agr, key,
  2. mod, gtk.ACCEL_VISIBLE)

这将为退出菜单项创建 Ctrl + Q 加速器。

  1. sep = gtk.SeparatorMenuItem()
  2. filemenu.append(sep)

这些行创建一个分隔符。 它用于将菜单项分组为逻辑组。

PyGTK 中的菜单 - 图2

图:图像 menu

CheckMenuItem

CheckMenuItem是带有复选框的菜单项。 它可以用于布尔属性。

checkmenuitem.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows how to
  5. # use a CheckMenuItem
  6. #
  7. # author: jan bodnar
  8. # website: zetcode.com
  9. # last edited: February 2009
  10. import gtk
  11. class PyApp(gtk.Window):
  12. def __init__(self):
  13. super(PyApp, self).__init__()
  14. self.set_title("Check menu item")
  15. self.set_size_request(250, 200)
  16. self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
  17. self.set_position(gtk.WIN_POS_CENTER)
  18. mb = gtk.MenuBar()
  19. filemenu = gtk.Menu()
  20. filem = gtk.MenuItem("File")
  21. filem.set_submenu(filemenu)
  22. viewmenu = gtk.Menu()
  23. view = gtk.MenuItem("View")
  24. view.set_submenu(viewmenu)
  25. stat = gtk.CheckMenuItem("View Statusbar")
  26. stat.set_active(True)
  27. stat.connect("activate", self.on_status_view)
  28. viewmenu.append(stat)
  29. exit = gtk.MenuItem("Exit")
  30. exit.connect("activate", gtk.main_quit)
  31. filemenu.append(exit)
  32. mb.append(filem)
  33. mb.append(view)
  34. self.statusbar = gtk.Statusbar()
  35. self.statusbar.push(1, "Ready")
  36. vbox = gtk.VBox(False, 2)
  37. vbox.pack_start(mb, False, False, 0)
  38. vbox.pack_start(gtk.Label(), True, False, 0)
  39. vbox.pack_start(self.statusbar, False, False, 0)
  40. self.add(vbox)
  41. self.connect("destroy", gtk.main_quit)
  42. self.show_all()
  43. def on_status_view(self, widget):
  44. if widget.active:
  45. self.statusbar.show()
  46. else:
  47. self.statusbar.hide()
  48. PyApp()
  49. gtk.main()

在我们的代码示例中,我们显示一个检查菜单项。 如果该复选框已激活,则显示状态栏小部件。 如果不是,状态栏将被隐藏。

  1. stat = gtk.CheckMenuItem("View Statusbar")

CheckMenuItem小部件已创建。

  1. stat.set_active(True)

set_active()方法选中/取消选中检查菜单项。

  1. if widget.active:
  2. self.statusbar.show()
  3. else:
  4. self.statusbar.hide()

根据CheckMenuItem的活动属性,我们显示或隐藏状态栏小部件。

PyGTK 中的菜单 - 图3

图:CheckMenuItem

子菜单

我们的最后一个示例演示了如何在 PyGTK 中创建子菜单。

submenu.py

  1. #!/usr/bin/python
  2. # ZetCode PyGTK tutorial
  3. #
  4. # This example shows a submenu
  5. #
  6. # author: jan bodnar
  7. # website: zetcode.com
  8. # last edited: February 2009
  9. import gtk
  10. class PyApp(gtk.Window):
  11. def __init__(self):
  12. super(PyApp, self).__init__()
  13. self.set_title("Submenu")
  14. self.set_size_request(250, 200)
  15. self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
  16. self.set_position(gtk.WIN_POS_CENTER)
  17. mb = gtk.MenuBar()
  18. filemenu = gtk.Menu()
  19. filem = gtk.MenuItem("File")
  20. filem.set_submenu(filemenu)
  21. mb.append(filem)
  22. imenu = gtk.Menu()
  23. importm = gtk.MenuItem("Import")
  24. importm.set_submenu(imenu)
  25. inews = gtk.MenuItem("Import news feed...")
  26. ibookmarks = gtk.MenuItem("Import bookmarks...")
  27. imail = gtk.MenuItem("Import mail...")
  28. imenu.append(inews)
  29. imenu.append(ibookmarks)
  30. imenu.append(imail)
  31. filemenu.append(importm)
  32. exit = gtk.MenuItem("Exit")
  33. exit.connect("activate", gtk.main_quit)
  34. filemenu.append(exit)
  35. vbox = gtk.VBox(False, 2)
  36. vbox.pack_start(mb, False, False, 0)
  37. self.add(vbox)
  38. self.connect("destroy", gtk.main_quit)
  39. self.show_all()
  40. PyApp()
  41. gtk.main()

子菜单创建。

  1. imenu = gtk.Menu()

子菜单是Menu

  1. importm = gtk.MenuItem("Import")
  2. importm.set_submenu(imenu)

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. inews = gtk.MenuItem("Import news feed...")
  2. ibookmarks = gtk.MenuItem("Import bookmarks...")
  3. imail = gtk.MenuItem("Import mail...")
  4. imenu.append(inews)
  5. imenu.append(ibookmarks)
  6. imenu.append(imail)

子菜单有其自己的菜单项。

PyGTK 中的菜单 - 图4

图:子菜单

在 PyGTK 编程库的这一章中,我们展示了如何使用菜单。