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属性仅能让组件填充所在单元格,无法实现平分宽度的效果。
解决方案
- 配置
a_frame的列权重:给两列设置相同权重,让它们平分容器宽度 - 分开放置两个Frame:将
b_frame和c_frame分别放在不同列,同时设置sticky="nsew"让它们充满所在列 - 优化内部组件拉伸:让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
相关产品推荐
相关产品推荐

