如何为Tkinter TreeView添加水平滚动条且不覆盖表格最后一行
给Tkinter TreeView添加底部水平滚动条的解决方案
先修正你代码里的几个错误,再实现底部水平滚动条的布局:
- 变量名拼写错误:
verticalscrollba应改为verticalscrollbar,verscrlbar是未定义变量,需统一为verticalscrollbar - 垂直滚动条的布局参数错误,应设置
sticky='ns'让它垂直贴合TreeView右侧 - 给父容器
right_frame配置grid权重,确保TreeView和滚动条能随窗口自适应 - 添加水平滚动条,并将其布局在TreeView的下一行(
row=2),实现底部放置效果
修改后的完整代码:
import tkinter from tkinter import ttk # 补充原代码缺失的ttk导入 def __create_tree_view(self): """ 创建带指定表头的TreeView布局 """ style = ttk.Style() # 修正原代码里的`it`为`ttk` style.configure("Custom.Treeview.Heading", foreground="green", relief="flat") style.map("Custom.Treeview.Heading", relief=[('active','groove'),('pressed','sunken')]) style.configure('Treeview', rowheight=20) # 配置父容器grid权重,让TreeView区域自适应窗口大小 self.right_frame.grid_rowconfigure(1, weight=1) self.right_frame.grid_columnconfigure(1, weight=1) self.tree_view = ttk.Treeview(self.right_frame, selectmode='browse', style="Custom.Treeview") self.tree_view.grid(row=1, column=1, sticky=tk.NSEW) # 修正垂直滚动条:变量名+布局+绑定逻辑 self.verticalscrollbar = ttk.Scrollbar(self.right_frame, orient="vertical", command=self.tree_view.yview) self.verticalscrollbar.grid(row=1, column=2, sticky='ns') self.tree_view.configure(yscrollcommand=self.verticalscrollbar.set) # 添加底部水平滚动条 self.horizontalscrollbar = ttk.Scrollbar(self.right_frame, orient="horizontal", command=self.tree_view.xview) self.horizontalscrollbar.grid(row=2, column=1, sticky='ew') self.tree_view.configure(xscrollcommand=self.horizontalscrollbar.set) # 定义列与表头 self.tree_view["columns"] = ("1", "2", "3", "4") self.tree_view['show'] = 'headings' # 修正列宽设置的语法错误,并替换为中文表头文本 self.tree_view.column("1", width=int(self.window_width/5), anchor='center', stretch=False) self.tree_view.column("2", width=int(self.window_width/4)-30, anchor='center', stretch=False) self.tree_view.column("3", width=int(self.window_width/6)-30, anchor='center', stretch=False) self.tree_view.column("4", width=int(self.window_width/3), anchor='center', stretch=False) self.tree_view.heading("1", text="设备品牌/型号/类型") self.tree_view.heading("2", text="设备ID") self.tree_view.heading("3", text="设备IP地址") self.tree_view.heading("4", text="GUID")
关键说明:
- 水平滚动条通过
row=2布局在TreeView下方,sticky='ew'让它横向铺满父容器对应列 - 垂直滚动条调整到
column=2,避免和TreeView内容区域重叠 - 给
right_frame的行1和列1设置weight=1,确保TreeView占满可用空间,滚动条对齐正确 - 修正了原代码里的语法错误(如anchor参数引号缺失、
view改为yview)
内容的提问来源于stack exchange,提问作者Charusheela M
相关产品推荐
相关产品推荐

