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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:51:17