Pyqt5 程序运行不卡死设置

问题阐述

        使用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_())

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值