Tkinter Grid布局窗口控件整体居中及自适应窗口大小实现方法
Tkinter Grid布局全局控件居中解决方案
- 不需要给窗口所有行列逐一设置权重,只需要将所有业务控件封装到同一个独立Frame容器中,将容器作为唯一子元素挂载到根窗口,仅配置根窗口对应行列的权重即可实现整体居中,容器内部的50+行列布局逻辑完全不用修改。
- 注意同一个父容器内禁止混用grid和pack布局,你原代码末尾的
Frame(root).pack()和root上的grid布局冲突,会直接触发布局异常,需删除。
可运行修改版代码
from tkinter import Tk, LabelFrame, SUNKEN, Label, Frame # 请自行实现你原逻辑中的get_res_path方法 def get_res_path(path): return path root = Tk() root.minsize(500, 100) root.title('123') # root.iconbitmap(get_res_path('icon.ico')) 图标路径自行替换生效 # 仅给根窗口的0行0列设权重,所有富余空间都分配给这一行列 root.rowconfigure(0, weight=1) root.columnconfigure(0, weight=1) # 创建全局主容器,所有业务控件都放在这个容器中,不要直接挂载到root上 main_container = Frame(root) # 容器不设置sticky参数,默认会在根窗口分配的空间内自动居中 main_container.grid(row=0, column=0) # ---------------------- 原有业务代码仅需修改父容器为main_container即可 ---------------------- status_bar = LabelFrame(main_container, bd=1, relief=SUNKEN) status_bar.grid(row=1, column=0, sticky=EW) # 状态栏内部布局规则完全保留 status_bar.columnconfigure(1, weight=1) testing_text = Label(status_bar, text='', anchor=W) testing_text.grid(row=0, column=0, sticky=W) status_text = Label(status_bar, text='Initializing', anchor=E) status_text.grid(row=0, column=1, sticky=E) ver_msg = Label(main_container, text='123') ver_msg.grid(row=0, column=0) # 你原有50+行列的业务布局都直接放在main_container中,内部grid配置不需要做任何修改 # --------------------------------------------------------------------------------------------- root.mainloop()
补充说明
如果后续需要让容器内部的控件随窗口缩放调整大小,只需要给main_container对应的行列设置权重即可,完全不需要修改根窗口的配置,不会和全局居中的逻辑冲突。
如果需要部分特殊控件(比如底部状态栏)贴边不居中,只需要将这部分控件单独挂载到root上,单独配置对应行列的权重即可,不影响主容器的居中逻辑。
内容的提问来源于stack exchange,提问作者Billy Cao
相关产品推荐
相关产品推荐

