You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Paned Window中带滚动条的Treeview无法随窗口调整大小问题

解决PanedWindow中带滚动条Treeview的自适应问题

我明白你遇到的麻烦了——要么滚动条显示不正常,要么Treeview没法跟着PanedWindow的调整一起改变尺寸。这其实是因为你没把Treeview和滚动条作为一个整体容器交给PanedWindow管理,或者虽然用了Frame但没配置好布局的权重规则。

下面是修正后的完整实现思路和代码:

核心解决思路

  1. 用一个单独的Frame包裹Treeview和滚动条,让它们成为一个不可分割的整体
  2. 给这个Frame内部的grid布局设置行和列的权重,确保Treeview能占满Frame的可用空间,滚动条保持垂直拉伸
  3. 把这个Frame添加到PanedWindow中,而不是直接加Treeview

修正后的代码片段

import tkinter as tk
from tkinter import ttk
from tkinter.scrolledtext import ScrolledText

# 假设这是你的类内部代码,比如继承自tk.Frame或tk.Tk
class YourApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("PanedWindow with Treeview")
        
        # set paned Windows layout, main stacked horizontally, left stacked vertically
        self.pwMain = PanedWindow(orient=tk.HORIZONTAL)
        self.pwMain.grid(sticky=tk.NSEW)
        # 给主窗口设置grid权重,让pwMain能占满整个窗口
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.pwLeft = PanedWindow(orient=tk.VERTICAL)
        self.pwMain.add(self.pwLeft)  # 补上之前缺失的:把左侧面板加入主分割窗口

        # set editorText
        self.editorText = ScrolledText(self, wrap=tk.WORD, undo=True, relief=tk.FLAT)
        self.pwLeft.add(self.editorText)

        # set AutoCompleteList Tree - 重点修改部分
        self.style = ttk.Style()
        # remove borders from TreeView
        self.style.layout("Treeview", [('Treeview.treearea', {'sticky': 'nswe'})])

        # 1. 创建包裹Treeview和滚动条的Frame
        self.tree_frame = tk.Frame(self)
        # 2. 配置Frame的grid权重:第0行第0列占满所有可用空间
        self.tree_frame.grid_rowconfigure(0, weight=1)
        self.tree_frame.grid_columnconfigure(0, weight=1)

        # 3. 创建Treeview并放到Frame里
        self.autoCompleteList = ttk.Treeview(
            self.tree_frame, 
            columns=("#1", "#2"), 
            show=["headings"], 
            selectmode='browse'
        )
        self.autoCompleteList.heading('#1', text='Record Name')
        self.autoCompleteList.heading('#2', text='Record ID')
        # 设置列拉伸属性
        self.autoCompleteList.column('#1', stretch=tk.YES)
        self.autoCompleteList.column('#2', stretch=tk.YES)
        self.autoCompleteList.grid(row=0, column=0, sticky=tk.NSEW)

        # 4. 创建滚动条并放到Frame里
        self.aclvbar = ttk.Scrollbar(
            self.tree_frame, 
            orient=tk.VERTICAL, 
            command=self.autoCompleteList.yview
        )
        self.autoCompleteList.configure(yscrollcommand=self.aclvbar.set)
        self.aclvbar.grid(row=0, column=1, sticky='ns')

        # 5. 把整个Frame加到左侧分割窗口中
        self.pwLeft.add(self.tree_frame)

        # 测试数据:给Treeview加几条内容
        for i in range(20):
            self.autoCompleteList.insert("", "end", values=(f"Record {i}", f"ID-{i:03d}"))

if __name__ == "__main__":
    app = YourApp()
    app.mainloop()

关键细节说明

  • 你之前的代码里没把pwLeft加到pwMain里,这会导致左侧面板根本不会显示在主分割窗口中,记得补上self.pwMain.add(self.pwLeft)
  • 给父容器(比如主窗口)设置grid_rowconfigure和grid_columnconfigure的weight=1,确保PanedWindow能占满整个窗口空间
  • 包裹Treeview的Frame必须配置行和列的权重,这样内部的Treeview才能跟着Frame的尺寸变化而拉伸
  • 滚动条的sticky='ns'确保它只会垂直拉伸,不会水平占用多余空间

这样调整后,拖动PanedWindow的滑块时,整个Treeview容器会跟着调整尺寸,滚动条也能始终保持在Treeview右侧正常显示。

内容的提问来源于stack exchange,提问作者Eeg Oberije

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:03:13