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,提问作者김동주
相关产品推荐
相关产品推荐

