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
相关产品推荐
相关产品推荐

