Tkinter主窗口居中放置占宽50%主框架的实现及代码问题排查
问题原因
你的代码运行异常主要是三个问题导致:
- 窗口初始化后未完成渲染,
winfo_width()此时返回默认值1而非你设置的窗口宽度,三个框架的宽度计算全部错误 pack()布局默认垂直从上到下排列组件,你未指定side参数,三个框架是上下堆叠而非水平并排,不符合横向分栏的需求pack()默认开启组件大小自动适配内容的特性,未显式指定fill、expand参数,也未关闭自适应的情况下,你手动设置的width属性会被忽略
解决方法
最优方案(无需侧边框架)
用grid布局的列权重分配实现比例占位,左右列留空即可,不需要额外加侧边框架,代码更简洁,且窗口缩放时会自动保持主框架占50%宽度:
from tkinter import * root = Tk() root.geometry("400x100") # 可自行调整窗口初始大小 # 配置三列的权重:左1,中2,右1,总权重4,中间占2/4=50%,左右各占1/4=25% root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, weight=2) root.grid_columnconfigure(2, weight=1) # 主框架放在中间列,横向填充整个列宽 main = Frame(root, bg="black") main.grid(row=0, column=1, sticky="nsew") root.mainloop()
带侧边框架的修正方案
如果后续需要在侧边栏放置控件,可以用如下修正代码,通过pack的expand参数直接分配比例,不需要手动计算宽度:
from tkinter import * root = Tk() root.geometry("400x100") # 三个框架按1:2:1分配宽度,对应左右25%、中间50% f1 = Frame(root, bg="white") f1.pack(side=LEFT, fill=BOTH, expand=1) main = Frame(root, bg="black") main.pack(side=LEFT, fill=BOTH, expand=2) f2 = Frame(root, bg="white") f2.pack(side=LEFT, fill=BOTH, expand=1) root.mainloop()
内容的提问来源于stack exchange,提问作者David Emmanuel
相关产品推荐
相关产品推荐

