Python3.6下Tkinter Frame内grid()布局ListBox异常求助
在Tkinter Frame中用grid()实现2×2 ListBox矩阵的正确姿势
嘿,我完全懂你遇到的这个坑——在同一个Frame里用grid()摆四个ListBox想搞成2×2矩阵,结果只显示一行两个,单独给每个ListBox套Frame就正常,还怀疑是不是Frame只能用pack(),加了column参数也没用,确实挺闹心的。
先给你说清楚:Frame绝对支持用grid()管理内部控件,你的问题大概率出在Frame本身的布局配置,或者grid的关键参数没到位上。
先看你可能踩的坑(错误示例)
比如你可能写了类似这样的代码:
import tkinter as tk root = tk.Tk() frame = tk.Frame(root) frame.pack() # 这里没设置填充和扩展,Frame只会缩到最小尺寸 lb1 = tk.Listbox(frame) lb1.grid(row=0, column=0) lb2 = tk.Listbox(frame) lb2.grid(row=0, column=1) lb3 = tk.Listbox(frame) lb3.grid(row=1, column=0) lb4 = tk.Listbox(frame) lb4.grid(row=1, column=1) root.mainloop()
这段代码的问题在于:
- 主Frame用
pack()时没加fill和expand,导致Frame只会根据内部控件的最小尺寸来显示——空ListBox默认高度只有1行,Frame高度不够,第二行的ListBox直接被挤到视野外了。 - 没有给Frame的行和列设置权重,也没给ListBox加
sticky参数,就算Frame有空间,控件也不会填充单元格,看起来还是像没显示第二行。
正确的实现代码
把上面的问题修正后,就能得到正常的2×2矩阵:
import tkinter as tk root = tk.Tk() root.title("2×2 ListBox Matrix") # 第一步:正确布局主Frame,让它填充整个根窗口 main_frame = tk.Frame(root) main_frame.pack(fill=tk.BOTH, expand=True) # 关键:fill让Frame填充窗口,expand允许它随窗口缩放 # 第二步:给Frame的行和列设置权重,保证单元格能随窗口扩展 main_frame.rowconfigure(0, weight=1) main_frame.rowconfigure(1, weight=1) main_frame.columnconfigure(0, weight=1) main_frame.columnconfigure(1, weight=1) # 第三步:创建ListBox,用grid布局并设置sticky让控件填充单元格 lb1 = tk.Listbox(main_frame) lb1.grid(row=0, column=0, sticky="nsew") # nsew表示上下左右都拉伸 lb2 = tk.Listbox(main_frame) lb2.grid(row=0, column=1, sticky="nsew") lb3 = tk.Listbox(main_frame) lb3.grid(row=1, column=0, sticky="nsew") lb4 = tk.Listbox(main_frame) lb4.grid(row=1, column=1, sticky="nsew") # 加些测试内容,方便直观看到效果 for i in range(5): lb1.insert(tk.END, f"列表1 项{i+1}") lb2.insert(tk.END, f"列表2 项{i+1}") lb3.insert(tk.END, f"列表3 项{i+1}") lb4.insert(tk.END, f"列表4 项{i+1}") root.mainloop()
关键知识点解析
- Frame的布局:必须让Frame占据足够的空间,
pack(fill=tk.BOTH, expand=True)是最常用的方式,确保Frame能铺满根窗口并随窗口大小变化。 - 行/列权重:
rowconfigure和columnconfigure的weight参数决定了行/列在窗口缩放时的分配比例,设为1表示所有行/列均分空间。 - sticky参数:让控件填充所在的单元格,否则ListBox只会保持默认的小尺寸,就算行/列有空间,控件也不会扩展,容易造成“第二行没显示”的错觉。
放心,Frame完全兼容grid()布局,之前的问题只是配置没到位而已~
内容的提问来源于stack exchange,提问作者kakyo
相关产品推荐
相关产品推荐

