Python tkinter Menu菜单组件详解
好久没有更新了,今天我来领大家熟悉一下Menu组件

1.认识、了解Menu
什么是Menu
menu组件是tkinter中的菜单组件,通过该组件,开发者可以为窗口设计菜单和工具栏等。(ttk还提供了treeview树形菜单,python遍历目录的两种方法_python 遍历目录-CSDN博客,这篇博客提到过)
Menu的好处
有人会问,为什么要用Menu呢?如果我们要模拟右键菜单

可以看到,菜单中有很多按钮。可能有人就会问:你用一个Frame容器加上很多Button按钮不就得了?
可以,你去试试,看得多麻烦=),而且必须得是熟练运用tkinter的人才行
(就像你跑步,同是跑一千米,你是穿凉鞋跑呢?还是运动鞋跑呢?爱穿凉鞋跑的在评论区里回复我爱穿凉鞋跑)
但是,如果用Menu,就简单多了。你所需写的代码还不到一个屏幕那么宽

菜单的使用场景
1.CSDN的文章目录

大家在看我写的文章的时候,左边的那部分就是目录菜单
2.Windows的开始菜单

3.Python编辑器上的菜单

4.scratch积木选择器

除了这些,还有很多。。。。。
接下来,我就教大家如何使用Menu,教你制作出属于自己的菜单!
初用Menu
语法如下
Menu(win,option)
win表示父容器,option表示其中的参数
我们现在写一个简单的程序,来让大家体验一下
from tkinter import *
win=Tk()
menu1=Menu(win)
menu1.add_command(label='游戏')
menu1.add_command(label='程序')
menu1.add_command(label='帮助')
win.config(menu=menu1) #注意最好不要menu=menu
win.mainloop()
运行结果

add_command可以添加命令,实现类似按钮的功能
这里讲解一下Menu常用方法
| 方法 | 含义 |
| add_command() | 可以添加命令,实现类似按钮的功能 |
| add_cascade() | 添加父菜单,可以由此创建子菜单 |
| add_separator() | 添加下划线,便于整理 |
| post() | 在指定位置弹出菜单(可以以此来设计右键菜单) |
| delete(a,b) | 删除a~b的所有菜单项 |
这些就够用了,不够可以自行查搜
Menu高阶用法
现在,教大家两个Menu的高阶用法,分别为二阶菜单和右键菜单
1.二阶菜单
好,如果大家仔细看过上面的那张右键菜单图片,就会发现它是一个嵌套。这就是二阶菜单
我们现在就来做一个(这里做的是下拉菜单)
(1)创建顶层菜单
from tkinter import *
win=Tk()
menu1=Menu(win)
menu1.add_cascade(label='游戏')
win.config(menu=menu1)
win.mainloop()
效果

(2)创建二级菜单
修改代码
menu1.add_cascade(label='游戏',menu=menu2)
为
这样,他就产生了一个二阶菜单
那我们需要创建隶属于menu1的二阶菜单menu2
menu2=Menu(menu1,tearoff=False)
menu1.add_cascade(label='游戏',menu=menu2)
menu2.add_command(label='简单')
menu2.add_command(label='普通')
menu2.add_command(label='困难')
menu2.add_command(label='噩梦')
这里需要用到tearoff,不然会出现BUG(如果你不用tearoff,下拉菜单会出现一行虚线,如你点击它,就会出现BUG)
何为tearoff
tearoff是设置菜单能否从窗口分离,默认值为True,所以我们要用False,避免BUG产生。
全部代码
代码
from tkinter import *
win=Tk()
menu1=Menu(win)
menu2=Menu(menu1,tearoff=False)
menu1.add_cascade(label='游戏',menu=menu2)
menu2.add_command(label='简单')
menu2.add_command(label='普通')
menu2.add_command(label='困难')
menu2.add_command(label='噩梦')
win.config(menu=menu1)
win.mainloop()
运行结果

如果大家利用这个语法充分,就可以做出三级菜单,这里以Windows95的菜单设计为例

右键菜单

我们的任务是学会这个
(1)制作指定位置弹出菜单函数
def PopoutMenu(win, menu): #w为父窗口,menu为MENU菜单def popout(event):menu.post(event.x + win.winfo_rootx(), event.y + win.winfo_rooty()) #指定位置弹出菜单win.update() #更新界面win.bind('<Button-3>', popout) #如果按下右键,执行弹出菜单函数
大家仔细看注释、代码,自行领会
(2)制作菜单
from tkinter import *
main_win=Tk()
#right_key
right_key_menu=Menu(main_win,tearoff=False)
create_new_file_menu=Menu(right_key_menu,tearoff=False)
watch_menu=Menu(right_key_menu,tearoff=False)
sort_menu=Menu(right_key_menu,tearoff=False)
right_keys=["查看","排序方式","刷新","新建","设置","个性化"]
for i in right_keys:if i =='新建':right_key_menu.add_separator()right_key_menu.add_cascade(label='新建',menu=create_new_file_menu)elif i=='设置':right_key_menu.add_separator()right_key_menu.add_cascade(label='设置')elif i=='查看':right_key_menu.add_cascade(label='查看',menu=watch_menu)elif i=='排序方式':right_key_menu.add_cascade(label='排序方式',menu=sort_menu)else:right_key_menu.add_cascade(label=i)creates=["文件夹","快捷方式","文本文档"]
for i in creates:create_string=iif i=='文本文档':create_new_file_menu.add_separator()create_new_file_menu.add_command(label=f"{create_string}")watches=["大图标","中等图标","小图标"]
for i in watches:watch_menu.add_command(label=i)
sort_menu.add_command(label="项目类型")
PopoutMenu(main_win,right_key_menu)
main_win.mainloop()
全部代码
代码
def PopoutMenu(win, menu): #w为父窗口,menu为MENU菜单def popout(event):menu.post(event.x + win.winfo_rootx(), event.y + win.winfo_rooty()) #指定位置弹出菜单win.update() #更新界面win.bind('<Button-3>', popout) #如果按下右键,执行弹出菜单函数
from tkinter import *
main_win=Tk()
#right_key
right_key_menu=Menu(main_win,tearoff=False)
create_new_file_menu=Menu(right_key_menu,tearoff=False)
watch_menu=Menu(right_key_menu,tearoff=False)
sort_menu=Menu(right_key_menu,tearoff=False)
right_keys=["查看","排序方式","刷新","新建","设置","个性化"]
for i in right_keys:if i =='新建':right_key_menu.add_separator()right_key_menu.add_cascade(label='新建',menu=create_new_file_menu)elif i=='设置':right_key_menu.add_separator()right_key_menu.add_cascade(label='设置')elif i=='查看':right_key_menu.add_cascade(label='查看',menu=watch_menu)elif i=='排序方式':right_key_menu.add_cascade(label='排序方式',menu=sort_menu)else:right_key_menu.add_cascade(label=i)creates=["文件夹","快捷方式","文本文档"]
for i in creates:create_string=iif i=='文本文档':create_new_file_menu.add_separator()create_new_file_menu.add_command(label=f"{create_string}")watches=["大图标","中等图标","小图标"]
for i in watches:watch_menu.add_command(label=i)
sort_menu.add_command(label="项目类型")
PopoutMenu(main_win,right_key_menu)
main_win.mainloop()
运行结果

总结
我的这篇文章介绍了python tkinter Menu,带大家深入了解了他的用法,带大家体会Menu的功能强大之处
望大家喜欢(❤ ω ❤)
相关文章:
Python tkinter Menu菜单组件详解
好久没有更新了,今天我来领大家熟悉一下Menu组件 1.认识、了解Menu 什么是Menu menu组件是tkinter中的菜单组件,通过该组件,开发者可以为窗口设计菜单和工具栏等。(ttk还提供了treeview树形菜单,python遍历目录的两种…...
谷粒商城实战笔记-46-商品服务-API-三级分类-配置网关路由与路径重写
文章目录 一,准备工作1,新增一级菜单2,新增二级菜单 二,前端树形界面开发1,开发分类展示组件 三,远程调用接口获取商品分类数据1,远程调用2,路由配置 错误记录 本节的主要内容&#…...
简要了解sql注入
sql注入安全测试中危害 数据库中的数据,对数据库数据进行操作(查询、删除等);网站的权限,找到注入点后可后门写入; sql注入产生原理详细分析 可控变量,带入数据库查询,变量未存在…...
Java 扫雷游戏
程序分析 使用Java编写的扫雷游戏界面程序,主要内容总结如下: Frame类继承自JFrame,构建了扫雷游戏的界面。 包含文本框text、标签nowBomb和setBomb、按钮start、面板MenuPamel和bombPanel等组件。通过jbInit方法进行初始化设置,…...
vue3 命令运行窗口暴露网络地址,以及修改端口号
一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址,再加上--port --8080 就可以将端口号修改为8080(修改后边的数字就可以修改为你想要的端口号)...
由CANoe自带协议栈在TCP断开连接时同时发送两条FIN报文引起的注意事项
在我写这篇文章CAPL如何在底层模拟TCP Server端断开TCP连接时,我发现了一个奇怪的现象。我为了使用CAPL组装报文的方式实现TCP Server断开连接的过程,插入一个网络节点作为Client端。为了让Client能够发起连接和发起断开连接,给网络节点配置了独立的TCP/IP Stack,也就是CAN…...
FastGPT部署和接入使用重排模型bce-reranker-base
bce-reranker简介 bce-reranker 是一种专门用于信息检索和自然语言处理领域中的重排序(reranking)模型。这种模型由北京智源人工智能研究院(BAAI)开发,是 BGE(BAAI General Embedding)系列的一部分。BGE 系列模型专注于提供通用的嵌入表示,而 bce-reranker 则更进一步…...
Android笔试面试题AI答之线程Handler、Thread(2)
答案仅供参考,来自 讯飞星火大模型 目录 1.Android多线程间通信和多进程之间通信有什么不同,分别怎么实现?2.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系?3.Android 线程间通信有哪几种方式?4.子线程发消息…...
某某物联rabbitmqhttp二轮充电桩协议充电协议对接
对接方式概述: 1)请求采用 http 协议方式,推送数据采用 amqp(默认 rabbitmq)点对点消息队 列方式。 2)消息队列连接信息,需贵方完善。 1 hostIp: 2 virtualHost: 3 userName: 4 pass…...
黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型
文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…...
Java | Leetcode Java题解之第283题移动零
题目: 题解: class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…...
Django REST Framework(十三)视图集-GenericViewSet
Django REST Framework 中,ModelViewSet 和 ReadOnlyModelViewSet 提供了快速实现常见视图操作的便捷方法。它们分别继承自 GenericViewSet 并组合了多个 Mixin 类,使得视图的编写变得更加简单。 ModelViewSet ModelViewSet 继承自 GenericViewSet&…...
《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取
一、深度爬取 深度爬取是指在网络爬虫中,获取网页上的所有链接并递归地访问这些链接,以获取更深层次的页面数据。 通常,一个简单的爬虫只会获取到初始页面上的链接,并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获…...
Python Pygame制作简单五子棋游戏
代码参考自:https://blog.csdn.net/weixin_43918046/article/details/119521845 新增功能:1任意棋盘大小;2.任意棋子连线 # 棋盘大小 [670, 670] # 棋盘行列 15*15 import pygame from pygame.locals import QUIT, KEYDOWN import numpy as…...
JS+H5在线文心AI聊天(第三方接口)
源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…...
kafka源码阅读-ReplicaStateMachine(副本状态机)解析
概述 Kafka源码包含多个模块,每个模块负责不同的功能。以下是一些核心模块及其功能的概述: 服务端源码 :实现Kafka Broker的核心功能,包括日志存储、控制器、协调器、元数据管理及状态机管理、延迟机制、消费者组管理、高并发网络…...
【MetaGPT系列】【MetaGPT完全实践宝典——如何定义单一行为多行为Agent】
目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent(ProductManager)2-3、拥有单一行为的Agent(SimpleCoder)2-3-1、定义写代码行为2-3-2、角色定义2-3…...
Kolla-Ansible的确是不支持CentOS-Stream系列产品了
看着OpenStack最新的 C 版本出来一段时间了,想尝个鲜、用Kolla-Ansible进行容器化部署,结果嘛。。。 根据实验结果,自OpenStack Bobcat版本开始,Kolla-Ansible就适合在CentOS系列产品上部署了,通过对 Bobcat和Caracal…...
IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错
这篇文章写的就很详细了(IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错_error occurred during initialization of vm failed -CSDN博客)...
ctfshow298-300(java信息泄露,代码审计)
Web298 代码审计 这里看到getVipStatus方法,获得了获取flag的条件就是user等于admin,password等于ctfshow Poc: https://d036a90d-ac1c-4de1-9b0b-86f52d2586b9.challenge.ctf.show/ctfshow/login?usernameadmin&passwordctfshow Web299 打开页面…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
