You need to enable JavaScript to run this app. Tkinter主窗口居中放置占宽50%主框架的实现及代码问题排查
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:57:03