问题分析和解决方案
根据你描述的代码和报错信息,问题的核心在于`except Exception as e`并没有被触发,原因可能有以下几种:
- 1. 初始化的问题
`AttributeError: 'MinuteK' object has no attribute 'df_minute'`表明代码在调用`self.df_minute`时,`self.df_minute`尚未初始化,导致程序直接报错,而没有进入`try-except`块。这可能是因为`paintEvent`方法在调用时,`self.df_minute`未被正确赋值。 - 2. 异常未发生在`try-except`块内
异常实际发生的位置并不在`try`块内,因此不会触发`except Exception as e`,所以打印`'a'`的语句也没有执行。 - 3. 界面刷新逻辑问题
`paintEvent`方法是由PyQt框架回调的,而不是用户主动调用的。若该方法依赖于`self.df_minute`,但在调用前`update_date_zs_minute_jhjj`方法未正确初始化数据,也会导致报错。
代码改进建议
为了解决这个问题,可以采取以下措施:
- 1. 初始化`self.df_minute`和其他可能未定义的变量
为避免属性在未定义的情况下被使用,可以在类的`__init__`方法中初始化这些属性。 - 2. 确认异常来源
通过在`try`块中添加更多日志,确认哪个代码部分可能引发异常。 - 3. 确保`paintEvent`方法调用前,数据已被正确加载
在调用绘图逻辑时,添加属性检查,确保所有依赖的数据都已正确初始化。
修改后的代码示例
以下是改进后的代码:
class MinuteK:
def __init__(self, ...):
# 初始化必要变量,避免未定义错误
self.df_minute = None
self.df_jhjj = None
def update_date_zs_minute_jhjj(self, index):
self.date = DF_DATE_LIST
self.ZS = self.date_zs
self.setWindowTitle(f'{self.name} {rs.date_zh(self.date)}')
try:
# 加载CSV文件
self.df_minute = pd.read_csv(f"D:/stock/minute/{self.code}/{self.date}.csv", encoding=de).values.tolist()
self.df_jhjj = pd.read_csv(f"D:/stock/jhjj/{self.code}/{self.date}.csv", encoding=de).values.tolist()
except Exception as e:
print(f"异常发生: {e}")
self.df_minute = rs.tdx_history_trade(self.code, self.date)
print(self.df_minute)
self.df_jhjj = self.df_minute
del self.df_minute
def paintEvent(self, event):
if not hasattr(self, 'df_minute') or self.df_minute is None:
print("绘图依赖的数据尚未加载")
return
# 继续绘图逻辑...
代码关键点解释
- 在`__init__`中初始化`self.df_minute`和`self.df_jhjj`为`None`,避免在未定义时直接使用。
- 在`paintEvent`中进行数据检查,确保绘图所依赖的数据已被正确加载。
- 在`try-except`块中增加日志,捕获和定位异常来源。
尝试上述修改后,如果还有问题,可以进一步提供上下文信息。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |