带你走进 @ 机器人时代
Discover 点击上面蓝色文字,关注我们
Tkinter Menu 可以说是 GUI 中“精髓所在”,它以可视化的方式将一系列的“功能选项卡”进行分组。
Tkinter Menu 控件提供了三种类型的菜单,分别是:topleve(主目录菜单)、pull-down(下拉式菜单)、pop-up(弹出式菜单,或称快捷式菜单)。
先来看代码:
from tkinter import *
import tkinter.messagebox
import tkinter as tk
w = tk.Tk()
w.title("工作机器人时代-微信公众平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
def md():
tkinter.messagebox.showinfo("主菜单栏", "你正在使用主菜单栏")
# 创建一个顶级菜单
m = Menu(w)
# 使用 add_command()命令创建菜单
m.add_command(label="新建", command=md)
m.add_command(label="编辑", command=md)
m.add_command(label="高级", command=md)
m.add_command(label="配置", command=md)
m.add_command(label="帮助", command=md)
# 显示菜单
w.config(menu=m)
w.mainloop()
运行后得到:
如果我们要创建下拉菜单,可以输入以下代码:
from tkinter import *
import tkinter as tk
w = tk.Tk()
w.title("工作机器人时代-微信公众平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
# 创建一个顶级菜单
m = Menu(w)
#新增子菜单
u = Menu (m, tearoff=False)
# 使用 add_command()命令创建菜单
m.add_cascade (label="文件",menu=u)
m.add_cascade (label="编辑")
m.add_cascade (label="高级")
m.add_cascade (label="配置")
m.add_cascade (label="帮助")
#新增"文件"菜单的菜单项
u.add_command (label="新建文件",accelerator="W")
u.add_command (label="新建文件夹", accelerator="O")
u.add_command (label="保存文件",accelerator="S")
# 添加一条分割线
u.add_separator ()
u.add_command (label="退出系统",accelerator="Q",command=w. quit)
# 显示菜单
w.config(menu=m)
w.mainloop()
运行后得到:
点击文件,弹出下拉菜单,点击退出系统,程序关闭。下面我们增加代码,让鼠标点击新建文件或按快捷键Ctrl+w键的时候弹出对话框:
from tkinter import *
import tkinter.messagebox
import tkinter as tk
w = tk.Tk()
w.title("工作机器人时代-微信公众平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
def md():
tkinter.messagebox.showinfo("新消息", "你正点击新建文件")
def md1(x):
#print(x)
tkinter.messagebox.showinfo("新消息", "你正按快捷键新建文件命令")
# 创建一个顶级菜单
m = Menu(w)
#新增子菜单
u = Menu (m, tearoff=False)
# 使用 add_command()命令创建菜单
m.add_cascade (label="文件",menu=u)
m.add_cascade (label="编辑")
m.add_cascade (label="高级")
m.add_cascade (label="配置")
m.add_cascade (label="帮助")
#新增"文件"菜单的菜单项
u.add_command (label="新建文件",command=md,accelerator="W")
u.add_command (label="新建文件夹", accelerator="O")
u.add_command (label="保存文件",accelerator="S")
# 添加一条分割线
u.add_separator ()
u.add_command (label="退出系统",accelerator="Q",command=w. quit)
#捕获键盘事件
w.bind ('<Control-w>',md1)
w.bind ('<Control-W>',md1)
# 显示菜单
w.config(menu=m)
w.mainloop()
这里要注意,当键盘按键的时候会返回函数一个参数,因此定义函数的时候要写成def md1(x):而不能写成def md1(),运行后效果如下:
如果我们想在窗体界面右键点击后弹出一个菜单,在w.config(menu=m)前面插入以下代码:
def fc():
tkinter.messagebox.showinfo("新消息", "您通过弹出菜单执行了命令")
mu = tk.Menu(w, tearoff=False)#定义弹出的菜单
mu.add_command(label="复制", command=fc)
mu.add_command(label="粘贴", command=fc)
mu.add_command(label="剪切", command=fc)
def cod(event):
# 使用 post()在指定的位置显示弹出菜单
mu.post(event.x_root, event.y_root)
w.bind("<Button-3>", cod)#鼠标点击右键
用fc函数定义弹出菜单中的按钮事件,用cod函数来定义右键点击后显示弹出菜单:
如果希望在窗体的任意位置布局一个按钮,当鼠标点击时弹出操作菜单,参考以下代码:
from tkinter import *
import tkinter as tk
w = tk.Tk()
w.title("工作机器人时代-微信公众平台")
w.geometry('500x190+710+410')
w.iconbitmap('1.ico')
w.resizable(False, False)
#创建一个菜单按钮
mb=Menubutton(w, text='点击进行操作', relief='solid')
# 设置位置(布局)
mb.grid(padx=35, pady=35)
#添加菜单,使用 tearoff 参数不显示分割线
fm=Menu(mb,tearoff = False)
fm.add_command(label='新建')
fm.add_command(label='删除')
fm.add_command(label='复制')
fm.add_command(label='保存')
# 显示菜单,将菜单命令绑定在菜单按钮对象上
mb.config(menu=fm)
w.mainloop()
运行后得到如下效果:
我们来看看Menu菜单控件都有哪些属性:
activebackground | 设置活动背景色 |
activeborderwidth | 设置活动边框宽度 |
activeforeground | 设置活动前景色 |
bg | 设置背景色 |
bd | 设置边框宽度 |
cursor | 光标的显示样式 |
disabledforeground | 菜单项的状态为DISABLED时的文字颜色 |
font | 设置字体 |
fg | 设置前景色,也就是文字的颜色 |
postcommand | 点击该菜单时,调用回调函数。 |
relief | 设置3D效果 |
selectcolor | 如果选中显示selectcolor设置的颜色 |
tearoff | 将每个菜单分离出去,单独形成一个子窗口 |
title | 设置tear-off子窗口的标题 |
除了这些属性,还有方法:
add_cascade(**options) | 添加一个父菜单,将一个指定的子菜单,通过参数与父菜单连接,从而创建一个下拉菜单 |
add_checkbutton(**options) | 添加一个多选按钮的菜单项 |
add_command(**options) | 添加一个普通的命令菜单项 |
add_radiobutton(**options) | 添加一个单选按钮的菜单项 |
add_separator(**options) | 添加一条分割线 |
add(add(itemType, options)) | 添加菜单项 此处 itemType 参数: "command" "cascade" "checkbutton" "radiobutton" "separator" 可以使用 options 选项来设置菜单其他属性 |
delete(index1, index2=None) | 1. 删除 index1 ~ index2(包含)的所有菜单项 2. 如果忽略 index2 参数,则删除 index1 指向的菜单项 |
entrycget(index, option) | 获得指定菜单项的某选项的值 |
entryconfig(index, **options) | 设置指定菜单项的选项 |
insert(index, itemType, **options) | 插入指定类型的菜单项到 index 参数指定的位置,类型可以是: "command" "cascade" "checkbutton" "radiobutton" 或 "separator" 中的一个,或者也可以使用 insert_类型() 形式来, 比如 insert_cascade(index, **options) |
invoke(index) | 调用 index 指定的菜单项相关联的方法 |
post(x, y) | 在指定的位置显示弹出菜单 |
type(index) | 获得 index 参数指定菜单项的类型 |
unpost() | 移除弹出菜单 |
yposition(index) | 返回 index 参数指定的菜单项的垂直偏移位置 |
index(index) | 返回与 index 参数相应的选项的序号 |
Menu 控件的 options 参数:
accelerator | 1. 设置菜单项的快捷键,会显示在菜单项目的右边 2. 注意,必须通过按键绑定来实现 |
command | 选择菜单项时执行的 callback 函数 |
label | 定义菜单项内的文字 |
menu | 此属性与 add_cascade() 方法一起使用,用来新增菜单项的子菜单项 |
selectcolor | 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色 |
state | 定义菜单项的状态 可以是 normal、active 或 disabled |
onvalue/offvalue | 默认情况下,variable 选项设置为 1 表示选中状态 |
tearoff | 设为 True,在菜单项的上面就会显示一个可选择的分隔线 |
underline | 设置菜单项中字符的下画线 |
value | 设置按钮菜单项的值,通过该值与 variable 选项的值对比,即可判断用户选中了哪个按钮 |
variable | 当菜单项是单选按钮或多选按钮时与之关联的变量 |
坚持学习,每天都能进步一点!