Python中运行pyqt5程序时UI崩溃并显示Python停止运行如何解决
部分代码:
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate(“MainWindow”, “MainWindow”))
self.label.setText(_translate(“MainWindow”, “输入验证码”))
self.label_5.setText(_translate(“MainWindow”, “获取验证码”))
self.pushButton_2.setText(_translate(“MainWindow”, “确定”))
self.label_7.setText(_translate(“MainWindow”, “结果”))
self.pushButton.setText(_translate(“MainWindow”, “开始生成报表”))
self.pushButton.clicked.connect(self.on_click_1)
def on_click_1(self):
self.withoutCookieLogin(driver,url_login)
on_click_1 只要一执行 withoutCookieLogin(driver,url_login) UI 就崩溃
执行其他的 比如 UI 内部程序 self.label_2.setText(‘请输入验证码’) 就没影响
求大手子指教
Python中运行pyqt5程序时UI崩溃并显示Python停止运行如何解决
这个问题我遇到过,通常是因为PyQt5的事件循环和Python解释器线程冲突导致的。最常见的情况是在主线程之外操作UI组件,或者信号槽连接有问题。
给你一个完整的解决方案:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import QThread, pyqtSignal
import traceback
# 工作线程类
class WorkerThread(QThread):
finished = pyqtSignal()
error = pyqtSignal(str)
def run(self):
try:
# 模拟耗时操作
import time
time.sleep(2)
self.finished.emit()
except Exception as e:
self.error.emit(str(e))
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setup_ui()
self.worker = None
def setup_ui(self):
self.setWindowTitle("PyQt5稳定示例")
self.setGeometry(100, 100, 400, 300)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
self.btn_normal = QPushButton("正常操作")
self.btn_normal.clicked.connect(self.normal_operation)
self.btn_thread = QPushButton("线程操作")
self.btn_thread.clicked.connect(self.thread_operation)
layout.addWidget(self.btn_normal)
layout.addWidget(self.btn_thread)
central_widget.setLayout(layout)
def normal_operation(self):
# 主线程中的UI操作是安全的
self.btn_normal.setText("已点击")
def thread_operation(self):
# 使用工作线程处理耗时任务
self.worker = WorkerThread()
self.worker.finished.connect(self.on_worker_finished)
self.worker.error.connect(self.on_worker_error)
self.worker.start()
def on_worker_finished(self):
# 在主线程中更新UI
self.btn_thread.setText("线程完成")
def on_worker_error(self, error_msg):
print(f"线程错误: {error_msg}")
def main():
# 关键:尽早创建QApplication
app = QApplication(sys.argv)
try:
window = MainWindow()
window.show()
# 主事件循环
sys.exit(app.exec_())
except Exception as e:
print(f"程序崩溃: {e}")
traceback.print_exc()
if __name__ == "__main__":
main()
核心要点:
- UI操作必须在主线程:所有界面更新都要在
app.exec_()的主事件循环中完成 - 耗时操作用QThread:避免在主线程执行阻塞操作
- 信号槽正确连接:线程间通信必须通过信号槽机制
- 异常捕获要全面:用try-except包裹可能出错的地方
如果还有崩溃,可以:
- 检查是否有野指针(对象被提前销毁)
- 确认所有QObject都在主线程创建
- 避免在子线程中直接调用UI组件的方法
总结建议:确保UI操作在主线程,耗时任务用QThread处理。
定义 on_click_1 函数时需要传入 driver,url_login 的参数吧

