You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Tkinter实现主窗口内的下拉式按钮(非菜单栏)

在Tkinter中创建窗口内的下拉菜单按钮(类似Notepad++风格)

嘿,我完全懂你想要的效果——就是那种嵌在主窗口里、点击后弹出下拉选项的按钮,和Notepad++顶部的菜单按钮一模一样对吧?作为Tkinter初学者,这个其实很好实现,我给你一步步讲清楚:

核心思路

Tkinter自带了Menubutton组件,专门用来创建这种非菜单栏的下拉按钮,搭配Menu组件就能实现你要的效果。用ttk版本的组件还能自动适配Mac的系统样式,看起来更舒服。

完整代码示例

你可以直接把这段代码复制到PyCharm里运行:

import tkinter as tk
from tkinter import ttk

# 创建主窗口
root = tk.Tk()
root.title("窗口内下拉按钮Demo")
root.geometry("450x300")

# 创建第一个下拉按钮:文件菜单
file_btn = ttk.Menubutton(root, text="文件", takefocus=False)
# 让按钮和其他按钮并排(类似Notepad++的布局)
file_btn.pack(side="left", padx=10, pady=20)

# 创建文件菜单的下拉选项
file_menu = tk.Menu(file_btn, tearoff=0)  # tearoff=0去掉顶部可拖拽的虚线
file_menu.add_command(label="新建", command=lambda: print("执行新建操作"))
file_menu.add_command(label="打开", command=lambda: print("执行打开操作"))
file_menu.add_separator()  # 添加分隔线,区分不同功能组
file_menu.add_command(label="保存", command=lambda: print("执行保存操作"))
file_menu.add_command(label="退出", command=root.quit)

# 把菜单绑定到按钮上
file_btn.config(menu=file_menu)

# 再创建一个示例按钮:编辑菜单
edit_btn = ttk.Menubutton(root, text="编辑", takefocus=False)
edit_btn.pack(side="left", padx=10, pady=20)

edit_menu = tk.Menu(edit_btn, tearoff=0)
edit_menu.add_command(label="撤销", command=lambda: print("执行撤销"))
edit_menu.add_command(label="重做", command=lambda: print("执行重做"))
edit_menu.add_separator()
edit_menu.add_command(label="复制", command=lambda: print("执行复制"))
edit_menu.add_command(label="粘贴", command=lambda: print("执行粘贴"))

edit_btn.config(menu=edit_menu)

root.mainloop()

关键细节解释

  • ttk.Menubutton:比原生的tk.Menubutton样式更适配Mac系统,不会显得突兀
  • tearoff=0:必须设置这个参数,不然菜单顶部会出现一条可拖拽的虚线,不符合我们要的固定菜单效果
  • 并排布局:用pack(side="left", padx=10)让多个按钮横向排列,和Notepad++的菜单布局一致
  • 菜单分组:用add_separator()添加分隔线,让功能分类更清晰
  • 绑定操作:command参数可以绑定你自己的函数,示例里用lambda快速测试,实际项目中替换成你的业务逻辑就行

进阶技巧:添加子菜单

如果需要像Notepad++那样的多级子菜单,只要嵌套Menu组件就可以:

# 给"打开"选项添加子菜单
open_submenu = tk.Menu(file_menu, tearoff=0)
open_submenu.add_command(label="最近文件", command=lambda: print("打开最近文件"))
open_submenu.add_command(label="从URL打开", command=lambda: print("从URL打开"))
# 用add_cascade把菜单嵌套进去
file_menu.add_cascade(label="打开", menu=open_submenu)

运行这段代码,你就能看到和你想要的几乎一样的效果啦!如果有样式或者功能上的细节想调整,随时再问~

内容的提问来源于stack exchange,提问作者Mills Tennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:18:24