如何在PyQt5中将pandas dataframe从主类传递到自定义类
解决PyQt5主窗口向子组件传递Pandas DataFrame的方案
你只需要修改3处核心逻辑即可实现数据传递,具体修改如下:
1. 修改MyApp类,新增存储数据的实例属性
在MyApp的初始化方法中新增input_df属性用于接收外部传入的DataFrame,同时优化计算方法的空值校验:
class MyApp(QWidget): def __init__(self): super().__init__() # 新增属性,用于存储传入的DataFrame,初始为None self.input_df = None # Creates layout object self.layout = QHBoxLayout() # Create push buttons self.buttonCalc = QPushButton('Calculate') self.layout.addWidget(self.buttonCalc) self.setLayout(self.layout) # 补充设置布局,避免组件不显示 # Connect button to function self.buttonCalc.clicked.connect(self.calculate) def displayInfo(self): self.show() # Create a Model to handle the calculator's operation def calculate(self): # 先判断是否已导入数据 if self.input_df is None: QMessageBox.warning(self, "提示", "请先导入CSV数据文件") return # 直接使用self.input_df即可拿到主窗口传入的数据 input_df = self.input_df # 后续编写你的计算逻辑即可 print(input_df.head()) # 测试用,可删除
2. 修正MainWindow初始化逻辑,删除多余实例
你原来的代码中重复创建了MyApp实例,实际显示在界面上的是你从外部传入的w实例,直接存储该实例即可:
class MainWindow(QMainWindow): def __init__(self, w): super().__init__() self.setWindowTitle('My code') self.resize(1200, 1200) # 存储传入的MyApp实例,不要重复新建MyApp self.myApp = w self.menuBar = self.menuBar() self.fileMenu = self.menuBar.addMenu('File') # import data importAction = QAction('Open csv File', self) importAction.setShortcut('Ctrl+O') importAction.triggered.connect(self.openSeries) # exit action exitAction = QAction('Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.triggered.connect(lambda: app.quit()) self.fileMenu.addAction(importAction) self.fileMenu.addAction(exitAction) self.setCentralWidget(w)
3. 打开CSV后直接给MyApp实例的属性赋值
在openSeries方法中读取完DataFrame后,直接赋值给self.myApp.input_df即可完成数据传递:
def openSeries(self): # 修正路径转义问题,C:\改为C:\\ self.filePath = QFileDialog.getOpenFileName(self, 'Open data series csv file', 'C:\\', 'CSV(*.csv)') if self.filePath[0]: file_data = self.filePath[0] data_df = pd.read_csv(file_data, encoding='ISO-8859-1') # 直接赋值给MyApp实例的input_df属性完成传递 self.myApp.input_df = data_df QMessageBox.information(self, "提示", "数据导入成功")
修改完成后运行代码,先通过文件菜单导入CSV,再点击Calculate按钮即可正常使用导入的数据进行计算。
内容的提问来源于stack exchange,提问作者user2084270
相关产品推荐
相关产品推荐

