Pyqt5 程序运行不卡死设置

发布时间:2024年01月04日

问题阐述

? ? ? ? 使用Pyqt5打包后exe程序,在运行时整个页面布局会卡死,无法进行点击或者其他操作,需要实现的是我关闭这个程序,整个程序就终止,而不是使用卡死的方式终止程序

导入包

from PyQt5.QtCore import QSettings, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QLabel
from PyQt5.QtCore import QThread, pyqtSignal
import sys

使用线程守护

编写一个运行耗时任务的类

# 创建一个线程类
class WorkerThread(QThread):
    finished = pyqtSignal(dict)  # 创建信号,用于任务完成后通知主线程

    def __init__(self, input_dict):
        super().__init__()
        self.input_dict = input_dict

    def run(self):
        # 在这里执行耗时的任务...
        # 模拟的任务,替换为实际需要运行的MainProgram()
        from time import sleep
        sleep(5)  # 模拟长时间运行
        main_result_dict = {"data": "feedback_path"}  # 模拟结果

        self.finished.emit(main_result_dict)  # 发送信号,任务完成

主线程

# 创建一个线程类
class WorkerThread(QThread):
    finished = pyqtSignal(dict)  # 创建信号,用于任务完成后通知主线程

    def __init__(self, input_dict):
        super().__init__()
        self.input_dict = input_dict

    def run(self):
        # 在这里执行耗时的任务...
        # 模拟的任务,替换为实际需要运行的MainProgram()
        from time import sleep
        sleep(5)  # 模拟长时间运行
        main_result_dict = {"data": "feedback_path"}  # 模拟结果

        self.finished.emit(main_result_dict)  # 发送信号,任务完成

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # GUI布局
        self.button = QPushButton("执行事件", self)
        self.button.clicked.connect(self.start_long_task)
        self.button.move(100, 100)

        self.feedback_path_edit = QLineEdit(self)
        self.feedback_path_edit.move(100, 150)

        self.statusIngLbl = QLabel("等待指令...", self)
        self.statusIngLbl.move(100, 200)

        self.thread = None  # 初始化线程

    def start_long_task(self):
        input_dict = {"key": "value"}  # 假设是你需要传递的参数
        self.thread = WorkerThread(input_dict)
        self.thread.finished.connect(self.update_ui)  # 任务完成时更新UI
        self.thread.start()  # 开始线程
        self.statusIngLbl.setText("程序执行中...")

    def update_ui(self, result):
        feedback_path = result["data"]
        self.feedback_path_edit.setText(feedback_path)
        self.statusIngLbl.setText("程序执行完毕")

    def closeEvent(self, event):
        # 重写关闭事件,确保后台线程安全退出
        if self.thread and self.thread.isRunning():
            self.thread.terminate()  # 终止线程
            self.thread.wait()  # 等待线程真正结束
        event.accept()  # 允许窗口关闭

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

文章来源:https://blog.csdn.net/gongzairen/article/details/135389951
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。