VS Studio中openpyxl读取Excel元组不显示及GUI列标题缺失问题
问题:Excel数据未在Tkinter Treeview中显示,列标题缺失
- 开发程序时,GUI正常显示,也能通过界面向Excel文件添加新条目,但从xlsx读取的元组无法在Treeview中展示
- Treeview的列标题缺失
我的代码:
import tkinter as tk from tkinter import ttk import openpyxl def load_data(): path = 'C:/Python exercises/people/people.xlsx' workbook = openpyxl.load_workbook(path) sheet = workbook.active list_values = list(sheet.values) print(list_values) for col_name in list_values[0]: treeview.heading(col_name, text=col_name) for value_tuple in list_values[1:]: treeview.insert('', tk.END, values=value_tuple) def insert_row(): name = name_entry.get() age = int(age_spinbox.get()) subscription_status = status_combobox.get() employment_status = 'Employed' if a.get() else 'Unemployed' print(name, age, subscription_status, employment_status) path = 'C:/Python exercises/people/people.xlsx' workbook = openpyxl.load_workbook(path) sheet = workbook.active row_values = [name, age, subscription_status, employment_status] sheet.append(row_values) workbook.save(path) treeview.insert('', tk.END, values=row_values) name_entry.delete(0, 'end') name_entry.insert(0, 'Name') age_spinbox.delete(0, 'end') age_spinbox.insert(0, 'Age') status_combobox.set(combo_list[0]) checkbutton.state(['selected']) def toggle_mode(): if mode_switch.instate(['selected']): style.theme_use('forest-light') else: style.theme_use('forest-dark') root = tk.Tk() style = ttk.Style(root) root.tk.call('source', 'forest-light.tcl') root.tk.call('source', 'forest-dark.tcl') style.theme_use('forest-dark') combo_list = ['Subscribed', 'Not Subscribed', 'Other'] frame = ttk.Frame(root) frame.pack() widgets_frame = ttk.LabelFrame(frame, text='Insert Row') widgets_frame.grid(row=0, column=0, padx=20, pady=10) name_entry = ttk.Entry(widgets_frame) name_entry.insert(0, 'Name') name_entry.bind('<FocusIn>', lambda e: name_entry.delete('0', 'end')) name_entry.grid(row=0, column=0, padx=5, pady = (0, 5), sticky='ew') age_spinbox = ttk.Spinbox(widgets_frame, from_=18, to=100) age_spinbox.insert(0, 'Age') age_spinbox.grid(row=1, column=0, padx=5, pady=5, sticky='ew') status_combobox = ttk.Combobox(widgets_frame, values=combo_list) status_combobox.current(0) status_combobox.grid(row=2, column=0, padx=5, pady=5, sticky='ew') a = tk.BooleanVar() checkbutton = ttk.Checkbutton(widgets_frame, text='Employed', variable=a) checkbutton.grid(row=3, column=0, padx=5, pady=5, sticky='nsew') button = ttk.Button(widgets_frame, text='Insert', command=insert_row) button.grid(row=4, column=0, padx=5, pady=5, sticky='nsew') separator = ttk.Separator(widgets_frame) separator.grid(row=5, column=0, padx=(20, 10), pady=10, sticky='ew') mode_switch = ttk.Checkbutton(widgets_frame, text='Mode', style='Switch', command=toggle_mode) mode_switch.grid(row=6, column=0, padx=5, pady=10, sticky='nsew') treeFrame = ttk.Frame(frame) treeFrame.grid(row=0, column=1, pady=10) treeScroll = ttk.Scrollbar(treeFrame) treeScroll.pack(side='right', fill='y') cols = ('Name', 'Age', 'Subscription', 'Employment') treeview = ttk.Treeview(treeFrame, show='headings', yscrollcommand=treeScroll.set, columns=cols, height=13) treeview.column('Name', width=100) treeview.column('Age', width=50) treeview.column('Subscription', width=100) treeview.column('Employment', width=100) treeview.pack() treeScroll.config(command=treeview.yview) root.mainloop()
解决方法
核心问题是你定义了load_data()函数,但从未调用它,导致Excel数据没加载到Treeview,列标题也没设置。
在代码末尾root.mainloop()之前,添加一行调用:
load_data()
修改后的末尾代码片段:
treeScroll.config(command=treeview.yview) # 新增:调用加载数据的函数 load_data() root.mainloop()
另外要确保Excel文件的表头(第一行)内容和Treeview定义的列名('Name', 'Age', 'Subscription', 'Employment')完全一致,避免数据匹配异常。
内容的提问来源于stack exchange,提问作者Frjoap
相关产品推荐
相关产品推荐

