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停止运行如何解决


2 回复

这个问题我遇到过,通常是因为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()

核心要点:

  1. UI操作必须在主线程:所有界面更新都要在app.exec_()的主事件循环中完成
  2. 耗时操作用QThread:避免在主线程执行阻塞操作
  3. 信号槽正确连接:线程间通信必须通过信号槽机制
  4. 异常捕获要全面:用try-except包裹可能出错的地方

如果还有崩溃,可以:

  • 检查是否有野指针(对象被提前销毁)
  • 确认所有QObject都在主线程创建
  • 避免在子线程中直接调用UI组件的方法

总结建议:确保UI操作在主线程,耗时任务用QThread处理。


定义 on_click_1 函数时需要传入 driver,url_login 的参数吧

回到顶部