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