如何让Tkinter主窗口、弹出窗口及标签分别居中显示?
Tkinter窗口居中解决方案
问题分析
你当前的弹出窗口无法在主窗口居中,核心原因是计算Toplevel位置时用了主窗口内部的相对偏移,但geometry方法里的+X+Y是屏幕绝对坐标,并非相对于主窗口的坐标。需要结合主窗口的屏幕位置来计算弹出窗口的绝对坐标。
修正后的代码
from tkinter import * # 主窗口居中屏幕 window = Tk() window_width = 500 window_height = 500 screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() # 计算主窗口的屏幕坐标 win_x = int((screen_width - window_width) / 2) win_y = int((screen_height - window_height) / 2) window.geometry(f"{window_width}x{window_height}+{win_x}+{win_y}") def pop(): top = Toplevel(window) top_width = 200 top_height = 200 # 获取主窗口当前的屏幕坐标(应对窗口被拖动后的位置变化) current_win_x = window.winfo_x() current_win_y = window.winfo_y() # 计算弹出窗口相对于主窗口居中的绝对坐标 top_x = current_win_x + int((window_width - top_width) / 2) top_y = current_win_y + int((window_height - top_height) / 2) top.geometry(f"{top_width}x{top_height}+{top_x}+{top_y}") top.title("Hi") # 标签居中弹出窗口(两种写法都可行) popLabel = Label(top, text="Ok") popLabel.place(relx=0.5, rely=0.5, anchor='center') # 也可以用pack简化:popLabel.pack(expand=True, fill=BOTH) # 添加触发弹出窗口的按钮 Button(window, text="弹出窗口", command=pop).pack(pady=20) window.mainloop()
关键修正点
- 弹出窗口位置:用
window.winfo_x()和window.winfo_y()实时获取主窗口的屏幕绝对坐标,再加上主窗口内的居中偏移量,确保弹出窗口始终在主窗口正中央。 - 主窗口代码简化:合并
geometry设置,避免重复调用。 - 标签居中:你原有的
place写法完全有效,也可以用pack(expand=True, fill=BOTH)实现自动居中,更适配Tkinter的布局逻辑。
内容的提问来源于stack exchange,提问作者contactme8359
相关产品推荐
相关产品推荐

