tkinter中TablePage类使用grid布局时两个Frame出现重叠是什么原因?
问题原因
你的TablePage布局重叠是两个错误共同导致的:
- grid列位置参数写错:你给
table_frame设置了column=0, columnspan=3,意味着它会占用第0、1、2共三列的宽度,而你把buttons_frame放在column=1,刚好落在table_frame的占用范围内,自然会重叠。 - 没有配置grid的列权重:tkinter的grid布局默认不会按比例分配列宽,只会根据列内的内容宽度自适应,就算你列位置写对了,不设权重也没法实现3:1的宽度占比。同时你也没配置行权重,两个子frame也不会自动占满父容器的高度。
修复代码
你只需要修改TablePage类的初始化逻辑即可,修改后的代码如下:
class TablePage(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) # 配置grid的行和列权重,实现宽度3:1,高度占满 self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=3) self.grid_columnconfigure(1, weight=1) table_frame = tk.Frame(self, bg="red") # sticky参数让frame撑满所在单元格的全部空间 table_frame.grid(row=0, column=0, sticky="nsew") buttons_frame = tk.Frame(self, bg="blue") buttons_frame.grid(row=0, column=1, sticky="nsew") label = tk.Label(table_frame, text="Left side") label.pack(side="top", fill="both", expand=True) label2 = tk.Label(buttons_frame, text="Right side") label2.pack(side="top", fill="both", expand=True)
注意事项
tkinter的grid逻辑和WPF的Grid有两个核心差异需要注意:
- WPF的Grid默认会均分列宽/行高(如果你没设宽高的话),但tkinter的grid默认只会适配内容尺寸,必须主动调用
grid_rowconfigure和grid_columnconfigure给对应行列设置weight参数,才会按权重比例分配剩余空间。 - WPF的元素不会跨列重叠,而tkinter允许你把多个元素放在同一个grid单元格内,后放的元素会叠在先放的元素上方。
内容的提问来源于stack exchange,提问作者crackanddie
相关产品推荐
相关产品推荐

