原文: http://zetcode.com/tkinter/menustoolbars/

在 Tkinter 教程的这一部分中,我们将使用菜单和工具栏。

菜单栏是 GUI 应用中最可见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,我们必须记住许多奥术命令,在这里,我们将大多数命令分组为逻辑部分。 有公认的标准可以进一步减少学习新应用的时间。 菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。

Tkinter 简单菜单

第一个示例显示了一个简单的菜单。

simple_menu.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program shows a simple
  5. menu. It has one action, which
  6. will terminate the program, when
  7. selected.
  8. Author: Jan Bodnar
  9. Last modified: April 2019
  10. Website: www.zetcode.com
  11. """
  12. from tkinter import Tk, Frame, Menu
  13. class Example(Frame):
  14. def __init__(self):
  15. super().__init__()
  16. self.initUI()
  17. def initUI(self):
  18. self.master.title("Simple menu")
  19. menubar = Menu(self.master)
  20. self.master.config(menu=menubar)
  21. fileMenu = Menu(menubar)
  22. fileMenu.add_command(label="Exit", command=self.onExit)
  23. menubar.add_cascade(label="File", menu=fileMenu)
  24. def onExit(self):
  25. self.quit()
  26. def main():
  27. root = Tk()
  28. root.geometry("250x150+300+300")
  29. app = Example()
  30. root.mainloop()
  31. if __name__ == '__main__':
  32. main()

我们的示例将显示一个菜单项。 通过选择退出菜单项,我们关闭应用。

  1. menubar = Menu(self.master)
  2. self.master.config(menu=menubar)

在这里,我们创建一个菜单栏。 这是一个常规的Menu小部件,配置为根窗口的菜单栏。

  1. fileMenu = Menu(menubar)

我们创建一个文件菜单对象。 菜单是一个包含命令的下拉窗口。

  1. fileMenu.add_command(label="Exit", command=self.onExit)

我们向文件菜单添加命令。 该命令将调用onExit()方法。

  1. menubar.add_cascade(label="File", menu=fileMenu)

使用add_cascade()方法将文件菜单添加到菜单栏。

Tkinter 中的菜单和工具栏 - 图1

图:简单菜单

Tkinter 子菜单

子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。

submenu.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script we create a submenu
  5. a separator and keyboard shortcuts to menus.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Menu
  11. class Example(Frame):
  12. def __init__(self):
  13. super().__init__()
  14. self.initUI()
  15. def initUI(self):
  16. self.master.title("Submenu")
  17. menubar = Menu(self.master)
  18. self.master.config(menu=menubar)
  19. fileMenu = Menu(menubar)
  20. submenu = Menu(fileMenu)
  21. submenu.add_command(label="New feed")
  22. submenu.add_command(label="Bookmarks")
  23. submenu.add_command(label="Mail")
  24. fileMenu.add_cascade(label='Import', menu=submenu, underline=0)
  25. fileMenu.add_separator()
  26. fileMenu.add_command(label="Exit", underline=0, command=self.onExit)
  27. menubar.add_cascade(label="File", underline=0, menu=fileMenu)
  28. def onExit(self):
  29. self.quit()
  30. def main():
  31. root = Tk()
  32. root.geometry("250x150+300+300")
  33. app = Example()
  34. root.mainloop()
  35. if __name__ == '__main__':
  36. main()

在示例中,文件菜单的子菜单中有三个选项。 我们创建一个分隔符和键盘快捷键。

  1. submenu = Menu(fileMenu)
  2. submenu.add_command(label="New feed")
  3. submenu.add_command(label="Bookmarks")
  4. submenu.add_command(label="Mail")

我们有一个包含三个命令的子菜单。 子菜单是常规菜单。

  1. fileMenu.add_cascade(label='Import', menu=submenu, underline=0)

通过将菜单添加到fileMenu而不是菜单栏,我们创建一个子菜单。 underline参数创建键盘快捷键。 它提供了应加下划线的字符位置。 在我们的情况下,这是第一个。 位置从零开始。 当我们单击“文件”菜单时,将显示一个弹出窗口。 导入菜单下划线一个字符。 我们可以使用鼠标指针或 Alt + I 快捷方式选择它。

  1. fileMenu.add_separator()

分隔符是一条水平线,可以在视觉上分隔菜单命令。 这样,我们可以将项目分组到一些合理的位置。

Tkinter 中的菜单和工具栏 - 图2

图:子菜单

Tkinter 弹出菜单

在下一个示例中,我们创建一个弹出菜单。 弹出菜单也称为上下文菜单。 它可以显示在窗口客户区的任何位置。

popup_menu.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this program, we create
  5. a popup menu.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Menu
  11. class Example(Frame):
  12. def __init__(self):
  13. super().__init__()
  14. self.initUI()
  15. def initUI(self):
  16. self.master.title("Popup menu")
  17. self.menu = Menu(self.master, tearoff=0)
  18. self.menu.add_command(label="Beep", command=self.bell)
  19. self.menu.add_command(label="Exit", command=self.onExit)
  20. self.master.bind("<Button-3>", self.showMenu)
  21. self.pack()
  22. def showMenu(self, e):
  23. self.menu.post(e.x_root, e.y_root)
  24. def onExit(self):
  25. self.quit()
  26. def main():
  27. root = Tk()
  28. root.geometry("250x150+300+300")
  29. app = Example()
  30. root.mainloop()
  31. if __name__ == '__main__':
  32. main()

在我们的示例中,我们使用两个命令创建一个弹出菜单。

  1. self.menu = Menu(self.master, tearoff=0)

上下文菜单是常规的Menu小部件。 tearoff函数已关闭。 现在无法将菜单分离到新的顶层窗口中。

  1. self.master.bind("<Button-3>", self.showMenu)

我们将<Button-3>事件绑定到showMenu()方法。 当我们右键单击窗口的客户区域时,将生成事件。

  1. def showMenu(self, e):
  2. self.menu.post(e.x_root, e.y_root)

showMenu()方法显示上下文菜单。 弹出菜单显示在鼠标单击的 x 和 y 坐标处。

Tkinter 中的菜单和工具栏 - 图3

图:弹出菜单

Tkinter 工具栏

菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。 Tkinter 中没有工具栏小部件。

toolbar.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this program, we create a toolbar.
  5. Author: Jan Bodnar
  6. Last modified: April 2019
  7. Website: www.zetcode.com
  8. """
  9. from PIL import Image, ImageTk
  10. from tkinter import Tk, Frame, Menu, Button
  11. from tkinter import LEFT, TOP, X, FLAT, RAISED
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Toolbar")
  18. menubar = Menu(self.master)
  19. self.fileMenu = Menu(self.master, tearoff=0)
  20. self.fileMenu.add_command(label="Exit", command=self.onExit)
  21. menubar.add_cascade(label="File", menu=self.fileMenu)
  22. toolbar = Frame(self.master, bd=1, relief=RAISED)
  23. self.img = Image.open("exit.png")
  24. eimg = ImageTk.PhotoImage(self.img)
  25. exitButton = Button(toolbar, image=eimg, relief=FLAT,
  26. command=self.quit)
  27. exitButton.image = eimg
  28. exitButton.pack(side=LEFT, padx=2, pady=2)
  29. toolbar.pack(side=TOP, fill=X)
  30. self.master.config(menu=menubar)
  31. self.pack()
  32. def onExit(self):
  33. self.quit()
  34. def main():
  35. root = Tk()
  36. root.geometry("250x150+300+300")
  37. app = Example()
  38. root.mainloop()
  39. if __name__ == '__main__':
  40. main()

我们的工具栏位于我们放置按钮的框架上。

  1. toolbar = Frame(self.master, bd=1, relief=RAISED)

工具栏已创建。 它是Frame。 我们创建了一个凸起的边框,以便可见工具栏的边界。

  1. self.img = Image.open("exit.png")
  2. eimg = ImageTk.PhotoImage(self.img)

创建工具栏按钮的图像和照片图像。

  1. exitButton = Button(toolbar, image=eimg, relief=FLAT,
  2. command=self.quit)

Button小部件已创建。

  1. exitButton.pack(side=LEFT, padx=2, pady=2)

工具栏是框架,框架是容器小部件。 我们将按钮包装在左侧,并添加一些填充。

  1. toolbar.pack(side=TOP, fill=X)

工具栏本身包装在顶层窗口的顶部。 它是水平拉伸的。

Tkinter 中的菜单和工具栏 - 图4

图:工具栏

在 Tkinter 教程的这一部分中,我们使用了菜单和工具栏。