TK界面第二页TreeView列调整大小功能失效问题求助
解决Tkinter多页面中TreeView列无法调整大小的问题
我来帮你搞定这个问题!你遇到的核心问题是容器布局的权重配置缺失——TreeView所在的各级父容器没有设置拉伸权重,导致TreeView无法随着窗口大小变化,列调整功能自然就失效了。
问题根源
你现在只给主窗口(controller)设置了columnconfigure和rowconfigure,但TreeView的层级是:SampleApp → container → PageOne → frame_tree → TreeView。后面这几个容器(PageOne、frame_tree)都没有配置权重,当窗口调整时,它们不会跟着拉伸,TreeView也就没有足够的空间来响应列调整操作。另外,你给TreeView设置grid()的时候没加sticky参数,它不会填满父容器frame_tree,这也会影响列调整的效果。
修复步骤
- 给
PageOne的grid布局设置权重,让它能填满父容器container - 给
frame_tree的grid布局设置权重,让它能填满PageOne - 给TreeView的
grid()添加sticky="nsew",让它填满frame_tree - 给
frame_tree设置rowconfigure和columnconfigure,让TreeView能在其中拉伸
修改后的完整代码
import tkinter as tk from tkinter import ttk import tkfont # 补充原代码遗漏的导入 class SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") container = tk.Frame(self) container.grid(sticky="nsew") # 让container填满主窗口 container.grid_rowconfigure(0, weight=1) container.grid_columnconfigure(0, weight=1) self.frames = {} for F in (StartPage, PageOne): page_name = F.__name__ frame = F(parent=container, controller=self) self.frames[page_name] = frame frame.grid(row=0, column=0, sticky="nsew") self.show_frame("StartPage") def show_frame(self, page_name): '''Show a frame for the given page name''' frame = self.frames[page_name] frame.tkraise() class StartPage(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller button1 = tk.Button(self, text="Go to Database", command=lambda: controller.show_frame("PageOne")) button1.grid(padx=20, pady=20) # 增加内边距提升美观度 class PageOne(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller # 让PageOne填满父容器 self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) # Tree View容器 frame_tree = tk.LabelFrame(self, text="Database") frame_tree.grid(row=0, column=0, sticky="nsew", padx=10, pady=10) # 让frame_tree填满PageOne frame_tree.grid_rowconfigure(0, weight=1) frame_tree.grid_columnconfigure(0, weight=1) tree_columns = ('zero','one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen' ) tree = ttk.Treeview(frame_tree, columns=tree_columns, show="headings", height=18) # 循环设置表头,替代重复代码 for col_idx, col_name in enumerate(tree_columns, start=1): tree.heading(f'#{col_idx}', text=f'COLUMN {col_idx}') tree.column(f'#{col_idx}', width=100) # 设置初始列宽 # 让TreeView填满frame_tree并支持拉伸 tree.grid(row=0, column=0, sticky="nsew") if __name__ == "__main__": app = SampleApp() app.geometry("1200x600") # 设置初始窗口尺寸 app.mainloop()
关键修改点说明
- 给
PageOne添加了权重配置,确保它能跟着父容器container拉伸 - 给
frame_tree设置了sticky="nsew"和权重配置,让它填满PageOne并给TreeView留出拉伸空间 - TreeView的
grid()加上sticky="nsew",让它完全填充frame_tree - 用循环简化了表头设置代码,同时给列添加了初始宽度
- 修复了原代码遗漏的
tkfont导入问题
现在切换到第二页后,TreeView的列就能正常调整大小了,整个布局也会跟着窗口大小自适应拉伸。
内容的提问来源于stack exchange,提问作者Gizmo




