PyQt5项目中类方法间无全局变量传递Dataframe的问题咨询
问题修复方案
核心错误原因
- 信号
connect绑定逻辑错误:connect()方法需要传入可调用对象,你直接写self.refresh_labels(self.df_data)会立即执行函数,返回值None被绑定到信号,同时self.pushButton_2.clicked.connect的返回值也是None,你把它赋值给self.df_data,导致初始self.df_data根本不是DataFrame类型 - 未正确使用类实例属性存储DataFrame:你要实现不用全局变量传值,直接把DataFrame存为类的实例属性
self.df_data即可,各个方法直接读写这个属性就行 loadcsv方法里file_data变量未定义就调用append方法,会直接抛出变量不存在的错误- QTimer的timeout信号绑定的可调用对象不需要额外传参,直接在
refresh_labels里读实例属性self.df_data即可
修复后完整代码
import sys from PyQt5 import QtWidgets, uic from PyQt5.QtWidgets import * from PyQt5.QtCore import QTimer import pandas as pd class UI(QMainWindow): def __init__(self): super(UI, self).__init__() uic.loadUi("gui.ui", self) # 初始化实例属性存储DataFrame,初始为空 self.df_data = pd.DataFrame() # 绑定按钮点击信号 self.pushButton_2.clicked.connect(self.loadcsv) self.pushButton.clicked.connect(self.stop_app) self.label.setText('') # 初始化刷新定时器,绑定刷新方法 self.__timer = QTimer() self.__timer.timeout.connect(self.refresh_labels) self.__timer.start(1000) self.show() def loadcsv(self): filename = 'c://test/test.csv' try: df = pd.read_csv(filename) # 直接更新实例属性的DataFrame,用concat替代已废弃的append方法 self.df_data = pd.concat([self.df_data, df], ignore_index=True) except: pass def refresh_labels(self): # 只有DataFrame不为空的时候才更新标签 if not self.df_data.empty: text_label = str(self.df_data.dtypes) self.label.setText(text_label) def stop_app(self): if QMessageBox.question(self, "Exit", "Close Program") != QMessageBox.No: qApp.quit() if __name__ == '__main__': app = QApplication(sys.argv) window = UI() app.exec_()
补充说明
- 废弃了原来不必要的全局变量
df_data和text_label,所有状态都存在类实例属性里,符合你的需求 - 新增了读取文件的异常捕获,避免文件不存在等问题直接导致程序崩溃
refresh_labels里加了非空判断,符合你“DataFrame为空时不更新标签”的要求
内容的提问来源于stack exchange,提问作者Zoner
相关产品推荐
相关产品推荐

