pyqt5 多线程遇到的问题总结
前言
在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用多线程。将程序放到子线程中运行。
这里pyqt5 多线程用的方法是继承QThread类,然后重写run()函数实现。
# 多线程的实现
class MyThread(QThread):_signal = pyqtSignal(object) # 自定义信号,用于传递数据等def __init__(self):super().__init__()# 重写run函数def run(self):# 需要在子线程运行的程序...
1. 退出子线程
有时候我们不希望程序运行到结束,我们需要程序提前终止,这时候我们需要提前退出子线程。
方法:定义一个停止标志flag,重写stop函数。退出线程直接调用stop函数让flag不满足循环条件,退出循环。
# 多线程的实现
class MyThread(QThread):_signal = pyqtSignal(object) # 自定义信号,用于传递数据等def __init__(self):super().__init__()self.stop_flag = False# 重写run函数def run(self):for i in range(10):if self.stop_flag is True:return/(break)else:self._signal.emit(i) self._signal.emit("程序运行结束!")def stop(self):self.stop_flag = Trueclass UIwindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.pushButton.clicked.connect(self.stop_thread) # 提前停止线程self.pushButton_2.clicked.connect(self.start_thread) # 开启线程def start_thread(self):# 创建线程self.thread = MyThread()self.textBrowser.append("程序正在运行中... ")self.thread._signal.connect(self.receive)self.thread.stop_flag = Falseself.thread.start()def stop_thread(self):self.thread.stop()def receive(self, i):"""接收线程发射的信号"""precent = "■" * (i + 1) + "□" * (9 - i)self.textBrowser.setText("生成数据中... {}% |".format((i + 1) * 10) + precent + "|")
2. 报错 QThread :Destroyed while thread is still running!
方法1:在调用线程的时候一定要加self,因为不加self,是局部变量,函数运行后,python的垃圾自动回收机制会将局部变量回收掉。
thread = MyThread()
更改为:
self.thread = MyThread()
方法2:在线程开启后面加self.exec()
self.thread = MyThread()
self.thread.start()
self.thread.exec()
方法3:退出线程的时候报这个错误,在线程stop函数中加入下面语句
def stop(self):self.stop_flag = True# 加入下面语句self.requestInterruption()self.wait()
3. 退出线程后,再次开启线程时程序不运行
线程锁(QMutex)的问题
因为线程中用了线程锁的原因,导致退出线程后,再次开启线程后,程序不会接着运行的问题。将线程锁取消掉成功解决。
4. pyqt5不报具体的错误,直接闪退
更新:最近发现了一个调试库,可以显示pyqt的错误,而且界面也不会闪退,在代码中加入下列代码即可。
import cgitbcgitb.enable(format='text')
解决方法:在终端(命令行)运行程序,就可以正常的显示错误了。
Pycharm的话,在Terminal处运行就可以了。
推荐可以使用try,except语句。既可以发现错误,也不会导致界面频繁闪退!
try:...return
except Exception as reason:return QMessageBox.warning(self, 'Warning', str(reason))
5. 利用自定义信号传递数据和参数
_finished = pyqtSignal(object) # 自定义信号
(int)------>传递整型数据
(str)------>传递字符型数据
(object)------>不确定类型的时候可以用这个,可以传递numpy、字典等类型数据
pyqt5 多线程遇到的问题总结相关推荐
- PyQt5多线程的执行和停止
参考资料:哔哩哔哩 pyqt5 thread多线程示例 以下代码来自该视频,我自己手动实现了一下,当作一个模板来学习,欢迎大家一起学习. 运行示例 三个进程同时执行,并且可以单独控制暂停和继续执行. ...
- pyqt5多线程使用方法及学习案例(QThread)
在使用pyqt5的过程中,会存在界面卡死的现象,为了优化改善,可以利用多线程来解决此类问题.可以实现信号与槽在多个线程中的相互传递数据. 用法很简单,创建一个进程类,不同触发时刻分别调用即可. 参考案 ...
- 九、PyQt5多线程编程
(三)多线程编程 如果一次只完成一件事情,那是一个不错的想法,但事实上很多事情都是同时进行的,所以在Python中为了模拟这种状态,引入了线程机制,简单地说,当程序同时完成多件事情时,就是所谓的多线程 ...
- pyqt5 多线程实时拉流并播放,画面流畅无卡顿
目录 1. 背景 2. 实现 1. 背景 需要用pyqt5做一个简单播放器,能够连接单位摄像头,用rtsp拉流并实时展示.很多博客方法都试过,或者卡顿,或者时延较大,无法满足需求. 2. 实现 主要参 ...
- pyqt5多线程更新ui
信号传参类型 pyqtSignal() #无参数信号 pyqtSignal(int) ...
- python(pyqt5)多线程解决界面无响应
多线程解决界面无响应多线程解决界面无响应多线程解决界面无响应 def open_train_task():import osos.system(r"E:\kg\TURN-TAP-master ...
- 记一次PyQT5 core dump调试过程
1. 首先设置系统允许生成core dump文件 步骤一:开启core dump文件生成 ulimit -c unlimited 步骤二:设置core dump文件位置 vi /etc/sysctl. ...
- PyQt5基础知识大全
PyQT与Opencv结合的案例 Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程) PyQt:桌面程序设计的饕餮盛宴 快速掌握PyQt5 个人QT学习笔记(部分重点内容) 生成 ...
- pyqt5 +pyinstall打造属于自己的桌面版程序(学习阶段)
网上关于pyqt5的教程特别少,终于东拼西凑,做出一点东西出来,很简单的小应用,便于上手学习. pyqt5的主文件代码如下,代码特别多,也没怎么细分.大家可以参考下.github地址 pyinstal ...
最新文章
- C 语言编程 — 高级数据类型 — 字符串
- Visual Studio 2015 速递(4)——高级特性之移动开发
- [公告]博客园新服务器照片
- Angular中怎样通过localStorage实现数据持久化-实现存储搜索历史为例
- 一起学windows phone7开发(二十二.使用系统资源)
- UE4异步编程专题 - 多线程
- 邻接矩阵和邻接表_[力扣743] 带权邻接表的单源最短路
- android 会话 java_java – Android会话管理
- python四种可变类型_Python的可变类型与不可变类型
- 面向未来的100项颠覆性创新技术!欧盟重磅报告
- uniapp 清除文件缓存
- 天蓝色在ps中的色值_天蓝色的cosmosdb文档中的字段级加密
- 2012 Esri 中国开发者大会
- 不用微博SDK,直接使用 新浪微博 分享链接进行分享
- 【Python核心】垃圾回收机制
- (附源码)计算机毕业设计SSM智能仓储进出货管理系统
- python修改文件创建时间,修改时间,访问时间
- ECCV 2022 | 阿里提出:快速动作识别的时空自注意力模型
- 113资讯网:最近在玩一个4414站长论坛,可以发帖赚钱的站长论坛!
- 大数据Hadoop之——数据分析引擎Apache Pig
热门文章
- 文件如何生成下载链接?
- 如何用Java获取并操作系统进程?
- 2018普通话水平测试软件,2018年普通话水平测试试题及答案一
- ICC II 7 顶层设计的实现(Top level implementation)
- 下载新浪flash方法
- HTML5游戏实战之消灭星星(完整源代码)
- html转换成pdf
- grant on mysql_MySQL的GRANT命令(创建用户)
- 世界很大,有人把二维码纹在脖子上
- element plus+vue3.0 el-date-picker之panel-change无效果,为el-date-picker加标识。