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 打开页面…...
HarmonyOS6 半年磨一剑 - RcTextarea 组件核心架构与类型系统设计
文章目录前言一、组件整体架构1.1 文件结构1.2 装饰器体系二、类型系统深度解析2.1 边框模式类型2.2 清空触发类型2.3 格式化与解析函数类型2.4 文本对齐与回车键类型三、核心参数体系3.1 必传参数3.2 尺寸相关参数3.3 功能开关参数四、内部状态与生命周期4.1 内部状态设计4.2 …...
别再手动校正了!用Landsat 9 L2SP地表反射率数据,在QGIS里5分钟搞定NDVI和水体提取
遥感分析效率革命:用Landsat 9 L2SP数据在QGIS中实现5分钟精准制图 当遥感数据处理流程从传统数小时缩短至五分钟,这意味着什么?去年在亚马逊雨林监测项目中,我们团队曾因大气校正步骤延误错过了最佳干预时机。如今Landsat 9 L2SP…...
注意力缺陷是什么?主要有哪几种症状及专注力训练方法?
注意力缺陷病因及其对儿童发展的影响分析 注意力缺陷(ADHD)的病因较为复杂,主要涉及遗传、环境和生物因素。研究表明,遗传因素在儿童注意力缺陷中起着重要作用,有些家族中更容易出现多动症状。与此同时,环境…...
AI辅助下的走马观碑:让智能体自动优化你的任务管理应用逻辑
今天想和大家分享一个特别实用的开发经验——如何用AI给任务管理应用"开外挂"。最近在做一个待办事项应用时,我发现单纯的手动输入任务实在太原始了,于是尝试用AI来增强功能,效果出乎意料的好。 智能任务分析功能 传统的任务管理…...
阿联酋人工智能大学:AI能在战争迷雾中做出理性判断吗?
这项由阿联酋穆罕默德本扎耶德人工智能大学和美国马里兰大学共同完成的研究发表于2026年3月,论文编号为arXiv:2603.16642v1。有兴趣深入了解的读者可以通过该编号查询完整论文。在人类历史上,预测战争走向一直是个极其困难的任务。就像我们很难在暴风雨中…...
【独家首发】Polars 2.0 vs Pandas 2.2清洗基准测试:10亿行CSV清洗仅耗11.3秒?真相在此
第一章:Polars 2.0大规模数据清洗的范式跃迁Polars 2.0 不再是 Pandas 的轻量替代品,而是一次面向现代硬件与真实业务场景的数据处理范式重构。其核心跃迁体现在零拷贝内存布局、全链路惰性执行引擎(LazyFrame)与原生支持的并行流…...
别再花钱买云API了!手把手教你用Docker+Ollama在本地免费跑通Strix渗透测试
零成本打造企业级渗透测试环境:DockerOllama本地化实战指南 当安全团队每月收到云服务商五位数的API账单时,当关键测试任务因网络抖动被迫中断时,越来越多的技术决策者开始重新审视渗透测试的基础架构。本文将揭示如何用消费级硬件构建媲美商…...
AceCommon:Arduino嵌入式零堆分配轻量C++工具库
1. AceCommon 库概述:面向嵌入式 Arduino 的轻量级底层工具集AceCommon 是一个专为资源受限的微控制器平台(尤其是 Arduino 生态)设计的零依赖、低开销 C 工具库。其核心设计哲学是“小而精、无侵入、可复用”。与常见的功能臃肿、依赖繁杂的…...
SQLite.Interop.DLL加载失败的3种修复方案 - 从运行库到项目配置全搞定
SQLite.Interop.DLL加载失败的终极解决方案:从运行环境到项目配置深度解析 当你正在开发一个依赖SQLite数据库的C#项目时,突然遇到"无法加载DLLSQLite.Interop.DLL"的错误提示,这绝对是一个令人头疼的问题。作为一名有多年.NET开发…...
能源监控项目避坑指南:为什么DLT645电表直连Modbus系统会失败?
能源监控项目避坑指南:为什么DLT645电表直连Modbus系统会失败? 在智慧能源项目的实施过程中,数据采集的可靠性直接关系到整个系统的运行效果。许多项目团队在遇到DLT645规约电表与Modbus系统对接时,往往会尝试直接连接,…...
