28-Tkinter 组件-菜单

文章介绍了Tkinter库中Menu组件的使用,包括创建菜单栏、菜单项,添加命令、分隔线,以及如何实现右键菜单。Menu参数和方法详细解析,如activebackground、command、add_cascade等,还展示了如何处理菜单项的事件回调。
摘要由CSDN通过智能技术生成

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 当它在鼠标下方时前景色。
  • backgroundbg 用于不在鼠标下的选择的背景颜色。
  • foregroundfd 用于不在鼠标下的选择的前景色。
  • borderwidthbd 围绕所有选择的边框的宽度。默认值为1。
  • cursor 当鼠标在选项上方时出现的光标,但仅当菜单已被关闭时显示。
  • disabledforeground 状态为DISABLED的项目的文本颜色。
  • font 设置文本的字体
  • postcommand 您可以将此选项设置为过程,并且每当有人启动此菜单时,将调用该过程。
  • relief "指定边框样式,默认值是 flat3还可以设置 sunkenraisedgroove ,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”

选项含义
accelerator1. 显示该菜单项的加速键(快捷键)
2. 例如 accelerator = “Ctrl+N”
3. 该选项仅显示,并没有实现加速键的功能(通过按键绑定实现)
activebackground设置当该菜单项处于 “active” 状态(通过 state 选项设置状态)的背景色
activeforeground设置当该菜单项处于 “active” 状态(通过 state 选项设置状态)的前景色
background设置该菜单项的背景颜色
bitmap指定显示到该菜单项上的位图
columnbreak从该菜单项开始另起一列显示
command将该选项与一个方法相关联,当用户点击该菜单项时将自动调用此方法
compound1. 控制菜单项中文本和图像的混合模式
2. 如果该选项设置为 “center”,文本显示在图像上(文本重叠图像)
3. 如果该选项设置为 “bottom”,“left”,“right” 或 “top”,那么图像显示在文本的旁边(如 “bottom”,则图像在文本的下方
font指定文本的字体
foreground设置前景色
hidemargin是否显示菜单项旁边的空白
image1. 指定菜单项显示的图片
2. 该值应该是 PhotoImage,BitmapImage,或者能兼容的对象
label指定菜单项显示的文本
menu1. 该选项仅在 cascade 类型的菜单中使用
2. 用于指定它的下级菜单
offvalue1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0
2. 设置 offvalue 的值可以自定义未选中状态的值
onvalue1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0
2. 设置 onvalue 的值可以自定义选中状态的值
selectcolor指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
selectimage如果你在单选按钮或多选按钮菜单中使用图片代替文本,那么设置该选项指定被菜单项被选中时显示的图片
state跟 text 选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键)
underline1. 用于指定在该菜单项的某一个字符处画下划线
2. 例如设置为 1,则说明在该菜单项的第 2 个字符处画下划线
value1. 当菜单项为单选按钮时,用于标志该按钮的值
2. 在同一组中的所有按钮应该拥有各不相同的值
3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮
4. 如在使用上有不懂具体可以参照 Radiobutton 组件的说明
variable1. 当菜单项是单选按钮或多选按钮时,与之关联的变量
2. 如在使用上有不懂具体可以参照:CheckbuttonRadiobutton 组件的说明
  • 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可选关联方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值