You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:09:03