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

