Menu
菜单
Menu
:菜单条,用来实现下拉和弹出式菜单,点下菜单后弹出的一个选项列表,用户可以从中选择.在比如像软件或网页交互界面等,需要提供菜单选项功能提供用户选择菜单选项功能时用到。
MenuBar = tk.Menu(window) 创建一个菜单栏
fileBar = tk.Menu(MenuBar, tearoff=0) 创建一个菜单项,不分窗。
MenuBar.add_cascade(label="File", menu=fileBar) 在菜单栏添加File菜单
fileBar.add_command(label="open") 在菜单项中加入子菜单
fileBar.add_separator() 在菜单项中加入一条分割线
window.config(menu =MenuBar) 放置菜单栏到主窗口
fileBar.delete(0) 删除第一个位置菜单项
MenuBar.add_checkbutton 添加确认按钮
Menu
参数
master
容器父级,必填。activeborderwidth
指定在鼠标下方选择的边框的宽度。默认值为1像素。activebackground
当它在鼠标下方时背景颜色activeforeground
当它在鼠标下方时前景色。background
、bg
用于不在鼠标下的选择的背景颜色。foreground
、fd
用于不在鼠标下的选择的前景色。borderwidth
、bd
围绕所有选择的边框的宽度。默认值为1。cursor
当鼠标在选项上方时出现的光标,但仅当菜单已被关闭时显示。disabledforeground
状态为DISABLED的项目的文本颜色。font
设置文本的字体postcommand
您可以将此选项设置为过程,并且每当有人启动此菜单时,将调用该过程。relief
"指定边框样式,默认值是flat3
还可以设置sunken
,raised
,groove
,ridge
image
在这个menubutton上显示一个图像。selectcolor
指定在检查按钮和单选按钮中显示的颜色。tearoff
通常情况下,菜单可以被拆除,如果设置tearoff = 0/False
,菜单将不会有撕纸功能,并且从0位置开始添加选择。tearoffcommand
当用户“撕下”菜单时通知程序,可以将该选项与一个方法相关联,用户“撕下”菜单时,Tkinter 会带着两个参数去调用方法(一个参数是当前窗口的 ID,另一个参数是承载被“撕下”的菜单的窗口 ID)title
通常,撕下菜单窗口的标题将与导致此菜单的menubutton或级联文本相同。如果要更改该窗口的标题,请将标题选项设置为该字符串。
Menu
方法
-
add_command(type, **options)
在菜单中添加一个菜单项。type 参数指定添加的菜单类型,可以是:“command”,“cascade”,“checkbutton”,“radiobutton” 或 “separator”
选项 | 含义 |
---|---|
accelerator | 1. 显示该菜单项的加速键(快捷键) 2. 例如 accelerator = “Ctrl+N” 3. 该选项仅显示,并没有实现加速键的功能(通过按键绑定实现) |
activebackground | 设置当该菜单项处于 “active” 状态(通过 state 选项设置状态)的背景色 |
activeforeground | 设置当该菜单项处于 “active” 状态(通过 state 选项设置状态)的前景色 |
background | 设置该菜单项的背景颜色 |
bitmap | 指定显示到该菜单项上的位图 |
columnbreak | 从该菜单项开始另起一列显示 |
command | 将该选项与一个方法相关联,当用户点击该菜单项时将自动调用此方法 |
compound | 1. 控制菜单项中文本和图像的混合模式 2. 如果该选项设置为 “center”,文本显示在图像上(文本重叠图像) 3. 如果该选项设置为 “bottom”,“left”,“right” 或 “top”,那么图像显示在文本的旁边(如 “bottom”,则图像在文本的下方 |
font | 指定文本的字体 |
foreground | 设置前景色 |
hidemargin | 是否显示菜单项旁边的空白 |
image | 1. 指定菜单项显示的图片 2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象 |
label | 指定菜单项显示的文本 |
menu | 1. 该选项仅在 cascade 类型的菜单中使用 2. 用于指定它的下级菜单 |
offvalue | 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0 2. 设置 offvalue 的值可以自定义未选中状态的值 |
onvalue | 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0 2. 设置 onvalue 的值可以自定义选中状态的值 |
selectcolor | 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色 |
selectimage | 如果你在单选按钮或多选按钮菜单中使用图片代替文本,那么设置该选项指定被菜单项被选中时显示的图片 |
state | 跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键) |
underline | 1. 用于指定在该菜单项的某一个字符处画下划线 2. 例如设置为 1,则说明在该菜单项的第 2 个字符处画下划线 |
value | 1. 当菜单项为单选按钮时,用于标志该按钮的值 2. 在同一组中的所有按钮应该拥有各不相同的值 3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮 4. 如在使用上有不懂具体可以参照 Radiobutton 组件的说明 |
variable | 1. 当菜单项是单选按钮或多选按钮时,与之关联的变量 2. 如在使用上有不懂具体可以参照:Checkbutton 和 Radiobutton 组件的说明 |
-
add(类型,选项)
在菜单中添加一个特定类型的菜单项。 -
add_cascade(选项)
通过将给定的菜单与父菜单相关联来创建新的分层菜单,添加一个父菜单 相当于add("cascade", **options)
label
:菜单名自定义menu
:菜单变量,通过tk.Menu(master, tearoff=False)
指定了父级菜单可创建多级菜单
-
add_radiobutton(选项)
创建单选按钮菜单项。 -
add_checkbutton(选项)
添加一个多选按钮的菜单项。相当于add("checkbutton", **options)
variable
:值变量onvalue
:选中时变量值,默认为1,可通过get()
获取值offvalue
:取消选中时变量值,默认为0,可通过get()
获取值command
:选中时调用的方法.有参数时间需要通过lambda
间接调用
-
add_command(**options)
添加一个普通的命令菜单项.相当于add("command", **options)
-
add_separator()
在菜单中添加分隔线。相当于add("separator", **options)
-
delete(startindex [,endindex])
删除从startindex到endindex的菜单项。如果忽略 index2 参数,则删除 index1 指向的菜单项.对于一个被“撕下”的菜单,无法使用该方法 -
entrycget(index, option)
获得指定菜单项的某选项的值 -
entryconfig(index,options)
允许您修改由索引标识的菜单项,并更改其选项。同功能方法entryconfigure(index, **options)
-
index(menu_leable)
返回给定菜单项标签的索引号。用法:wegit.index(menu_leable)
-
insert(index, itemType, **options)
插入指定类型的菜单项到 index 参数指定的位置,itemType 参数指定添加的菜单类型command
cascade
checkbutton
radiobutton
separator
-
insert_cascade(index, **options)
在 index 参数指定的位置添加一个父菜单,相当于insert("cascade", **options)
-
insert_checkbutton(index, **options)
在 index 参数指定的位置添加一个多选按钮,相当于insert("checkbutton", **options)
-
insert_radiobutton(index, **options)
在 index 参数指定的位置添加一个单选按钮,相当于insert("radiobutton", **options)
-
insert_command(index, **options)
在 index 参数指定的位置添加一个普通的命令菜单项,相当于insert("command", **options)
-
insert_separator(index)
在index指定的位置插入一个新的分隔符。 -
invoke(index)
调用与位置索引选择相关联的命令回调。多选按钮,切换该菜单项的选中状态; 单选按钮,设置该菜单项为选中状态 -
post(x, y)
接收两个参数,即 x 和 y 坐标,它会在相应的位置弹出菜单。,可利用此方法实现右键弹出式菜单- 1.弹出菜单又叫“上下文菜单”,也叫“右键菜单”,它通常是鼠标单击右键产生的菜单,因此会有“右键菜单” 的说法。
- 2.建立思路:先新建一个菜单,然后向菜单项中添加各种功能,监听鼠标右键消息,如果是鼠标右键被单 击,此时可以根据需要判断下鼠标位置来确定是哪个弹出菜单被弹出,然后使用 Menu 类的 pop 方法来弹出菜单。
from tkinter import Tk, Label, Menu
class Dedmo_pop:
def __init__(self, master):
self.master = master
self.main()
def main(self):
menubar = Menu(root, )
# 添加子菜单
menubar.add_command(label='A')
menubar.add_command(label='B', command=self.test)
menubar.add_separator() # add_separator插入分割线
# 右键绑定方法pop
root.bind("<Button-3>", lambda event: Dedmo_pop.pop(event, menubar))
@staticmethod
def pop(event, menubar):
"""在点击位置弹出菜单"""
menubar.post(event.x_root, event.y_root)
def test(self):
"""定义菜单鼠标单击事件回调函数"""
Label(self.master, text="I'm a monster").pack()
if __name__ == '__main__':
root = Tk()
Dedmo_pop(root)
root.mainloop()
type(index)
返回由index指定的选项的类型:“cascade”,“checkbutton”,“command”,“radiobutton”,“separator”或“tearoff”。unpost()
移除弹出菜单yposition(index)
返回 index 参数指定的菜单项的垂直偏移位置,该方法的目的是为了让你精确放置相对于当前鼠标的位置弹出菜单
Menu所实例化别的主要是菜单,其通式为:
菜单实例名=Menu(根窗体)
菜单分组1=Menu(菜单实例名)
菜单实例名.add_cascade(<label=菜单分组1 显示文本>,<menu=菜单分组1>)
菜单分组1.add_command(<label=命令1文本>,<command=命令1函数名>)
常见的方法有:add_cascade()、add_command()和add_separator(),分别用于添加一个菜单分组、添加一条菜单命令和添加一条分割线。
利用Menu控件也可以创建快捷菜单(又称为上下文菜单)。通常需要右击弹出的控件实例绑定鼠标右击响应事件,并指向一个捕获event参数的自定义函数,在该自定义函数中,将鼠标的触发位置event.x_root 和 event.y_root以post()方法传给菜单。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tkinter as tk # 使用Tkinter前需要先导入
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('My Window')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300') # 这里的乘是小x
# 第4步,在图形界面上创建一个标签用以显示内容并放置
l = tk.Label(window, text=' ', bg='green')
l.pack()
# 第10步,定义一个函数功能,用来代表菜单选项的功能,这里为了操作简单,定义的功能比较简单
counter = 0
def do_job():
global counter
l.config(text='do '+ str(counter))
counter += 1
# 第5步,创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
menubar = tk.Menu(window)
# 第6步,创建一个File菜单项(默认不下拉,下拉内容包括New,Open,Save,Exit功能项)
filemenu = tk.Menu(menubar, tearoff=0)
# 将上面定义的空菜单命名为File,放在菜单栏中,就是装入那个容器中
menubar.add_cascade(label='File', menu=filemenu)
# 在File中加入New、Open、Save等小菜单,即我们平时看到的下拉菜单,每一个小菜单对应命令操作。
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator() # 添加一条分隔线
filemenu.add_command(label='Exit', command=window.quit) # 用tkinter里面自带的quit()函数
# 第7步,创建一个Edit菜单项(默认不下拉,下拉内容包括Cut,Copy,Paste功能项)
editmenu = tk.Menu(menubar, tearoff=0)
# 将上面定义的空菜单命名为 Edit,放在菜单栏中,就是装入那个容器中
menubar.add_cascade(label='Edit', menu=editmenu)
# 同样的在 Edit 中加入Cut、Copy、Paste等小命令功能单元,如果点击这些单元, 就会触发do_job的功能
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)
# 第8步,创建第二级菜单,即菜单项里面的菜单
submenu = tk.Menu(filemenu) # 和上面定义菜单一样,不过此处实在File上创建一个空的菜单
filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 给放入的菜单submenu命名为Import
# 第9步,创建第三级菜单命令,即菜单项里面的菜单项里面的菜单命令(有点拗口,笑~~~)
submenu.add_command(label='Submenu_1', command=do_job) # 这里和上面创建原理也一样,在Import菜单项中加入一个小菜单命令Submenu_1
# 第11步,创建菜单栏完成后,配置让菜单栏menubar显示出来
window.config(menu=menubar)
# 第12步,主窗口循环显示
window.mainloop()
Menubutton
按钮菜单
Menubutton 组件是一个和 Menu 组件相关联的按钮,事实上就是 Menu+Button。
它可以在窗口的任何位置放一个 Button,点开后是一个 Menu。
由于一开始并没有顶级菜单,所以用 Menubutton 实现一个个按钮在最上面,点开一个出来一个 Menu。不过现在 Tkinter 出现了顶级菜单,Menubutton 就没什么用处了。
tkinter.Menubutton def __init__(self,
master: Misc | None = ...,
cnf: Dict[str, Any] | None = ...,
*,
activebackground: str = ...,
activeforeground: str = ...,
anchor: Literal["nw", "n", "ne", "w", "center", "e", "sw", "s", "se"] = ...,
background: str = ...,
bd: str | float = ...,
bg: str = ...,
bitmap: str = ...,
border: str | float = ...,
borderwidth: str | float = ...,
compound: Literal["top", "left", "center", "right", "bottom", "none"] = ...,
cursor: str | Tuple[str] | Tuple[str, str] | Tuple[str, str, str] | Tuple[str, str, str, str] = ...,
direction: Literal["above", "below", "left", "right", "flush"] = ...,
disabledforeground: str = ...,
fg: str = ...,
font: Any = ...,
foreground: str = ...,
height: str | float = ...,
highlightbackground: str = ...,
highlightcolor: str = ...,
highlightthickness: str | float = ...,
image: _Image | str = ...,
indicatoron: bool = ...,
justify: Literal["left", "center", "right"] = ...,
menu: Menu = ...,
name: str = ...,
padx: str | float = ...,
pady: str | float = ...,
relief: Literal["raised", "sunken", "flat", "ridge", "solid", "groove"] = ...,
state: Literal["normal", "active", "disabled"] = ...,
takefocus: int | Literal[""] | (str) -> bool | None = ...,
text: float | str = ...,
textvariable: Variable = ...,
underline: int = ...,
width: str | float = ...,
wraplength: str | float = ...) -> None
# coding = utf-8
# File date: Hi_2022/1/3 19:55
# File_name: 24_Menubutton按钮菜单.py
from tkinter import Menu, Menubutton, Tk, RAISED
class Demo:
def __init__(self, master):
self.master = master
self.demo()
def demo(self):
mb = Menubutton(self.master, text='点我', relief=RAISED) # relief设计按钮的样式
mb.pack(anchor="nw")
filemenu = Menu(mb, tearoff=False)
filemenu.add_command(label='打开', command=Demo.callback)
filemenu.add_command(label='保存', command=Demo.callback)
filemenu.add_separator() # 添加分割线
filemenu.add_command(label='退出', command=self.master.quit)
mb.config(menu=filemenu)
@staticmethod
def callback():
print("你好")
if __name__ == '__main__':
root = Tk()
# 窗口居中并设最大尺寸占满屏幕
screen_w = root.winfo_screenwidth()
screen_h = root.winfo_screenheight()
rw = int(screen_w / 5)
rh = int(screen_h / 5)
root.geometry('{}x{}+{:g}+{:g}'.format(rw, rh, rw / 2, rh / 2))
root.maxsize(width=screen_w, height=screen_h)
root.title("Menubutton")
Demo(root)
root.mainloop()
OptionMenu
选项菜单
OptionMenu(选择菜单)组件。其实,Optionmenu 就是下拉菜单的一个改版,但是他的发明弥补了 Listbox(列表框)无法实现下拉列表框的遗憾,因为创建一个选择菜单的效果和创建下拉列表框的效果是一样的。
使用父 MASTER 构造一个选项菜单小部件,使用 资源 textvariable 设置为 VARIABLE,最初选择的 VALUE 值,其他菜单值 VALUES 和一个附加值 关键字参数命令。
tkinter.OptionMenu def __init__(self,
master: Misc | None,
variable: StringVar,
value: str,
*values: str,
command: (StringVar) -> Any | None = ...) -> None
master
父组件variable
选项变量可为StringVar
value
默认值,必填*values
其他值, 如果需要可选的有value
的值,则需要将之也加入*value
command
可选关联方法