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

PyQt5编写Excel读取展示程序运行时出现0xc0000409错误求助

0xc0000409错误排查(PyQt5+pandas读取Excel场景)

0xc0000409是Windows平台的内存非法访问/栈溢出错误,PyQt程序触发这个错误基本都是Qt C++层收到非法参数、调用越界导致的,你代码里有4个明确的问题会直接触发崩溃,还有部分逻辑漏写:

  • 列数赋值写反:self.table.setColumnCount(df.shape[0]) 错把行数(shape[0])当成列数传入,后续设置表头时传入的标签长度和表格实际列数不匹配,直接触发Qt底层内存越界,这是崩溃的核心原因,正确写法是列数传df.shape[1]。
  • 空数据分支逻辑错误:判断df为空时,你写了return super.loadExcelData(excel_file_dir, worksheet_name),QWidget基类根本不存在loadExcelData方法,而且这种写法会造成无限递归,直接把栈打满触发崩溃,空分支直接返回或者弹提示即可。
  • 全局无意义调用pympler:你在全局作用域直接执行all_objects = muppy.get_objects()扫描全内存对象,这行代码在QApplication初始化前运行,很容易访问到未初始化的PyQt C++对象内存,平白增加崩溃风险,没用的话直接删掉这两行。
  • 按钮文本转义错误:'&load Data'是HTML转义后的写法,PyQt按钮文本直接写'&Load Data'即可,这个问题不会触发崩溃但属于笔误。
  • 核心逻辑缺失:读完pandas的DataFrame之后没有写把数据填充到QTableWidget单元格的逻辑,就算不崩溃表格也是空白的。
修复后可直接运行的代码
import sys
import pandas as pd
from PyQt5.QtWidgets import (QApplication, QWidget, QTableWidget, QTableWidgetItem,
                             QVBoxLayout, QPushButton, QMessageBox, QHeaderView)
from PyQt5.QtCore import Qt

class MyApp(QWidget):
    def __init__(self, excel_path, sheet_name):
        super().__init__()
        self.excel_path = excel_path
        self.sheet_name = sheet_name
        self.resize(700, 500)

        layout = QVBoxLayout()
        self.setLayout(layout)

        self.table = QTableWidget()
        layout.addWidget(self.table)

        self.button = QPushButton('&加载数据')
        self.button.clicked.connect(self.loadExcelData)
        layout.addWidget(self.button)

    def loadExcelData(self):
        try:
            df = pd.read_excel(self.excel_path, self.sheet_name)
        except Exception as e:
            QMessageBox.critical(self, "读取错误", f"打开Excel失败:{str(e)}")
            return

        if df.size == 0:
            QMessageBox.warning(self, "空数据", "读取到的Excel表为空")
            return

        df.fillna('', inplace=True)
        # 行数取shape[0],列数取shape[1]
        self.table.setRowCount(df.shape[0])
        self.table.setColumnCount(df.shape[1])
        self.table.setHorizontalHeaderLabels(df.columns)

        # 填充单元格数据
        for row in range(df.shape[0]):
            for col in range(df.shape[1]):
                item = QTableWidgetItem(str(df.iloc[row, col]))
                item.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                self.table.setItem(row, col, item)

        # 表头自动拉伸适配宽度
        self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

if __name__ == '__main__':
    excel_file_path = 'data.xlsx'
    worksheet_name = 'Sales'

    app = QApplication(sys.argv)
    myApp = MyApp(excel_file_path, worksheet_name)
    myApp.show()

    sys.exit(app.exec_())

运行前确保data.xlsx文件和脚本在同一路径下,且文件内存在名为Sales的工作表,读取异常时会弹出提示不会直接崩溃。

内容的提问来源于stack exchange,提问作者김동주

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:27:18