Menu 组件
几乎每个应用程序都可以看到菜单,而常见的菜单有“文件”、“编辑”、“帮助”,打开“文件”之后,它会下拉出若干菜单项,例如“新建”、“打开”、“保存”、“退出”等
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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
二级菜单组件
创建一个下拉菜单(或者其他子菜单),方法也是大同小异,最主要的区别是它们最后需要添加到主菜单上(而不是窗口上):
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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
菜单分割线
大家发现在创建一个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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
单击一下,噢,原来Tkinter让我们打开的是菜单,
最后,这个菜单不仅可以添加常见的命令菜单项,还可以添加单选按钮或多选按钮,那么用法就跟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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
综合案例-记事本
有兴趣的同学可以先把 综合案例-记事本 的布局做一下。