GUI tkinter (Menu)菜单超级详细超形象(配图)

GUI tkinter (Menu)菜单超级详解(配图)

一、添加顶层菜单

1.我们可以使用Menu类来新建一个菜单。Menu和其他的控件一样,第一个是父类,这里通常可以为窗口(父容器可为根窗体或其他容器控件实例)。

from tkinter import *

root = Tk()  # 设置主窗体
root.title('22娘和33娘我都要')  # 设置窗体的名称
root.geometry('666x666')  # 设置窗体的大小

top = Menu(root)  # 父容器(top)为根窗体的实例

root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

root.mainloop()

效果如图所示,只靠着一个实例并不能显示出菜单栏(可以理解为top=Menu(root)只是定义了top是一个父容器,声明一下可以往里面装东西了。但我们还没有往里面添加菜单项所以父容器top为空,窗体也就没有显示菜单项了)
在这里插入图片描述
2.我们可以利用
add_command方法
来为它添加菜单项
该菜单位于顶层,添加的菜单项依次向右添加:


top = Menu(root)  # 父容器(top)为根窗体的实例
top.add_command(label='project1')
top.add_command(label='project2')
top.add_command(label='project3')

root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

效果如图所示,添加的菜单项在顶层依次向右添加
在这里插入图片描述
3.add_command 中的参数常用的有 label 属性,用来指定菜单项的名称,command 属性用来指定被点击的时候调用的方法,acceletor 属性指定的是快捷键(只是单纯显示,需要通过按键绑定来实现快捷键功能),underline 属性为是否拥有下划线:

def test():
    print('this is a test')

    
top = Menu(root)  # 父容器(top)为根窗体的实例

menuFile = Menu(top)  # 建立一个下拉菜单menuFile
top.add_cascade(label="文件", menu=menuFile)
menuFile.add_command(label="打开", command=test(), accelerator='Ctrl+N')
menuFile.add_command(label="保存", command=test(), accelerator='Ctrl+S')
menuFile.add_separator()  # 分割线
menuFile.add_command(label="退出", 
                     command=root.destroy, 
                     accelerator='Ctrl+Alt')

root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

效果如图所示:
在这里插入图片描述

二、添加下拉菜单

1.我们可以利用add_cascade方法来为一个菜单项添加子菜单( 个人理解就是把一个菜单项变为 一个可以添加子菜单项的菜单项)。
如果该菜单是顶层菜单的一个菜单项,我们要在它下面添加子菜单项:

top = Menu(root)  # 父容器(top)为根窗体的实例

# menufile为top的实例,声明要在顶层菜单的一个菜单项下建立子菜单了
# 形象一点 儿子(menufile)对爸爸(父容器top)说:我也要当爸爸了
#(menufile也要当一个父容器了)
menufile = Menu(top)

# 可以理解为把它变为了一个可以添加子菜单项的顶层菜单项
top.add_cascade(label='project1', menu=menufile)  
menufile.add_command(label='test1')
menufile.add_command(label='test2')
menufile.add_command(label='test3')

top.add_command(label='project2')
top.add_command(label='project3')


root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

效果如图所示,这样我们就在顶层菜单项project1下面建立了3个子菜单
在这里插入图片描述
2.add_cascade 的一个很重要的属性就是 menu 属性,它指明了要把那个菜单项变为可以添加子菜单的菜单项【形象一点:就是menu属性指出谁要当爹(要在下面生儿子)了】。记得提前把它(要添加下拉菜单的菜单项)变为上一层菜单的实例【形象一点就是,儿子(menufile)要生娃了,记得告诉他爹(menufile的父容器top)一声】。比如:

menufile = Menu(top)  # menufile为top的实例,是顶层菜单的一个菜单项
top.add_cascade(label='project1', menu=menufile)
menufile.add_command(label='test1')  
menufile.add_command(label='test2')
menufile.add_command(label='test3')

root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

【(test1、test2、test3)就是儿子(menufile)生的3个娃】
top就是上一层菜单的实例,menufile就是需要添加子菜单的菜单项的实例。之后就可以继续按照add_command的方法在添加菜单项。当然,还必不可少还有 label 属性,用于指定该菜单项的名称【也就是指出了要当爹的人的称号】;
还有就是父类*.add_cascade()*【毕竟父亲总要好好告诫儿子一些道理

三、添加下拉菜单右侧子菜单

我们继续利用add_cascade方法来为一个菜单项添加子菜单,也就是说为下拉菜单建立的子菜单就是向右侧展开的菜单,然后以此类推…
上集我们说到儿子(menufile)喜当爹生了3个白白胖胖的娃(称号分别为test1、test2、test3)。没想到啊没想到,今天大儿子(test1)也要生娃了
记得给test1起一个实例化的名字(son1)
之后就是按照流程来了:

儿子向父类报告他要生儿子了[*son1 = Menu(menufile)*]、
父亲给儿子告诫[*menufile.add_cascade()*]、
之后儿子开始生(总觉得哪里怪怪的)[*son1.add_command()*]
top = Menu(root)  # 父容器(top)为根窗体的实例

menufile = Menu(top)  # menufile为top的实例,是顶层菜单的一个菜单项
top.add_cascade(label='project1', menu=menufile)  # 这样就把它变为了一个可以添加子菜单项的顶层菜单项

son1 = Menu(menufile)  # menufile为top的实例,是顶层菜单的一个菜单项
menufile.add_cascade(label='test1', menu=son1)
son1.add_command(label='test1-1')
son1.add_command(label='son1-2')

menufile.add_command(label='test2')
menufile.add_command(label='test3')

top.add_command(label='project2')
top.add_command(label='project3')


root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

效果如图所示,test1-1和test1-2即为test1的子菜单,test1的右侧子菜单就建好了。
在这里插入图片描述

四、添加右击菜单(弹出菜单)

1.弹出菜单又叫“上下文菜单”,它通常是鼠标单击右键产生的菜单,因此会有“右键菜单” 的说法。
2.其实很多界面库里面都是给出了弹出菜单的简单的制作方法的,但是 tkinter 里面我们却只能使用比较原始的事件绑定的方式去做。
3.大体思路就是:我们先新建一个菜单,然后向菜单项中 添加各种功能,最后我们监听鼠标右键消息,如果是鼠标右键被单击,此时可以根据需要判断下鼠标位置来确定是 哪个弹出菜单被弹出,然后使用 Menu 类的 pop 方法来弹出菜单。
说明:
Menu 类里面有一个 post 方法,它接收两个参数,即 x 和 y 坐标,它会在相应的位置弹出菜单。
记得用 bind 方法来绑定事件,而且要记得鼠标右键是用<Button-3>
在这里插入图片描述
(图片是盗的,侵删)

附上源码:

from tkinter import *

root = Tk()  # 设置主窗体
root.title('22娘和33娘我都要')  # 设置窗体的名称
root.geometry('666x666')  # 设置窗体的大小


def pop(event):
    menufile.post(event.x_root, event.y_root)  # 可以替换menufile变为其他菜单栏


root.bind("<Button-3>", pop)  # 鼠标右击绑定pop事件

top = Menu(root)  # 父容器(top)为根窗体的实例

menufile = Menu(top)  # menufile为top的实例,是顶层菜单的一个菜单项
top.add_cascade(label='project1', menu=menufile)  # 这样就把它变为了一个可以添加子菜单项的顶层菜单项
son1 = Menu(menufile)  # menufile为top的实例,是顶层菜单的一个菜单项
menufile.add_cascade(label='test1', menu=son1)
son1.add_command(label='test1-1')
son1.add_command(label='son1-2')
menufile.add_command(label='test2')
menufile.add_command(label='test3')

top.add_command(label='project2')
top.add_command(label='project3')


root.config(menu=top)  # 如果确实此句,则不会显示菜单分组

root.mainloop()

效果如图:
在这里插入图片描述
2019.12.11更新
注意:在menu菜单参数command=<想要调用的函数>中,如果调用的函数需要传参(就是函数名后面有括号),需要在函数名前加上lambda:
eg:

menuEdit1 = Menu(mainmenu)  # 菜单分组 project1
mainmenu.add_cascade(label="project1", menu=menuEdit1)
menuEdit1.add_command(label="直方图", command=lambda: project1.plt_hist(filename))
menuEdit1.add_command(label="二值化", command=lambda: project1.binary(filename))

如果不写lambda的话,command调用的函数总是会自动执行。
感觉有领悟就留个赞再走呗
在这里插入图片描述

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值