Tkinter在Mac端菜单显示在系统菜单栏而非窗口内如何修复
Mac端Tkinter菜单显示在系统顶部栏的修复方法
问题原因
这是MacOS下Tkinter的默认原生机制:只要通过window.config(menu=xxx)方式给窗口绑定菜单栏,Tkinter就会自动把菜单栏映射到Mac系统顶部的全局菜单栏,不会显示在应用窗口内部,该表现为Mac端独有,Windows、Linux系统下相同代码会正常把菜单显示在窗口顶部。
异常现象如下:
修复方案
如果需要强制让菜单显示在应用窗口内部,禁止使用窗口级的menu参数绑定菜单栏,改为通过普通组件手动布局内嵌菜单栏,操作步骤如下:
- 创建一个
Frame组件作为菜单栏容器,放置在窗口最顶部,设置横向占满窗口宽度 - 在菜单栏容器内,为每个一级菜单项创建
Menubutton组件,按水平方向依次排列 - 给每个
Menubutton绑定对应的下拉菜单,逻辑和原有菜单开发一致
修复后的可运行代码:
import tkinter as tk from tkinter import Menu, Frame, Menubutton # 初始化主窗口 window = tk.Tk() window.title("NewPlay") window.geometry('1000x800') window.minsize(1000, 800) window.maxsize(1200, 1000) window.config(bg="orange") def build_embedded_menu(): # 创建内嵌菜单栏容器 menubar_container = Frame(window, relief="raised", bd=1) menubar_container.pack(side="top", fill="x") # 构建Search下拉菜单 search_dropdown = Menu(menubar_container, tearoff=0) search_dropdown.add_command( label='Exit', command=window.destroy ) # 创建菜单按钮并绑定下拉内容 search_btn = Menubutton(menubar_container, text="Search", menu=search_dropdown) search_btn.pack(side="left", padx=3, pady=2) build_embedded_menu() window.mainloop()
补充说明:如果不需要强制内嵌菜单,仅需要系统顶部菜单栏显示正常,只需要保证绑定到窗口的第一个级联菜单标签和应用名一致即可,这种方式菜单依然会显示在系统顶部栏,不会出现在窗口内部。
内容的提问来源于stack exchange,提问作者J.R. BEATS
相关产品推荐
相关产品推荐

