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

Tkinter Treeview加载Excel数据后列宽及位置异常变化问题

问题:更新Treeview后列宽异常变化

我遇到的问题是更新Treeview对象后,列宽发生了变化。以下是编写的代码,不确定为何上传文件会改变表格的显示样式,尤其populate_treeview函数的代码与主函数中初始化Treeview的逻辑看起来一致。

代码实现

import tkinter as tk
from tkinter import ttk, filedialog
import pandas as pd


class EdibleTreeviewWithUpload(tk.Frame):

    def __init__(self, application, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        self.tree = ttk.Treeview(self, show='headings', selectmode='browse')
        self.tree.grid(row=0, column=0)

        self.open_button = tk.Button(self, text="Open File", command=self.open_file)
        self.open_button.grid(row=1, column=0)

    def open_file(self):
        file_path = filedialog.askopenfilename(filetypes=[
            ("Excel files", "*.xlsx *.xlsb *.xlsm"),
            ("CSV files", "*.csv")
        ])

        if file_path:
            if file_path.lower().endswith((".xlsx", ".xlsb", ".xlsm", ".csv")):
                df = pd.read_excel(file_path) if file_path.lower().endswith(
                    (".xlsx", ".xlsm", ".xlsb")) else pd.read_csv(file_path)
                self.clear_treeview()
                self.populate_treeview(df)

    def clear_treeview(self):
        for item in self.tree.get_children():
            self.tree.delete(item)

    def populate_treeview(self, df):
        columns = df.columns.tolist()

        self.tree["columns"] = columns
        for idx, col in enumerate(columns):
            self.tree.heading(f"#{idx+1}", text=col)
            self.tree.column(f"#{idx+1}", anchor=tk.CENTER, width=100)

        for index, row in df.iterrows():
            values = [str(row[col]) for col in columns]
            self.tree.insert("", "end", values=values)


if __name__ == "__main__":
    root = tk.Tk()
    root.title("Editable TreeView Table")

    tree = EdibleTreeviewWithUpload(root)
    tree.tree['columns'] = ('Name', 'Age', 'Occupation')

    tree.tree.heading('#1', text='Name')
    tree.tree.heading('#2', text='Age')
    tree.tree.heading('#3', text='Occupation')

    tree.tree.column('#1', anchor=tk.CENTER, width=100)
    tree.tree.column('#2', anchor=tk.CENTER, width=100)
    tree.tree.column('#3', anchor=tk.CENTER, width=100)

    # Sample data
    data = [
        ("John Doe", "30", "Engineer"),
        ("Jane Smith", "25", "Teacher"),
        ("Bob Johnson", "45", "Doctor"),
    ]

    for item in data:
        tree.tree.insert('', 'end', values=item)

    tree.grid(column=1, row=1)
    root.mainloop()

显示效果对比

  • 加载前:三列宽度均为100px,内容居中对齐,表格布局整齐统一
  • 加载后:列宽不再保持一致,部分列被压缩或拉伸,布局混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:26:05