PyQT5类跨函数调用变量报错:AttributeError无data2属性
解决PyQt5中AttributeError: 'Ui_Dialog' object has no attribute 'data2'的问题
咱们一步步拆解你遇到的问题,主要有几个关键错误需要修复:
1. 变量名拼写错误(最致命的问题)
你在pandaGetValues函数里写的是self.variabelOne,但在selectFile中定义的变量是self.variableOne——少了一个字母a!这个拼写错误会导致pandaGetValues找不到文件路径,直接执行失败,自然也就不会创建self.data2属性,后续调用get_voltage时必然触发找不到data2的错误。
2. 函数执行顺序逻辑错误
self.data2是在pandaGetValues中生成的,但如果在调用get_voltage之前,你没有先执行selectFile(获取文件路径)和pandaGetValues(读取并处理Excel数据),self.data2根本就没被定义过,报错是必然的。必须严格保证执行顺序:
- 先调用
selectFile选择文件 - 再调用
pandaGetValues处理数据生成data2 - 最后才能调用
get_voltage使用data2
3. 未处理文件未选择的边界情况
如果用户打开文件选择对话框但未选择任何文件,self.variableOne就不会被赋值,此时调用pandaGetValues也会报错,需要添加判断逻辑避免这种情况。
修正后的完整代码示例
import pandas as pd import numpy as np from PyQt5.QtWidgets import QWidget, QFileDialog class Ui_Dialog(QWidget): def selectFile(self): options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName, _ = QFileDialog.getOpenFileName( self, "Open File", "", "All Files (*);;Excel Files (*.xlsx)", options=options ) if fileName: self.variableOne = fileName # 正确的变量名 print(self.variableOne) def pandaGetValues(self): # 先检查是否已获取文件路径 if hasattr(self, 'variableOne'): # 修正拼写错误:variabelOne -> variableOne self.df = pd.read_excel(self.variableOne, header=None) # 注意参数是小写header self.data = np.asarray(self.df) self.data2 = self.data[1:-1, :] else: print("请先调用selectFile选择文件!") def get_voltage(self, r, t): # 先检查data2是否已生成 if not hasattr(self, 'data2'): print("请先调用pandaGetValues处理数据!") return all_list = [] # 避免用all作为变量名,all是Python内置函数 data3 = self.data2 for i in range(1, len(data3[0]), 3): self.mm = [] times = [] self.times2 = [] self.header = self.data[0, i] firstnumber = 0 first_index = 0 self.temp = [] # 修正变量赋值逻辑:将查询结果赋值给m,而非直接用self.m m = np.where((data3[1:, i] >= r) & (data3[1:, i] <= t)) self.final = [] print(self.data[0, i]) self.mm = m[0] self.mm = np.asarray(self.mm) print(self.mm)
正确的调用顺序示例
在你的界面逻辑中,需要按以下顺序触发函数:
# 示例调用流程 ui = Ui_Dialog() ui.selectFile() # 第一步:选择文件 ui.pandaGetValues() # 第二步:处理数据生成data2 ui.get_voltage(1, 10) # 第三步:调用业务逻辑
另外还有个小细节:pd.read_excel的参数是小写的header,你之前写的大写Header也会触发警告或错误,已经一起修正了。
内容的提问来源于stack exchange,提问作者user2241397
相关产品推荐
相关产品推荐

