Paned Window中带滚动条的Treeview无法随窗口调整大小问题
解决PanedWindow中带滚动条Treeview的自适应问题
我明白你遇到的麻烦了——要么滚动条显示不正常,要么Treeview没法跟着PanedWindow的调整一起改变尺寸。这其实是因为你没把Treeview和滚动条作为一个整体容器交给PanedWindow管理,或者虽然用了Frame但没配置好布局的权重规则。
下面是修正后的完整实现思路和代码:
核心解决思路
- 用一个单独的
Frame包裹Treeview和滚动条,让它们成为一个不可分割的整体 - 给这个Frame内部的grid布局设置行和列的权重,确保Treeview能占满Frame的可用空间,滚动条保持垂直拉伸
- 把这个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
相关产品推荐
相关产品推荐

