PySimpleGUI 菜单从 0 到专业导航:一个嵌套列表搞定所有菜单

📅 2026/8/24 6:00:21
PySimpleGUI 菜单从 0 到专业导航:一个嵌套列表搞定所有菜单
PySimpleGUI 菜单从 0 到专业导航一个嵌套列表搞定所有菜单【免费下载链接】PySimpleGUIPython GUIs for Humans! Create any GUI simple or complicated in a way thats intuitive. Launched in 2018. NEW for 2026 - the LGPL3 Version 6. Transforms tkinter, Qt, WxPython, and Remi into a simple, intuitive, and fun experience for both hobbyists and expert users.项目地址: https://gitcode.com/gh_mirrors/py/PySimpleGUI做桌面程序绕不开一个问题功能越来越多用户靠什么找到它们答案几乎总是——菜单。PySimpleGUI 的菜单系统把这件事做到了极简不管是顶部菜单栏、右键弹出、按钮下拉还是换色定制全部由同一种数据结构驱动。掌握这套 PySimpleGUI 菜单玩法你的 Python GUI 导航就有了专业级的骨架。![PySimpleGUI 应用窗口与菜单导航界面示意](https://raw.gitcode.com/gh_mirrors/py/PySimpleGUI/raw/bca6fea965c144ae9b832c6445a931cb7e7c68c1/images/for_readme/Demo Browser Search Close Attempted.jpg?utm_sourcegitcode_repo_files)一个典型的 PySimpleGUI 应用窗口顶部导航、操作区、输出区各司其职一个核心思想菜单就是嵌套列表 整个 PySimpleGUI 菜单系统只有一个基本单元嵌套列表。最外层是一个列表每个元素是「顶栏标签 点击后展开的项目列表」的二元组某个项目本身又是一个列表时就向右弹出下一级子菜单——层级就是这么递归出来的。menu_def [ [报表, [新建报表, 导入数据, ---, 导出 Ctrl-E, !打印]], [数据, [查询, [按客户, 按区域], 刷新]], [帮助, [关于::about_key]] ]这段代码定义了三个顶层入口其中「数据」下藏着一个二级子菜单。列表里有 5 个记号值得刻进记忆记号写法作用导出定义 Alt 快捷键AltX界面上以下划线提示事件里不会带出这个符号::关于::about_key给菜单项起一个程序用的唯一 key用户看不到它事件循环里以它为准---单独一项画一条分隔线用来给相关命令分组!!打印把该菜单项置灰禁用Ctrl-导出 Ctrl-E纯文本提示快捷键空格对齐只是显示不绑定真实按键记住这张表后面所有菜单类型的定义方式都不用再学。从 0 搭出第一个菜单三步走定义 → 挂到布局 → 读事件。第一步定义就是上面那份menu_def不用多说。第二步用sg.Menu把定义挂进 layout 的某一行它就是窗口顶部的菜单栏layout [ [sg.Menu(menu_def, tearoffFalse, key-BAR-)], [sg.Text(报表工作台主区域, size(40, 1))], [sg.Output(size(60, 10))] ] window sg.Window(报表工作台, layout)第三步菜单选择走的是和其他控件一样的事件通道——window.read()返回的event就是被点击项的文本注意已被剥离while True: event, values window.read() if event in (sg.WIN_CLOSED, Quit): break if event 导出: sg.popup(导出任务已开始) elif event about_key: # 带 :: 的项按 key 匹配 sg.popup(关于, 报表工作台 v1.0)到这一步一个能点、能分组、能弹子菜单的三级导航就完整跑起来了。四种菜单各管一段导航同一种列表结构四个「宿主」各占一块领地。按场景选类型入口 API适合场景顶部菜单栏sg.Menu(menu_def)放进 layout全局功能的主入口用户第一眼找的地方右键上下文菜单sg.Window(..., right_click_menu...)与当前位置/对象相关的操作复制、粘贴、属性按钮下拉菜单sg.ButtonMenu(文本, 定义)放进 layout工具栏把一组命令收进一个按钮自定义菜单栏sg.MenubarCustom(定义)放进 layout要品牌配色、或配合自定义标题栏时使用右键菜单给sg.Window传一个right_click_menu即可结构仍是老样子第一个标签不会被显示放占位字符串即可ctx_menu [未使用, [复制, 粘贴, 剪切, ---, 属性]] window sg.Window(报表工作台, layout, right_click_menuctx_menu)按钮菜单ButtonMenu是一个会弹出下拉列表的按钮key方便你之后单独改它layout [ [sg.ButtonMenu(工具, [[撤销, 重做, ---, 设置]], key-TOOL-, text_colorblue)] ]自定义菜单栏sg.Menu的顶栏本身没法换色只有下拉面板可以换想要整条菜单栏的品牌色就上MenubarCustom它本质是一排拼接起来的 ButtonMenu颜色、字体、内边距全归你管layout [ [sg.MenubarCustom(menu_def, pad0, key-CUSTBAR-, bar_background_color#2c3e50, bar_text_colorwhite, background_color#34495e, text_colorwhite)] ]PySimpleGUI 内置主题的视觉效果预览换成 MenubarCustom 后菜单风格就能跟着品牌走让菜单活起来动态更新与事件细节菜单不是建完就定死的运行中随时可以换。整表替换。拿到 Menu 元素的 key 后调update注意必须提交完整的菜单定义不能只改其中一项# 用户登录某个受限角色后把查询整个分支置灰 menu_def[1][1][0] !查询 window[-BAR-].update(menu_def)改动会在下一次window.read()/refresh时生效。ButtonMenu的update同理还能顺带改按钮文字、颜色、可见性。事件细节三个容易踩的约定用户点的是文本事件值就是文本无给项加了::key后事件值变成那个 key——两种匹配别混用。!开头的项是禁用态永远不会有事件回来适合做「占位但未解锁」的功能。右键菜单的第一项顶栏标签只是占位永远不会成为事件。一个能直接跑的完整例子把顶部菜单、右键菜单、按钮菜单和动态刷新放进同一个「报表工作台」整段可运行import PySimpleGUI as sg menu_def [ [报表, [新建报表, 导出, ---, 退出::exit_key]], [数据, [查询, [按客户, 按区域], 刷新::refresh]], [帮助, [关于]] ] ctx_menu [未使用, [复制, 粘贴, 剪切]] layout [ [sg.Menu(menu_def, key-BAR-)], [sg.Text(右键下方区域试试上下文菜单, size(40, 1))], [sg.ButtonMenu(工具, [[撤销, 重做, ---, 设置]], key-TOOL-)], [sg.Output(size(60, 8))] ] window sg.Window(报表工作台, layout, right_click_menuctx_menu) while True: event, values window.read() if event in (sg.WIN_CLOSED, exit_key): break if event refresh: menu_def[1][1][0] !查询 # 刷新时临时禁用查询 window[-BAR-].update(menu_def) else: print(f菜单事件: {event}) window.close()运行后依次试一遍点「报表 → 导出」在输出区右键看上下文菜单点「工具」按钮看工具栏下拉再点「数据 → 刷新」看菜单被动态置灰——四种形态与动态更新全在这 30 行里。少走弯路常见坑与上手建议坑菜单整个不出现→ 检查menu_def是不是「每个顶层项都是 [标签, 列表] 的二元组」。最常见的是把项目直接写进最外层列表。坑点了菜单没有反应→ 事件值和带的原文对不上。匹配时用不带的文本或者干脆给项加::key再按 key 匹配一劳永逸。坑想改菜单栏颜色参数却没用→sg.Menu的颜色参数只作用于下拉面板顶栏本身改不了。要换整条栏的配色换成sg.MenubarCustom。坑update 之后界面无变化→ 一是漏了「提交完整定义」二是改完没有经过下一次window.read()或refresh界面不会自己刷新。设计建议来自大量真实应用的共识层级压到 3 层以内越深越没人点用---按功能分组一组一隔高频项给快捷键配 AltCtrl-文本做提示排序遵循「常用的靠前、相关的挨着」。仓库里还有三份现成参考直接打开就能读四种菜单形态的完整演示Demo_Menus.py自定义菜单栏含配色与 tearoffDemo_Menubar_Custom.py菜单 工具栏组合Demo_Menu_With_Toolbar.py下次再给程序加功能时先别急着堆按钮拿一份嵌套列表把新功能塞进对应分支导航自己会生长。【免费下载链接】PySimpleGUIPython GUIs for Humans! Create any GUI simple or complicated in a way thats intuitive. Launched in 2018. NEW for 2026 - the LGPL3 Version 6. Transforms tkinter, Qt, WxPython, and Remi into a simple, intuitive, and fun experience for both hobbyists and expert users.项目地址: https://gitcode.com/gh_mirrors/py/PySimpleGUI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考