如何使包含两个ttk Treeview的ttk Notebook填充指定网格单元格?
嘿,我之前也踩过ttk.Notebook+grid布局的坑,咱们来一步步把这个布局混乱的问题捋明白!
问题根源分析
单个Treeview能正常显示,一放进Notebook就乱,核心原因几乎都是布局权重(weight)和拉伸属性(sticky)没设置到位。单个组件时,父容器的空间分配刚好适配,但多了标签页后,布局管理器不知道该怎么给每个层级的组件分配空间,就会出现挤压、留白或者组件乱跑的情况。
解决步骤(附可运行代码)
下面是经过验证的修复方案,你可以直接替换自己的代码逻辑:
- 确保每个层级的容器都能随窗口拉伸:从root到main框架、section框架、Notebook、标签页内的Labelframe,每一层都要设置
sticky="nsew"(让组件上下左右填满父容器),同时给对应的行/列设置weight=1(告诉布局管理器这个行/列要优先分配空间)。 - 复用Treeview创建逻辑:避免重复写相同代码,减少出错概率。
import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("Treeview Notebook 布局修复") root.geometry("800x600") # 1. 主框架配置 main_frame = ttk.Frame(root) main_frame.grid(row=0, column=0, sticky="nsew") root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) # 2. 分区框架配置 section_frame = ttk.Frame(main_frame) section_frame.grid(row=0, column=0, sticky="nsew") main_frame.grid_rowconfigure(0, weight=1) main_frame.grid_columnconfigure(0, weight=1) # 3. Notebook核心配置 notebook = ttk.Notebook(section_frame) notebook.grid(row=0, column=0, sticky="nsew") # 关键:让Notebook占满section_frame的全部空间 section_frame.grid_rowconfigure(0, weight=1) section_frame.grid_columnconfigure(0, weight=1) # 4. 封装Treeview创建函数,避免重复代码 def build_treeview_container(parent): # 创建带标签的容器 labelframe = ttk.Labelframe(parent, text="数据列表") # 初始化Treeview tree = ttk.Treeview(labelframe, columns=("列1", "列2", "列3"), show="headings") # 设置表头和列宽 tree.heading("列1", text="ID") tree.heading("列2", text="名称") tree.heading("列3", text="状态") tree.column("列1", width=100) tree.column("列2", width=200) tree.column("列3", width=150) # 填充测试数据 for idx in range(10): tree.insert("", tk.END, values=(f"NO.{idx+1}", f"项目{idx+1}", "正常")) # 让Treeview占满Labelframe tree.grid(row=0, column=0, sticky="nsew") labelframe.grid_rowconfigure(0, weight=1) labelframe.grid_columnconfigure(0, weight=1) return labelframe # 5. 创建两个Treeview容器并添加到Notebook tree_container1 = build_treeview_container(notebook) tree_container2 = build_treeview_container(notebook) notebook.add(tree_container1, text="表格A") notebook.add(tree_container2, text="表格B") root.mainloop()
关键注意点
- 不要漏掉任何一层的
sticky="nsew"和行/列权重设置,哪怕是最内层的Labelframe也要配置。 - 如果你的Treeview有滚动条,记得把滚动条和Treeview放在同一个容器里,同样设置好grid的sticky和权重。
内容的提问来源于stack exchange,提问作者z33k
相关产品推荐
相关产品推荐

