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 方法来绑定事件,而且要记得鼠标右键是用
(图片是盗的,侵删)
附上源码:
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("" , 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))