PyQt6基础_QThread

目录

前置

代码: 

运行

正常运行

QThread运行报错

 视频


前置

1 PySide6.QtCore.QThread - Qt for Python QThread官方文档

2 长时间任务可以放到QThread中执行,避免占用主线程导致界面卡顿无法操作

代码: 

import traceback,sys
from datetime import datetime
from time import sleep
from PyQt6.QtCore import (
Qt,
QSize,
QThread,
QTime,
QObject,
pyqtSignal,
pyqtSlot
)
from PyQt6.QtWidgets import (
QApplication,
QMainWindow,
QLabel,
QPushButton,
QVBoxLayout,
QWidget,
QMessageBox
)class Worker_000(QObject):signal_finished = pyqtSignal(str) # 任务结束信号signal_error = pyqtSignal(tuple) # 任务报错信号signal_result = pyqtSignal(str) # 任务返回的结果@pyqtSlot(object)def do_work(self,task_data:dict):thread_name = task_data['thread_name']res_str = '执行结束了。'try:# work code startfor i in range(20):if i==10:raise ValueError('测试报错功能')self.signal_result.emit(f"线程返回 第{i}次,当前时间为 {QTime.currentTime().toString('hh:mm:ss')} ")sleep(1)pass# work code endpassexcept:traceback.print_exc()exctype,value = sys.exc_info()[:2]self.signal_error.emit((thread_name,exctype,value,traceback.format_exc()))passelse:self.signal_result.emit(res_str)finally:self.signal_finished.emit(thread_name)passpassclass MainWindow(QMainWindow):signal_worker = pyqtSignal(object)def __init__(self):super().__init__()self.setWindowTitle('QThread')self.setMinimumSize(QSize(600,400))self.label_worker = QLabel()self.label_main = QLabel()self.btn = QPushButton('启动QThread',clicked=self.btn_clicked)self.btn00 = QPushButton('主界面',clicked=self.btn00_clicked)layout = QVBoxLayout()layout.addWidget(self.label_worker)layout.addWidget(self.btn)layout.addWidget(self.btn00)layout.addWidget(self.label_main)widget = QWidget()widget.setLayout(layout)self.setCentralWidget(widget)self.open_init()passdef open_init(self):self.thread = Noneself.worker = Noneself.waitting_close = Falsepassdef btn_clicked(self):self.btn.setDisabled(True)self.worker = Worker_000()self.thread = QThread()self.thread.finished.connect(self.thread_finished)self.worker.signal_finished.connect(self.worker_signal_finished_emit)self.worker.signal_error.connect(self.worker_signal_error_emit)self.worker.signal_result.connect(self.worker_signal_results_emit)# 主线程与子线程之间的交互必须通过信号与槽进行,不要在主线程中通过 self.worker.do_woker()self.signal_worker.connect(self.worker.do_work)# 由于是通过 moveToThread 启动 QThread.run() ,QThread不会自动发起finished信号,需要手动 quit或exit后才会发送finishedself.worker.moveToThread(self.thread)self.thread.start()task_data = {'thread_name':'worker_000'}self.signal_worker.emit(task_data)print('线程开始了。')passdef btn00_clicked(self):now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')if self.thread:if self.thread.isRunning():res_str = '线程正在执行中...'else:res_str = '悠闲,哈哈哈'else:res_str = '无聊中。呵呵呵'self.label_main.setText(f"{now_str} {res_str}")passdef thread_finished(self):print('线程finished')self.btn.setDisabled(False)if self.waitting_close:self.close()passpassdef worker_signal_finished_emit(self,res:str):print(f'{res} 线程任务结束。')self.thread.quit()passdef worker_signal_error_emit(self,res:tuple):# (thread_name,type,value,traceback)pre_str = f"线程 {res[0]} 报错啦。报错信息 {res[-1]}"print(pre_str)QMessageBox.information(self,'提示',pre_str,QMessageBox.StandardButton.Ok)passdef worker_signal_results_emit(self,res:str):self.label_worker.setText(res)passdef closeEvent(self, a0):answer = QMessageBox.question(self,'确认退出?','退出将中断操作,确定要退出么?',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if answer == QMessageBox.StandardButton.Yes:if self.thread:if self.thread.isRunning():self.waitting_close = Trueself.thread.quit()a0.ignore()QMessageBox.information(self,'提示','正在关闭线程,请稍等',QMessageBox.StandardButton.Ok)passelse:a0.accept()else:a0.accept()else:a0.ignore()passif __name__ == '__main__':app = QApplication([])mw = MainWindow()mw.show()app.exec()pass

1 主线程与QThread之间的交互必须通过信号与槽进行

2 Work_000类是要子线程执行的任务,使用 moveToThread 方法调用QThread。注意:使用moveToThread方法调用QThread,QThread不会自主发射finished信号,需要手动quit或exit才会发射finished信号。所以在主线程接收到 Work_000 signal_finished表示任务完成的信号时,手动将QThread quit或exit

3 存在QThread的程序需要考虑一种情况,就是在QThread还在执行中时,关闭主界面(主线程)的情况。所以,定义了一个 waitting_close 布尔变量,如果发生QThread还在执行,但发起关闭主界面的请求时,将 waitting_close设置为True。在 QThread 发射finished信号后,检查 watting_close 是否为True,如果为True,就将主界面关闭。

运行

正常运行

控制台打印

QThread启动后,“启动QThread"按钮不可用。QThread执行过程中,”主界面“按钮可以正常使用。

QThread执行结束后,QThread发射finished信号,“启动QThread"按钮恢复可用状态。

QThread运行报错

 

控制台打印

 视频

PyQt6基础_QThread_哔哩哔哩_bilibili 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 应用运行指南

🚀 Spring Boot 应用运行指南 ⚙️ 使用 Maven 🔧 运行命令 $ mvn spring-boot:run✨ 启动效果 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_…

jeecgboot 3.8.0 集成knife4j问题一文解决

问题描述: ​ 在cloud环境下,若应用系统配置了context-path,则无法通过网关进入后台接口管理系统 原因分析: ​ 查看请求信息发现少拼接了系统的context-path,导致无法正确请求到数据。直接使用正确的地址可以正常通过网关访问。故此确定为集成knife4j的问题。 解决办法…

【Flutter】Flutter + Unity 插件结构与通信接口封装

关联文档:【方案分享】Flutter Unity 跨平台三维渲染架构设计全解:插件封装、通信机制与热更新机制—— 支持 Android/iOS/Web 的 3D 内容嵌入与远程资源管理,助力 XR 项目落地 —— 支持 Android/iOS/Web 的 3D 内容嵌入与远程资源管理&…

推荐 1 款 9.3k stars 的全景式开源数据分析与可视化工具

Orama 是一个开源的数据分析与可视化项目,由askorama团队开发和维护。该项目旨在为用户提供一套强大而易用的工具集,帮助用户轻松处理和理解大规模数据,通过创建交互式且引人入胜的数据可视化图表,揭示隐藏在数据背后的深层次洞察…

关于windows API 的键鼠可控可测

相关函数解释 GetAsyncKeyState 是 Windows API 中的一个函数,用于判断某个虚拟键是否被按下。GetAsyncKeyState(VK_ESCAPE) 专门用于检测 Esc 键的状态。下面为你详细介绍其用法: 函数原型 cpp SHORT GetAsyncKeyState( int vKey ); 参数 vKey&a…

vs 安装完番茄助手visual assist 后 菜单栏不显示

vs 安装完番茄助手visual assist 后 菜单栏不显示 出现原因解决办法: 出现原因 vs安装完番茄助手后,不显示。主要原因是之前安装过,但是试用过期了,卸载后重新安装然后替换破解版的dll 导致的。 解决办法: 关闭vs软件…

论文导读 - 基于边缘计算、集成学习与传感器集群的便携式电子鼻系统

基于边缘计算、集成学习与传感器集群的便携式电子鼻系统 原论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400522015684 引用此论文(GB/T 7714-2015): WANG T, WU Y, ZHANG Y, et al. Portable electr…

EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用

一、方案背景 在300路大型生产监控项目中,由于生产环境复杂多样,涵盖室外厂区、大型车间、室内办公区域等不同场景,单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台,具备灵活的视…

测试用例介绍

文章目录 一、测试用例基本概念1.1 测试用例基本要素 二、测试用例的设计方法2.1 基于需求的设计方法2.2 等价类2.3 边界值2.4 错误猜测法2.6 场景设计法2.7 因果图2.5 正交排列 三、综合:根据某个场景去设计测试用例(万能公式)四、如何使用F…

基于蓝牙Beacon人员导航方案

基于蓝牙Beacon人员导航方案 一、室内定位市场痛点与技术选择 大型商场(单层超2万㎡)和医院(科室超200个)的复杂空间中,传统GPS信号衰减超90%,用户平均寻路耗时10-15分钟,30%购物决策因“找店…

使用vue3 脚手架创建项目

1.创建项目 并 运行 1.1 创建项目 vue create abcd 1.2 运行 创建好项目后,命令行会提示你运行项目 npm run serve 2.介绍各个目录 node_modules : 项目依赖包,其中包括很多基础依赖,自己也可以根据需要安装其他依赖 assets文件夹&a…

跨语言哈希一致性:C# 与 Java 的 MD5 之战?

在跨平台或异构系统集成的场景中,我们经常需要在不同的编程语言之间交换数据或验证数据一致性。MD5 作为一种广泛使用的哈希算法,就常常扮演着生成唯一标识或校验数据完整性的角色。然而,不少开发者可能会遇到这样一个令人困惑的问题&#xf…

基于RuoYi的WMS仓库管理系统源码级解决方案

基于RuoYi的WMS仓库管理系统源码级解决方案 项目地址 一、系统简介 WMS(Warehouse Management System)仓储管理系统是现代物流管理的核心系统,通过对仓库业务的精细化管理,实现入库、出库、库存等环节的高度自动化和智能化。 系…

研究:大模型输出一致性:确定性与随机性的场景化平衡

大模型在相同输入下的输出是否一致,本质上取决于其设计目标、任务性质以及技术实现方式。这一问题需要从技术原理、应用场景、用户需求三个维度进行深度分析: 一、技术实现:确定性与随机性的平衡 模型架构的确定性基础 大模型的核心参数(如权重矩阵)在训练完成后是固定的…

青年座谈会的读书汇报

今天,单位组织了一个五四青年座谈会,我们室由于大家都在出差忙之类的,我必须要参加,还要我做一个汇报,我一新来的还没深入到研发工作中,于是决定写了一篇简单的读书笔记,再用deepseek润色一下&a…

RabbitMQ安装流程(Windows环境)

安装资料链接:https://download.csdn.net/download/ly1h1/90705840?spm1001.2014.3001.5503 代码案例链接:https://download.csdn.net/download/ly1h1/90706521 1.下载依赖,Downloads - Erlang/OTP 2.下载RabbitMQ安装包,In…

vscode 使用gitcode团队管理项目

1、下载安装vscode https://code.visualstudio.com/Download 2、安装git 3、在vscode中安装GitLens插件 4、打开终端 点击会显示当前更改的项目 5、提交更改的文件,会提示输入用户名、密码,这里的密码即是令牌,令牌在第一次创建的时候显…

el-input限制输入只能是数字 限制input只能输入数字

方法一&#xff1a; 通过设置type属性&#xff1a;type“number”&#xff0c;这种方式一般会影响样式&#xff0c;不建议使用&#xff0c;如下图&#xff1a; <el-input type"number" v-model"aaa"></el-input>方法二&#xff1a; 通过绑定值…

【Python数据驱动决策】数据分析与可视化全流程实战指南

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:销售数据清洗案例2:月度销售趋势分析案例3:产品关联分析(热力图)运行结果验证三、性能对…

Spring的BeanFactory和FactoryBean的区别

​ ‌BeanFactory和FactoryBean在Spring框架中扮演着不同的角色&#xff0c;具有不同的功能和用途。‌ 定义与角色 ‌BeanFactory‌&#xff1a;BeanFactory是Spring IoC容器的核心接口&#xff0c;用于管理和维护Bean的定义、创建和生命周期。它是Spring IoC容器的基础&…