PyQt6调用pandas read_excel读取Excel时程序卡顿崩溃问题求助
开发基于Qt的GUI工具,目标是从Excel文件提取对数正态分布相关数据,生成绘图所需的结构化数据,核心实现代码如下:
import sys from PyQt6 import QtWidgets from PyQt6.QtWidgets import QDialog, QApplication, QFileDialog, QTableWidget, QTableWidgetItem, QTabWidget from PySide6.QtCore import Slot from PyQt6.uic import loadUi import pandas as pd class MainWindow(QDialog): def __init__(self): super(MainWindow, self).__init__() self.initUI() def initUI(self): loadUi('gui.ui', self) self.btnShow.setEnabled(False) self.btnBrowse.clicked.connect(self.browseFiles) self.btnLoad.clicked.connect(lambda: self.loadExcelData(self.filename.text())) @Slot() def browseFiles(self): fname = QFileDialog.getOpenFileName(self, 'Open Excel file', 'C:\\', "Excel (*.xls *.xlsx)") self.filename.setText(fname[0]) @Slot() def loadExcelData(self, pathOfFile): column_names = ["IDofCell", "SerialNumber", "Action", "TimeOfFailure", "ReverseRankR", "Cdf", "Ppf", "LogTime"] df = pd.read_excel(pathOfFile, names=column_names) if df.size == 0: return self.tableExcelData.setRowCount(df.shape[0]) self.tableExcelData.setColumnCount(df.shape[1]) self.tableExcelData.setHorizontalHearsLabels(df.columns) if __name__ == '__main__': app = QApplication(sys.argv) mainWindow = MainWindow() mainWidget = QtWidgets.QStackedWidget() mainWidget.addWidget(mainWindow) mainWidget.show() sys.exit(app.exec())
界面包含文件浏览、操作按钮区域,以及QTableWidget组成的Excel数据展示区域。
点击「Load Data」按钮读取Excel文件时,程序先进入无响应卡顿状态,片刻后直接崩溃。初步定位崩溃触发点位于pd.read_excel代码行,测试所用Excel为常规结构化行列数据。
按优先级从高到低排查修复:
Qt绑定混用导致的底层崩溃
代码同时导入PyQt6和PySide6两套Qt绑定,二者的元对象系统、事件循环、内存管理逻辑完全不兼容,信号槽绑定跨绑定调用时会直接触发内存访问错误,这是最常见的崩溃诱因。- 修复:统一使用单套Qt绑定,保留PyQt6的前提下,将
from PySide6.QtCore import Slot替换为from PyQt6.QtCore import Slot,删除所有PySide6相关导入。
- 修复:统一使用单套Qt绑定,保留PyQt6的前提下,将
Excel读取依赖缺失
pandas的read_excel方法本身不包含Excel解析能力,读取.xlsx格式需要openpyxl依赖,读取旧版.xls格式需要xlrd==1.2.0依赖,环境缺依赖时pandas抛出的异常如果未被捕获,会直接导致Qt程序崩溃,而非正常抛出错误提示。- 修复:执行命令安装依赖:
pip install openpyxl xlrd==1.2.0,读取时显式指定引擎避免自动匹配错误,示例:pd.read_excel(pathOfFile, names=column_names, engine='openpyxl')
- 修复:执行命令安装依赖:
代码拼写错误导致的后续崩溃
代码中setHorizontalHearsLabels为拼写错误,正确方法名是setHorizontalHeaderLabels,即便Excel读取成功,执行到该行也会因为方法不存在触发崩溃。此外当前代码仅设置了表格行列数,未实际填充DataFrame数据,修复拼写后表格也会显示空白。- 修复:修正方法名,补充表格数据填充逻辑:
self.tableExcelData.setHorizontalHeaderLabels(df.columns) # 逐行逐列填充单元格数据 for row_idx in range(df.shape[0]): for col_idx in range(df.shape[1]): cell_val = str(df.iloc[row_idx, col_idx]) if pd.notna(df.iloc[row_idx, col_idx]) else "" self.tableExcelData.setItem(row_idx, col_idx, QTableWidgetItem(cell_val))主线程阻塞+无异常捕获
Excel读取属于IO密集型操作,直接在GUI主线程执行会阻塞Qt事件循环,表现为界面无响应;同时代码未做路径合法性校验、未加异常捕获,文件不存在、文件格式损坏等场景都会直接触发崩溃。- 修复:增加路径校验和异常捕获,大文件读取建议移到QThread子线程执行,基础校验逻辑示例:
import os from PyQt6.QtWidgets import QMessageBox @Slot() def loadExcelData(self, pathOfFile): if not os.path.isfile(pathOfFile): QMessageBox.warning(self, "提示", "请先选择有效的Excel文件") return column_names = ["IDofCell", "SerialNumber", "Action", "TimeOfFailure", "ReverseRankR", "Cdf", "Ppf", "LogTime"] try: df = pd.read_excel(pathOfFile, names=column_names, engine='openpyxl') except Exception as e: QMessageBox.critical(self, "读取失败", f"Excel解析错误:{str(e)}") return # 后续表格渲染逻辑
内容的提问来源于stack exchange,提问作者Hubertius

