You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter中Frame组件sticky属性失效:无法平分父Frame宽度

Tkinter Frame 等分宽度布局问题解决

我尝试用sticky属性让b_frame和c_frame各占a_frame的一半宽度,两者总宽度填满a_frame,但实际效果不符合预期。

原代码

import tkinter as tk

frame = tk.Tk()  # 补充原代码缺失的根窗口初始化

a_frame=tk.Frame(frame, highlightbackground="red",
                 highlightthickness=2)
a_frame.grid(row=3, column=0, sticky="nsew", columnspan=2)

b_frame = tk.LabelFrame(a_frame, text="b")
b_frame.grid(row=0, column=0, sticky="nsw")

c_frame = tk.LabelFrame(a_frame, text="c")
c_frame.grid(row=0, column=0, sticky="nse")

d = tk.Entry(b_frame)
d.grid(row=0, column=0)

# 注:原代码中e_frame应为c_frame
e = tk.Entry(c_frame)
e.grid(row=0, column=0)

frame.mainloop()

实际效果

两个LabelFrame重叠在一起,并未实现各占一半宽度的布局。

问题原因

将b_frame和c_frame都放在了a_frame的同一网格单元(row=0, column=0),sticky属性仅能让组件填充所在单元格,无法实现平分宽度的效果。

解决方案

  1. 配置a_frame的列权重:给两列设置相同权重,让它们平分容器宽度
  2. 分开放置两个Frame:将b_frame和c_frame分别放在不同列,同时设置sticky="nsew"让它们充满所在列
  3. 优化内部组件拉伸:让Entry随所在Frame宽度自动调整

修正后完整代码

import tkinter as tk

frame = tk.Tk()

# 配置根窗口布局权重,确保a_frame能随窗口拉伸
frame.grid_columnconfigure(0, weight=1)
frame.grid_rowconfigure(3, weight=1)

a_frame=tk.Frame(frame, highlightbackground="red",
                 highlightthickness=2)
a_frame.grid(row=3, column=0, sticky="nsew", columnspan=2)

# 让a_frame的两列平分宽度
a_frame.grid_columnconfigure(0, weight=1)
a_frame.grid_columnconfigure(1, weight=1)

b_frame = tk.LabelFrame(a_frame, text="b")
b_frame.grid(row=0, column=0, sticky="nsew")

c_frame = tk.LabelFrame(a_frame, text="c")
c_frame.grid(row=0, column=1, sticky="nsew")

# 让Entry填充b_frame的宽度
d = tk.Entry(b_frame)
d.grid(row=0, column=0, sticky="ew")
b_frame.grid_columnconfigure(0, weight=1)

# 让Entry填充c_frame的宽度
e = tk.Entry(c_frame)
e.grid(row=0, column=0, sticky="ew")
c_frame.grid_columnconfigure(0, weight=1)

frame.mainloop()

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:20:42