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

Python健身追踪器开发报错求助:AttributeError及Excel读写问题

问题排查与修复方案

1. 解决 AttributeError: 'function' object has no attribute 'read_excel'

这个错误的核心是**pd 没有正确指向 pandas 库**,或者导入逻辑出了问题:

  • 先在代码开头补全正确的导入语句:
    import pandas as pd
    
  • 检查代码里有没有把 pd 当成变量或函数名用,比如如果有 def pd(): ... 这种代码,必须改名。
  • 另外 read_excel 需要依赖读写引擎,安装 openpyxl 适配 .xlsx 文件:
    pip install openpyxl
    

2. 修复 Excel 保存与导入失败问题

你的代码存在多个功能失效点,逐一修复如下:

(1)界面输入控件绑定错误

你创建了 Entry 但没放到界面上,还混用了 Combobox 和 Entry,导致根本拿不到用户输入:

  • 比如 entry2 = tk.Entry(windows) 后没调用 .place(),用户看不到输入框,get() 永远是空值。
  • 月份、用户选择直接用 Combobox 的 get() 就行,不用额外建 Entry。

修改示例(以月份选择为例):

# Combobox Mese
label2 = Label(windows, text="Mese").place(x=110, y=60)
# 先创建对象再单独调用place(),否则后续无法获取值
combobox_mese = Combobox(windows, values=['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno','Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'])
combobox_mese.place(x=200, y=60)
# 删掉没用的entry2 = tk.Entry(windows)

后续在 save() 里拿值:mese = combobox_mese.get()

身高、体重这类输入项,直接用 Entry 并正确放置:

label3 = Label(windows, text="Altezza").place(x=110, y=90)
entry3 = tk.Entry(windows, width=17)
entry3.place(x=200, y=90)
# 删掉没用的textbox1 = Text(...)

(2)Excel 文件路径不一致

save() 里保存用的是绝对路径,读取时却用相对路径,导致找不到文件。统一用绝对路径:

# 先定义常量存路径
TRACK_FILE = r'C:\Users\lricci\Desktop\SERVER\web\Gym Tracker\Gym Tracker v1.0\track.xlsx'
TRACKN_FILE = r'C:\Users\lricci\Desktop\SERVER\web\Gym Tracker\Gym Tracker v1.0\trackn.xlsx'

# 保存时
wb.save(TRACK_FILE)
# 读取时
file1 = pd.read_excel(TRACK_FILE)

(3)处理 trackn.xlsx 不存在的情况

如果这个文件不存在,pd.read_excel 会直接报错,先判断文件是否存在:

import os

def save():
    # ... 其他代码 ...
    file1 = pd.read_excel(TRACK_FILE)
    # 判断文件是否存在再读取
    if os.path.exists(TRACKN_FILE):
        file2 = pd.read_excel(TRACKN_FILE)
        all_data = pd.concat([file1, file2])
    else:
        all_data = file1
    all_data.to_excel(TRACK_FILE, index=False)

(4)简化 Excel 保存逻辑

你同时用了 openpyxl.Workbook 和 pandas,逻辑冗余,直接用 pandas 更简洁:

def save():
    mese = combobox_mese.get()
    altezza = entry3.get()
    peso = entry4.get()
    mmagra = entry5.get()
    mgrassa = entry6.get()
    utente = combobox_utente.get()

    # 用DataFrame存新数据
    new_data = pd.DataFrame({
        "Mese": [mese],
        "Altezza": [altezza],
        "Peso": [peso],
        "Massa Magra": [mmagra],
        "Massa Grassa": [mgrassa],
        "Utente": [utente]
    })

    # 合并已有数据(如果存在)
    if os.path.exists(TRACK_FILE):
        existing_data = pd.read_excel(TRACK_FILE)
        all_data = pd.concat([existing_data, new_data], ignore_index=True)
    else:
        all_data = new_data

    # 保存文件
    all_data.to_excel(TRACK_FILE, index=False, engine='openpyxl')
    showinfo("Salvataggio", "Dati salvati con successo!")  # 补个成功提示

3. 给 Excel 加图表页的思路

用 pandas 结合 openpyxl 实现,示例代码:

from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference

def add_chart():
    # 加载已有的Excel文件
    wb = load_workbook(TRACK_FILE)
    # 新建图表工作表
    ws_chart = wb.create_sheet("Grafici")
    
    # 获取数据工作表
    ws_data = wb.active
    # 创建体重变化柱状图
    chart = BarChart()
    chart.title = "Andamento Peso"
    chart.x_axis.title = "Mese"
    chart.y_axis.title = "Peso"
    
    # 引用数据(假设体重在C列,从第2行开始)
    data = Reference(ws_data, min_col=3, min_row=1, max_row=ws_data.max_row, max_col=3)
    categories = Reference(ws_data, min_col=1, min_row=2, max_row=ws_data.max_row)
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(categories)
    
    # 把图表加到工作表里
    ws_chart.add_chart(chart, "A1")
    # 保存文件
    wb.save(TRACK_FILE)

可以在 save() 函数最后调用这个函数,实现保存数据后自动生成图表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:45:40