Skip to content

Menu 组件

几乎每个应用程序都可以看到菜单,而常见的菜单有“文件”、“编辑”、“帮助”,打开“文件”之后,它会下拉出若干菜单项,例如“新建”、“打开”、“保存”、“退出”等

image-20201201162135399

tkinter 提供了一个 Menu 组件,用于实现顶级菜单、下拉菜单和弹出菜单。由于该组件是底层代码实现和优化,所以不建议你自行通过按钮和其他组件来实现菜单功能。

创建一个顶级菜单,需要先创建一个菜单实例,然后使用add()方法将命令和其他子菜单添加进去:

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")


def callback():
    print("新建文件")


# 创建一个顶级菜单
menubar = tk.Menu(root)
menubar.add_command(label="新建", command=callback)
menubar.add_command(label="退出", command=root.quit)

# 显示菜单
root.config(menu=menubar)
root.mainloop()

image-20201201162003294

二级菜单组件

创建一个下拉菜单(或者其他子菜单),方法也是大同小异,最主要的区别是它们最后需要添加到主菜单上(而不是窗口上):

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")


def callback():
    print("新建文件")


# 创建一个顶级菜单
menubar = tk.Menu(root)

# 创建一个下拉菜单"文件",然后将它添加到顶级菜单中
# tearoff=False 关闭分割线
filemenu = tk.Menu(menubar)
# 添加命令
filemenu.add_command(label="打开", command=callback)
filemenu.add_command(label="保存", command=callback)
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="文件", menu=filemenu)

# 创建另一个下拉菜单"编辑",然后将它添加到顶级菜单中
editmenu = tk.Menu(menubar)
editmenu.add_command(label="剪切", command=callback)
editmenu.add_command(label="拷贝", command=callback)
editmenu.add_command(label="粘贴", command=callback)
menubar.add_cascade(label="编辑", menu=editmenu)

# 显示菜单
root.config(menu=menubar)
root.mainloop()

image-20201201162516469

菜单分割线

大家发现在创建一个Menu组件的时候都把一个叫tearoff的选项设置为False。那么这个翻译为“撕开”的选项有什么用呢?Tkinter要我们撕开什么呢?好了,大家不要想歪了,试试便知——把tearoff改为True之后,“文件”菜单增加了一行小横杠

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")


def callback():
    print("~被调用了~")


# 创建一个顶级菜单
menubar = tk.Menu(root)

# 创建一个下拉菜单"文件",然后将它添加到顶级菜单中
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.add_command(label="打开", command=callback)
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="文件", menu=filemenu)

# 创建radiobutton关联变量
editVar = tk.IntVar()
editVar.set(1)
# 创建另一个下拉菜单"编辑",然后将它添加到顶级菜单中
editmenu = tk.Menu(menubar, tearoff=False)
editmenu.add_command(label="剪切", command=callback)
editmenu.add_command(label="拷贝", command=callback)
editmenu.add_command(label="粘贴", command=callback)
menubar.add_cascade(label="编辑", menu=editmenu)

# 显示菜单
root.config(menu=menubar)
root.mainloop()

单击一下,噢,原来Tkinter让我们打开的是菜单,

image-20201201162552266

最后,这个菜单不仅可以添加常见的命令菜单项,还可以添加单选按钮或多选按钮,那么用法就跟Checkbutton组件和Radiobutton组件类似啦。

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")


def callback():
    print("~被调用了~")


# 创建一个顶级菜单
menubar = tk.Menu(root)

# 创建checkbutton关联变量
openVar = tk.IntVar()
saveVar = tk.IntVar()
exitVar = tk.IntVar()

# 创建一个下拉菜单"文件",然后将它添加到顶级菜单中
filemenu = tk.Menu(menubar, tearoff=False)
filemenu.add_checkbutton(label="打开", command=callback, variable=openVar)
filemenu.add_checkbutton(label="保存", command=callback, variable=saveVar)
filemenu.add_separator()
filemenu.add_checkbutton(label="退出", command=root.quit, variable=exitVar)
menubar.add_cascade(label="文件", menu=filemenu)

# 创建radiobutton关联变量
editVar = tk.IntVar()
editVar.set(1)

# 创建另一个下拉菜单"编辑",然后将它添加到顶级菜单中
editmenu = tk.Menu(menubar, tearoff=False)
editmenu.add_radiobutton(label="剪切", command=callback, variable=editVar, value=1)
editmenu.add_radiobutton(label="拷贝", command=callback, variable=editVar, value=2)
editmenu.add_radiobutton(label="粘贴", command=callback, variable=editVar, value=3)
menubar.add_cascade(label="编辑", menu=editmenu)

# 显示菜单
root.config(menu=menubar)
root.mainloop()

image-20201201162826322

综合案例-记事本

有兴趣的同学可以先把 综合案例-记事本 的布局做一下。