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

Microsoft 365安卓 📅 2025-09-25 08:47:33 ✍️ admin 👁️ 9011 ❤️ 473
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 方法来绑定事件,而且要记得鼠标右键是用

(图片是盗的,侵删)

附上源码:

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))

如果不写lambda的话,command调用的函数总是会自动执行。

感觉有领悟就留个赞再走呗

相关推荐

筷子不仅仅是中国专属,这12国现还在用
Microsoft 365安卓

筷子不仅仅是中国专属,这12国现还在用

📅 07-05 👁️ 2471
《阴阳师》沉默技能解析:掌握关键控制战技巧
365beat怎么下载苹果

《阴阳师》沉默技能解析:掌握关键控制战技巧

📅 08-31 👁️ 8645
一两万的AI PC,只是噱头?
365beat怎么下载苹果

一两万的AI PC,只是噱头?

📅 08-02 👁️ 6604