如何解决Python Tkinter中Treeview超出父框架的问题?
解决Tkinter Treeview滚动条无效及内容超出窗口问题
我用Tkinter的Treeview组件结合openpyxl加载并展示Excel表格内容,但遇到两个问题:
- 当表格尺寸大于窗口时,Treeview会超出窗口范围,无法完整查看
- 尝试添加滚动条实现滚动查看,但滚动条始终不生效
以下是原测试代码:
from tkinter import * from tkinter import ttk import openpyxl file_name = "test1.xlsx" def open_excel(file_name): wb = openpyxl.load_workbook(file_name) sheet = wb.active list_values = list(sheet.values) bom_tree.delete(*bom_tree.get_children()) bom_tree["column"] = list(list_values[0]) for col in list_values[0]: bom_tree.column(col, stretch=NO, minwidth=25, width=200) bom_tree.heading(col, text=col) for val in list_values[1:]: # print(val) bom_tree.insert('', "end", values=val) root= Tk() root.title('test2') root.geometry("1000x600") #create treeview frame tree_frame= LabelFrame(root, text="tree frame" ,padx=50, pady=50, width=1000) tree_frame.pack(padx=20,pady=20) bom_tree = ttk.Treeview(tree_frame, show="headings", height=10) bom_tree.grid(row=0,column=0, padx=10) #scroll bars tree_scroll_vertical = ttk.Scrollbar(tree_frame, orient=VERTICAL, command=bom_tree.yview) tree_scroll_vertical.grid(row=0,column=1, sticky=NS) bom_tree.configure(yscrollcommand=tree_scroll_vertical.set) tree_scroll_horizontal = ttk.Scrollbar(tree_frame, orient=HORIZONTAL, command=bom_tree.xview) tree_scroll_horizontal.grid(row=1,column=0, sticky=EW) bom_tree.configure(xscrollcommand=tree_scroll_horizontal.set) open_excel(file_name) root.mainloop()
解决方案及修改后的代码
问题根源在于LabelFrame没有固定尺寸,内部组件会撑开框架导致滚动条无法触发,同时grid布局的拉伸规则配置缺失。修改后的代码如下:
from tkinter import * from tkinter import ttk import openpyxl file_name = "test1.xlsx" def open_excel(file_name): wb = openpyxl.load_workbook(file_name) sheet = wb.active list_values = list(sheet.values) bom_tree.delete(*bom_tree.get_children()) bom_tree["column"] = list(list_values[0]) for col in list_values[0]: # 调整列宽为适中值,避免过宽撑破框架 bom_tree.column(col, stretch=NO, minwidth=100, width=150) bom_tree.heading(col, text=col) for val in list_values[1:]: bom_tree.insert('', "end", values=val) root= Tk() root.title('test2') root.geometry("1000x600") # 配置root的grid布局,让tree_frame能随窗口拉伸 root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) # 创建treeview frame,改用grid布局(符合需求) tree_frame= LabelFrame(root, text="tree frame", padx=10, pady=10) tree_frame.grid(row=0, column=0, padx=20, pady=20, sticky=NSEW) # 固定tree_frame的内部尺寸,避免被组件撑开 tree_frame.grid_propagate(False) tree_frame.config(width=960, height=520) # 配置tree_frame内部的grid布局,让Treeview和滚动条填充空间 tree_frame.grid_rowconfigure(0, weight=1) tree_frame.grid_columnconfigure(0, weight=1) bom_tree = ttk.Treeview(tree_frame, show="headings", height=15) # 设置sticky让Treeview填充所在单元格 bom_tree.grid(row=0,column=0, sticky=NSEW, padx=5, pady=5) # 垂直滚动条 tree_scroll_vertical = ttk.Scrollbar(tree_frame, orient=VERTICAL, command=bom_tree.yview) tree_scroll_vertical.grid(row=0,column=1, sticky=NS) bom_tree.configure(yscrollcommand=tree_scroll_vertical.set) # 水平滚动条 tree_scroll_horizontal = ttk.Scrollbar(tree_frame, orient=HORIZONTAL, command=bom_tree.xview) tree_scroll_horizontal.grid(row=1,column=0, sticky=EW) bom_tree.configure(xscrollcommand=tree_scroll_horizontal.set) open_excel(file_name) root.mainloop()
关键修改说明
- 固定框架尺寸:给
tree_frame添加grid_propagate(False),阻止框架被内部组件撑开,确保滚动条在固定范围内生效 - 布局拉伸配置:给
root和tree_frame的grid行/列设置weight=1,让组件随窗口大小变化自动拉伸填充 - 组件填充设置:给Treeview添加
sticky=NSEW,使其填充所在单元格的可用空间 - 列宽调整:适当缩小列宽,避免单列过宽导致横向滚动异常
内容的提问来源于stack exchange,提问作者dharmikP
相关产品推荐
相关产品推荐

