You need to enable JavaScript to run this app. tkinter中TablePage类使用grid布局时两个Frame出现重叠是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:06:06