Tkinter添加菜单栏后窗口居中失效的原因及解决方法问询
问题成因
- 代码执行顺序存在问题:先调用
win_ctr()完成居中计算,再调用initUI()绑定菜单栏。Tkinter的菜单栏属于窗口非客户区,绑定到窗口后会额外增加窗口的总高度,此时窗口实际尺寸已经和居中计算时使用的初始尺寸不一致,自然无法正确居中。 - 居中函数执行时调用的
win.update_idletasks()仅刷新了当时还没有菜单栏的窗口状态,没有将后续菜单栏带来的尺寸变化纳入计算逻辑。
解决方案
核心逻辑是所有UI组件全部初始化完成后,再执行窗口居中计算,具体调整如下:
- 调整
main()函数内的调用顺序:先执行initUI(win)加载菜单栏,再执行win_ctr(win)计算居中位置。 - 优化居中函数的尺寸获取逻辑:直接使用
winfo_width()、winfo_height()获取窗口实际渲染后的宽高,比拆分geometry()字符串更可靠,也能自动适配菜单栏、控件带来的尺寸变化。
修改后的可运行代码
from tkinter import * def win_ctr(win): win.update_idletasks() # 直接获取窗口实际渲染后的宽高 win_width = win.winfo_width() win_height = win.winfo_height() # 计算居中坐标 x = (win.winfo_screenwidth() - win_width) // 2 y = (win.winfo_screenheight() - win_height) // 2 win.geometry(f"+{x}+{y}") def ac(): print("test") def wmenu(win): menu_bar=Menu(win) file_menu=Menu(menu_bar,tearoff=0) file_menu.add_command(label="Clear",command=ac) file_menu.add_separator() file_menu.add_command(label="Quitter",command=win.quit) menu_bar.add_cascade(label="MENU",menu=file_menu) win.config(menu=menu_bar) def initUI(win): wmenu(win) def main(): win=Tk() win.title("Test") win.geometry("354x460") win.resizable(True, True) win.config(bg=mint) # 先加载所有UI组件,再执行居中 initUI(win) win_ctr(win) win.mainloop() if __name__=="__main__": mint="#41B77F" main()
内容的提问来源于stack exchange,提问作者AzuRakaH
相关产品推荐
相关产品推荐

