Tkinter中如何让Treeview滚动条固定显示(不受窗口大小影响)
解决Tkinter Treeview滚动条固定附着问题
你的代码存在布局逻辑问题,导致滚动条仅在窗口最大化时才显示,以下是修复方案:
核心问题分析
- 用
Label作为Treeview的容器控件不合适,Label并非为承载复杂布局设计,应替换为Frame。 LabelFrame未设置随窗口拉伸的属性,容器空间无法自适应窗口大小。- Treeview未配置填充和扩展属性,无法占满可用空间,滚动条自然无法正确附着。
- 未设置Treeview的水平滚动联动命令。
修改后的完整代码
import tkinter as tk from tkinter import ttk def mainGUI(): root = tk.Tk() root.geometry("700x300") root.title("test") # 配置根窗口行列权重,让第0列和第1行随窗口拉伸 root.columnconfigure(0, weight=1) root.rowconfigure(1, weight=1) data = [["this is a long text","this is a long text","this is a long text","this is a long text","this is a long text","this is a long text"] for _ in range(14)] results_lf = ttk.LabelFrame(root, text="Results:") # 设置sticky让LabelFrame填满分配的空间 results_lf.grid(row=1, column=0, padx=20, pady=0, sticky='nsew') # 配置LabelFrame的行列权重 results_lf.columnconfigure(0, weight=1) results_lf.rowconfigure(0, weight=1) # 用Frame代替Label作为容器 results_frame = ttk.Frame(results_lf) results_frame.grid(row=0, column=0, sticky='nsew') columnsHeader = ["1", "2", "3", "4", "5", "6"] tree = ttk.Treeview(results_frame, columns=columnsHeader, show='headings') for col in columnsHeader: tree.heading(col, text=col) # 可选:设置列宽,也可根据需求调整为自动适配 tree.column(col, width=150) for line in data: tree.insert('', tk.END, values=line) # Treeview填充整个Frame空间并随窗口扩展 tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) sb_v = ttk.Scrollbar(results_frame, orient=tk.VERTICAL, command=tree.yview) sb_v.pack(side=tk.RIGHT, fill=tk.Y) sb_h = ttk.Scrollbar(results_frame, orient=tk.HORIZONTAL, command=tree.xview) sb_h.pack(side=tk.BOTTOM, fill=tk.X) # 配置Treeview与滚动条的双向联动 tree.config(yscrollcommand=sb_v.set, xscrollcommand=sb_h.set) root.mainloop() mainGUI()
关键修改点
- 把
resultsLabel替换为ttk.Frame,作为Treeview和滚动条的容器,确保布局逻辑正确。 - 给根窗口和
LabelFrame添加行列权重配置,让容器能随窗口大小自动拉伸。 - Treeview的
pack参数设置为fill=tk.BOTH, expand=True,使其占满容器空间。 - 补充Treeview的
xscrollcommand配置,实现水平滚动的双向联动。
内容的提问来源于stack exchange,提问作者gvd
相关产品推荐
相关产品推荐

