如何去除Python Tkinter菜单栏下方的细小间距
解决Tkinter菜单栏下方细灰线的问题
我之前也被Tkinter菜单栏这条细灰线折腾过!你试过的relief和普通border参数没用,是因为这条线要么是菜单栏本身的隐藏边框,要么是系统主题带来的默认间距,得从几个地方一起调整。
具体解决方案
- 给菜单栏和子菜单设置
borderwidth=0,彻底移除边框 - 添加
highlightthickness=0去掉菜单栏的高亮边框 - (Windows系统可选)设置
activeborderwidth=0,防止菜单激活时出现边框 - 调整Frame布局,确保它们紧密贴合菜单栏下方,避免间隙
修改后的完整代码
from tkinter import * class GUI(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.place(relwidth=1, relheight=1) def start(self): # 菜单栏:添加borderwidth、highlightthickness、activeborderwidth参数 self.mBar = Menu(self, relief=None, borderwidth=0, highlightthickness=0, activeborderwidth=0) # 子菜单同样设置borderwidth=0 fMenu = Menu(self.mBar, tearoff=0, borderwidth=0) eMenu = Menu(self.mBar, tearoff=0, borderwidth=0) hMenu = Menu(self.mBar, tearoff=0, borderwidth=0) self.mBar.add_cascade(label="File", menu=fMenu) self.mBar.add_cascade(label="Edit", menu=eMenu) self.mBar.add_cascade(label="Help", menu=hMenu) root.config(menu=self.mBar) # 主Frame:调整y坐标,让tFrame紧贴菜单栏下方 self.tFrame = Frame(self, bg="White") self.tFrame.pack_propagate(False) self.tFrame.place(x=0, y=0, relwidth=1, height=50) # 调整左右Frame的y坐标,和tFrame底部对齐 self.lFrame = Frame(self, bg="White") self.lFrame.pack_propagate(False) self.lFrame.place(x=0, y=50, width=224, relheight=1) self.rFrame = Frame(self, bg="White") self.rFrame.pack_propagate(False) self.rFrame.place(x=224, y=50, relwidth=0.83, relheight=1) self.configure(bg="red") if __name__ == "__main__": # 修正入口判断语句的写法 root = Tk() root.title("Test <@:)") root.geometry("700x500") root.config(highlightthickness=0) # 可选:去掉窗口自身的高亮边框 gui = GUI(root) gui.start() root.mainloop() # 添加mainloop,保证窗口正常显示
关键修改说明
- 菜单栏和子菜单的
borderwidth=0:直接移除所有边框样式 highlightthickness=0:消除菜单栏获得焦点时的高亮边框activeborderwidth=0:避免菜单选项被选中时出现临时边框- 调整Frame的y坐标:原代码中
lFrame和rFrame的y=52会导致和tFrame之间出现2像素间隙,改成y=50后完全贴合 - 添加
root.mainloop():原代码漏掉了这个关键语句,会导致窗口一闪而过
这样调整后,那条烦人的细灰线应该就消失了。如果还是有问题,可能是系统主题的强制样式,这时候可以试试把菜单栏嵌入到一个Frame中,再把Frame放到窗口顶部,用Frame的背景色覆盖掉那条线,但上面的方法在大多数情况下都能解决问题。
内容的提问来源于stack exchange,提问作者cdw100100




