使用 Python 和 Tkinter 创建菜单
Tkinter 是 Python 的标准 GUI 工具包,可以轻松创建包含菜单的应用程序,下面我将介绍如何使用 Tkinter 创建各种类型的菜单。

基本菜单结构
一个典型的 Tkinter 菜单包含以下部分:
- 主菜单栏:应用程序顶部的水平菜单栏
- 菜单项:主菜单栏中的项目(如"文件"、"编辑"等)
- 子菜单:点击菜单项后显示的下拉菜单
- 菜单命令:子菜单中的具体操作项
基本代码示例
import tkinter as tk
from tkinter import messagebox
def new_file():
messagebox.showinfo("新建", "创建新文件")
def open_file():
messagebox.showinfo("打开", "打开文件")
def save_file():
messagebox.showinfo("保存", "保存文件")
def exit_app():
root.quit()
def show_about():
messagebox.showinfo("quot;, "这是一个简单的菜单示例")
# 创建主窗口
root = tk.Tk()"Tkinter 菜单示例")
root.geometry("400x300")
# 创建菜单栏
menubar = tk.Menu(root)
# 创建"文件"菜单
file_menu = tk.Menu(menubar, tearoff=0) # tearoff=0 禁用菜单分离
file_menu.add_command(label="新建", command=new_file)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_command(label="保存", command=save_file)
file_menu.add_separator() # 添加分隔线
file_menu.add_command(label="退出", command=exit_app)
menubar.add_cascade(label="文件", menu=file_menu)
# 创建"编辑"菜单
edit_menu = tk.Menu(menubar, tearoff=0)
edit_menu.add_command(label="撤销", command=lambda: messagebox.showinfo("编辑", "撤销操作"))
edit_menu.add_command(label="重做", command=lambda: messagebox.showinfo("编辑", "重做操作"))
menubar.add_cascade(label="编辑", menu=edit_menu)
# 创建"帮助"菜单
help_menu = tk.Menu(menubar, tearoff=0)
help_menu.add_command(label="quot;, command=show_about)
menubar.add_cascade(label="帮助", menu=help_menu)
# 将菜单栏添加到主窗口
root.config(menu=menubar)
# 运行主循环
root.mainloop()
高级菜单功能
复选框菜单项
def toggle_var():
print("复选框状态:", var.get())
var = tk.BooleanVar()
check_menu = tk.Menu(menubar, tearoff=0)
check_menu.add_checkbutton(label="选项", variable=var, command=toggle_var)
menubar.add_cascade(label="选项", menu=check_menu)
单选按钮菜单项
def select_option():
print("选择的选项:", radio_var.get())
radio_var = tk.IntVar()
radio_menu = tk.Menu(menubar, tearoff=0)
radio_menu.add_radiobutton(label="选项1", variable=radio_var, value=1, command=select_option)
radio_menu.add_radiobutton(label="选项2", variable=radio_var, value=2, command=select_option)
radio_menu.add_radiobutton(label="选项3", variable=radio_var, value=3, command=select_option)
menubar.add_cascade(label="单选", menu=radio_menu)
级联菜单(子菜单)
# 在"文件"菜单中添加级联菜单
cascade_menu = tk.Menu(file_menu, tearoff=0)
cascade_menu.add_command(label="导出为PDF", command=lambda: messagebox.showinfo("导出", "导出为PDF"))
cascade_menu.add_command(label="导出为HTML", command=lambda: messagebox.showinfo("导出", "导出为HTML"))
file_menu.add_cascade(label="导出", menu=cascade_menu)
右键菜单(上下文菜单)
def show_context_menu(event):
context_menu.post(event.x_root, event.y_root)
context_menu = tk.Menu(root, tearoff=0)
context_menu.add_command(label="复制", command=lambda: messagebox.showinfo("操作", "复制"))
context_menu.add_command(label="粘贴", command=lambda: messagebox.showinfo("操作", "粘贴"))
context_menu.add_separator()
context_menu.add_command(label="删除", command=lambda: messagebox.showinfo("操作", "删除"))
# 绑定右键点击事件到主窗口
root.bind("<Button-3>", show_context_menu)
完整高级示例
import tkinter as tk
from tkinter import messagebox
class MenuApp:
def __init__(self, root):
self.root = root
self.root.title("高级菜单示例")
self.root.geometry("500x400")
# 创建菜单栏
self.create_menu_bar()
# 创建文本区域用于演示右键菜单
self.text_area = tk.Text(root, wrap=tk.WORD)
self.text_area.pack(expand=True, fill="both", padx=10, pady=10)
self.text_area.bind("<Button-3>", self.show_context_menu)
def create_menu_bar(self):
menubar = tk.Menu(self.root)
# 文件菜单
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="新建", command=self.new_file, accelerator="Ctrl+N")
file_menu.add_command(label="打开", command=self.open_file, accelerator="Ctrl+O")
file_menu.add_command(label="保存", command=self.save_file, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="退出", command=self.root.quit, accelerator="Alt+F4")
menubar.add_cascade(label="文件", menu=file_menu)
# 编辑菜单
edit_menu = tk.Menu(menubar, tearoff=0)
edit_menu.add_command(label="撤销", command=self.undo, accelerator="Ctrl+Z")
edit_menu.add_command(label="重做", command=self.redo, accelerator="Ctrl+Y")
edit_menu.add_separator()
edit_menu.add_command(label="剪切", command=self.cut, accelerator="Ctrl+X")
edit_menu.add_command(label="复制", command=self.copy, accelerator="Ctrl+C")
edit_menu.add_command(label="粘贴", command=self.paste, accelerator="Ctrl+V")
menubar.add_cascade(label="编辑", menu=edit_menu)
# 视图菜单
view_menu = tk.Menu(menubar, tearoff=0)
self.show_toolbar = tk.BooleanVar(value=True)
view_menu.add_checkbutton(label="显示工具栏", variable=self.show_toolbar)
self.show_statusbar = tk.BooleanVar(value=True)
view_menu.add_checkbutton(label="显示状态栏", variable=self.show_statusbar)
menubar.add_cascade(label="视图", menu=view_menu)
# 帮助菜单
help_menu = tk.Menu(menubar, tearoff=0)
help_menu.add_command(label="帮助主题", command=self.help_topic)
help_menu.add_separator()
help_menu.add_command(label="quot;, command=self.show_about)
menubar.add_cascade(label="帮助", menu=help_menu)
# 设置菜单栏
self.root.config(menu=menubar)
def new_file(self):
self.text_area.delete(1.0, tk.END)
messagebox.showinfo("新建", "已创建新文件")
def open_file(self):
messagebox.showinfo("打开", "打开文件功能待实现")
def save_file(self):
messagebox.showinfo("保存", "保存文件功能待实现")
def undo(self):
self.text_area.edit_undo()
def redo(self):
self.text_area.edit_redo()
def cut(self):
self.text_area.event_generate("<<Cut>>")
def copy(self):
self.text_area.event_generate("<<Copy>>")
def paste(self):
self.text_area.event_generate("<<Paste>>")
def help_topic(self):
messagebox.showinfo("帮助", "帮助主题功能待实现")
def show_about(self):
messagebox.showinfo("quot;, "高级菜单示例\n版本 1.0\n© 2025")
def show_context_menu(self, event):
context_menu = tk.Menu(self.root, tearoff=0)
context_menu.add_command(label="剪切", command=self.cut)
context_menu.add_command(label="复制", command=self.copy)
context_menu.add_command(label="粘贴", command=self.paste)
context_menu.add_separator()
context_menu.add_command(label="全选", command=lambda: self.text_area.tag_add("sel", "1.0", "end"))
try:
context_menu.tk_popup(event.x_root, event.y_root)
finally:
context_menu.grab_release()
if __name__ == "__main__":
root = tk.Tk()
app = MenuApp(root)
root.mainloop()
常用菜单方法总结
| 方法 | 描述 |
|---|---|
add_command() |
添加普通菜单项 |
add_separator() |
添加分隔线 |
add_cascade() |
添加级联菜单 |
add_checkbutton() |
添加复选框菜单项 |
add_radiobutton() |
添加单选按钮菜单项 |
add_label() |
添加标签(只显示文本,不可点击) |
entryconfig() |
配置菜单项属性 |
delete() |
删除菜单项 |
index() |
获取菜单项索引 |
invoke() |
调用菜单项的命令 |
post() |
在指定位置显示弹出菜单 |
unpost() |
隐藏弹出菜单 |
通过以上方法,你可以创建功能丰富的菜单系统来增强你的 Tkinter 应用程序的用户界面。

