在本文中,将介绍如何创建 tkinter 菜单栏、、菜单按钮、选项菜单,向菜单栏添加菜单以及向每个菜单添加菜单项。
当应用程序包含大量功能时,需要使用菜单来组织它们以便于导航。通常,使用菜单对相关的操作进行分组。
要创建菜单,使用如下构造函数。
menu = tk.Menu(master, **options)
菜单
创建一个简单的菜单需要以下几个步骤:
1.创建一个菜单栏 menubar 并将其分配给窗口:
menubar = tk.Menu(root)
root.config(menu=menubar)
每个顶级窗口只能有一个菜单栏。
2.在菜单栏 menubar 创建一个菜单 file_menu:
file_menu = Menu(menubar)
3.向菜单 file_menu 中添加菜单项 Exit:
file_menu.add_command(label='Exit', command=root.destroy)
单击菜单项时,Python 将关闭窗口。
4.将菜单项 Exit 添加到菜单 file_menu,显示标签为 File:
menubar.add_cascade(label="File", menu=file_menu, underline=0)
underline 选项允许创建键盘快捷键。指定快捷键字符的位置。该位置从 0 开始。
在以上示例中,将指定 File 的第一个字符,即您可以使用键盘快捷键 Alt+F。
完整示例
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Menu 菜单演示')
menubar = tk.Menu(root)
root.config(menu=menubar)
file_menu = tk.Menu(menubar)
file_menu.add_command(
label='Exit',
command=root.destroy,
underline=0
)
menubar.add_cascade(
label="File",
menu=file_menu,
underline=0
)
root.mainloop()

默认情况下,在第一个菜单项之前会添加一条虚线。当单击虚线时,主窗口将从菜单中分离。

要删除虚线,可以为菜单添加参数 :tearoff = False
file_menu = Menu(menubar, tearoff=False)

可以继续为菜单项添加子菜单
1.创建一个菜单项:sub_menu:
sub_menu = tk.Menu(file_menu, tearoff=0)
2.为菜单项 sub_menu 添加两个子菜单:
sub_menu.add_command(label='关闭当前文件')
sub_menu.add_command(label='关闭所有文件')
3.将菜单项 sub_menu 添加到菜单 file_menu,显示标签为 关闭文件:
file_menu.add_cascade(label="关闭文件", menu=sub_menu)
完整示例
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Menu 菜单演示')
menubar = tk.Menu(root)
root.config(menu=menubar)
file_menu = tk.Menu(menubar, tearoff=False)
file_menu.add_command(label='新建')
file_menu.add_command(label='打开...')
sub_menu = tk.Menu(file_menu, tearoff=0)
sub_menu.add_command(label='关闭当前文件')
sub_menu.add_command(label='关闭所有文件')
file_menu.add_cascade(label="关闭文件", menu=sub_menu)
file_menu.add_separator()
file_menu.add_command(label='退出', command=root.destroy)
menubar.add_cascade(label="文件", menu=file_menu)
menubar.add_cascade(label="编辑")
root.mainloop()

Tkinter 菜单函数
| 函数 | 说明 |
|---|---|
| add_command() | 将菜单项添加到菜单。 |
| add_radiobutton() | 向菜单添加单选按钮项 |
| add_checkbutton() | 向菜单添加复选框 |
| add_cascade() | 将菜单加入菜单栏。 |
| add_separator() | 在菜单中添加分隔线 |
| add() | 将指定类型的项目添加到菜单中 |
| index() | 返回指定菜单项的索引 |
菜单按钮
Menubutton 菜单按钮是菜单和按钮的组合,单击按钮时,会显示一个包含选项的菜单。
要创建Menubutton 菜单按钮,使用如下构造函数。
menu_button = tk.Menubutton(master, **options)
首先创建菜单按钮:
menubttn = tk.Menubutton(root, text = "程序设计", relief = tk.RAISED)
其次,为菜单按钮创建菜单,添加菜单项(复选、单选、菜单):
menu = tk.Menu(menubttn, tearoff = 0)
menu.add_checkbutton(label = "Python")
menu.add_radiobutton(label = "C++")
menu.add_command(label='打开')
最后,将菜单添加到菜单按钮:
menubttn["menu"] = menu
menubttn.pack(pady=20)
完整示例
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Menubutton 菜单按钮演示')
menubttn = tk.Menubutton(root, text = "程序设计", relief = tk.RAISED)
menu = tk.Menu(menubttn, tearoff = 0)
menu.add_checkbutton(label = "Python")
menu.add_checkbutton(label = "Java")
menu.add_radiobutton(label = "C++")
menu.add_radiobutton(label = "PHP")
menu.add_command(label='打开')
menu.add_command(label='关闭')
menubttn["menu"] = menu
menubttn.pack(pady=20)
root.mainloop()
以上示例中,为菜单按钮的菜单添加了两个复选按钮、两个单选按钮、两个菜单项。两个单选按钮不能同时选中。

选项菜单
选项菜单 OptionMenu 小组件基本上是一个下拉列表或弹出菜单,在下拉菜单中提供一组预定义的选项,并允许用户一次选择一个选项。。
要创建选项菜单,请使用构造函数:
optionmenu = tk.OptionMenu(master, variable, value, *values, **kwargs)
完整示例
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('OptionMenu 选项菜单演示')
option_var = tk.StringVar(root)
languages = ['Python', 'JavaScript', 'Java', 'C#', 'C++']
def option_changed(*args):
output_label['text'] = f'你选择了:{option_var.get()}'
option_var.set('Language')
label = tk.Label(root, text='请选择你喜欢的编程语言:')
label.pack()
option_menu = tk.OptionMenu(root, option_var, *languages, command=option_changed)
option_menu.pack()
output_label = tk.Label(root, text='')
output_label.pack()
root.mainloop()
option_var:表示选项菜单选择的值;
*languages:表示选项菜单存储所有选项的列表的名称;
get():获取并返回 OptionMenu 中当前选定的选项;
set():设置 OptionMenu 中当前的选项;


动态更新 OptionMenu 选项
如果需要在运行时修改 OptionMenu 内容,比如需要删除旧选项并插入新选项。可以使用 add_command() 和 delete() 方法。
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('OptionMenu 选项菜单演示')
option_var = tk.StringVar(root)
languages = ('Python', 'JavaScript', 'Java', 'C#', 'C++')
def option_changed(*args):
output_label['text'] = f'你选择了:{option_var.get()}'
def delete(*args):
option_menu['menu'].delete(0, 'end')
def new(*args):
new_options = ["New option 1", "New option 2"]
for option in new_options:
option_menu['menu'].add_command(label=option, command=tk._setit(option_var, option))
option_var.set('Language')
label = tk.Label(root, text='请选择你喜欢的编程语言:')
label.pack()
option_menu = tk.OptionMenu(root, option_var, *languages, command=option_changed)
option_menu.pack()
output_label = tk.Label(root, text='')
output_label.pack()
button = tk.Button(root, text='删除', command=delete)
button.pack()
button = tk.Button(root, text='添加', command=new)
button.pack()
root.mainloop()


OptionMenu 样式设置
OptionMenu 不能直接设置宽度、高度参数,需要使用 config 方法。
option_menu.config(width=10)
option_menu.config(height=2)
OptionMenu 级联菜单
import tkinter as tk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('OptionMenu 选项菜单演示')
primary = tk.StringVar()
secondary = tk.StringVar()
def menu_changed(*args):
if primary.get() == "山东省":
secondary.set("济南")
secondary_options = ["济南", "青岛", "淄博"]
else:
secondary.set("南京")
secondary_options = ["南京", "苏州"]
secondary_menu["menu"].delete(0, "end")
for option in secondary_options:
secondary_menu["menu"].add_command(label=option, command=tk._setit(secondary, option))
primary_opts = ["山东省", "江苏省"]
primary_menu = tk.OptionMenu(root, primary, *primary_opts, command=menu_changed)
primary.set("省份")
primary_menu.config(width=15)
primary_menu.pack()
secondary_menu = tk.OptionMenu(root, secondary, "")
secondary.set("城市")
secondary_menu.config(width=15)
secondary_menu.pack()
root.mainloop()

OptionMenu 的唯一缺点是它无法处理大数据。由于下拉列表长度受限于屏幕大小,因此,在大量数据的情况下,可以使用 Listbox,因为它提供了滚动功能。
9548

被折叠的 条评论
为什么被折叠?



