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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:06:00