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 打开页面…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
