如何让ttk.Treeview行铺满控件全部可用高度?
Treeview控件底部空白问题解决方案
问题说明
Treeview设置sticky="news"后,窗口调整时控件会自动伸缩,但当控件高度无法容纳完整一行时,底部会残留空白区域。希望实现类似Listbox的效果,让行始终铺满Treeview的全部高度,已尝试调整rowheight参数但无效。
解决思路
通过监听Treeview的大小变化事件,动态调整行高(rowheight)或可见行数,让可见区域刚好被行填满。
方案一:动态调整行高
这种方式会根据控件高度自动调整每行的高度,确保所有可见行的总高度匹配控件高度。
- 绑定大小变化事件
在Treeview初始化代码后添加事件绑定:
self.colorTreeView.bind("<Configure>", self.adjust_row_height)
- 实现行高调整方法
在你的类中添加以下方法:
def adjust_row_height(self, event): # 获取Treeview实际可用高度,减去边框宽度(根据你的样式微调) total_height = event.widget.winfo_height() - 2 # 获取当前设置的可见行数 visible_rows = self.colorTreeView.cget("height") if visible_rows <= 0: return # 计算每行应有的高度,取整避免小数 new_rowheight = total_height // visible_rows # 可选:设置最小行高,防止行高过小 new_rowheight = max(new_rowheight, 20) # 更新样式中的行高 style = ttk.Style() style.configure("DARK_THEME.Treeview", rowheight=new_rowheight) # 强制刷新控件 self.colorTreeView.update_idletasks()
方案二:动态调整可见行数
如果希望保持行高固定,可通过计算控件高度能容纳的完整行数,动态修改Treeview的height属性:
- 绑定事件
self.colorTreeView.bind("<Configure>", self.adjust_visible_rows)
- 实现行数调整方法
def adjust_visible_rows(self, event): # 获取当前样式中的行高 row_height = ttk.Style().lookup("DARK_THEME.Treeview", "rowheight") row_height = int(row_height) if row_height else 20 # 计算可用高度 total_height = event.widget.winfo_height() - 2 if row_height <= 0: return # 计算可容纳的完整行数 new_height = total_height // row_height new_height = max(new_height, 1) # 确保至少显示1行 # 更新Treeview的可见行数 self.colorTreeView.configure(height=new_height)
代码整合示例
修改后的Treeview初始化代码:
self.colorTreeView = ttk.Treeview(self.colorListSubFrame, columns=['savedColors'], show='tree', selectmode=tk.BROWSE, style="DARK_THEME.Treeview", height=11) self.colorTreeView.heading("savedColors", text="Colors", anchor="nw") self.colorTreeView.column("savedColors", width=10, anchor='center', stretch=True) self.colorTreeView.grid(column=0, row=0, sticky="news", padx=5, pady=12) # 选择其中一种方案绑定事件 self.colorTreeView.bind("<Configure>", self.adjust_row_height) # self.colorTreeView.bind("<Configure>", self.adjust_visible_rows)
内容的提问来源于stack exchange,提问作者DWK
相关产品推荐
相关产品推荐

