在使用pyqt5的过程中,会存在界面卡死的现象,为了优化改善,可以利用多线程来解决此类问题。可以实现信号与槽在多个线程中的相互传递数据。
用法很简单,创建一个进程类,不同触发时刻分别调用即可。

参考案例一:来源《PyQT5线程:多线程(QThread),线程锁(QMutex)》
实现两个线程来在工作台显示不同打印信息。

from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal)
import sys
import timeqmut_1 = QMutex() # 创建线程锁
qmut_2 = QMutex()
#这里加线程锁的目的是为了在此线程未结束时不能再次开启该线程,必须等到该线程结束后才能继续开启,参考线程1步骤
#但是这样使用的话还是可以再次点击该按钮,那我们为了在该线程开始时限制该按钮再次激活可使用signal参考线程2步骤# 继承QThread
class Thread_1(QThread):  # 线程1def __init__(self):super().__init__()def run(self):qmut_1.lock() # 加锁values = [1, 2, 3, 4, 5]for i in values:print(i)time.sleep(0.5)  # 休眠qmut_1.unlock() # 解锁class Thread_2(QThread):  # 线程2_signal =pyqtSignal()def __init__(self):super().__init__()def run(self):# qmut_2.lock()  # 加锁values = ["a", "b", "c", "d", "e"]for i in values:print(i)time.sleep(0.5)# qmut_2.unlock()  # 解锁self._signal.emit()class MyWin(QWidget):def __init__(self):super().__init__()# 按钮初始化self.btn_1 = QPushButton('按钮1', self)self.btn_1.move(120, 80)self.btn_1.clicked.connect(self.click_1)  # 绑定槽函数self.btn_2 = QPushButton('按钮2', self)self.btn_2.move(120, 120)self.btn_2.clicked.connect(self.click_2)  # 绑定槽函数def click_1(self):self.thread_1 = Thread_1()  # 创建线程self.thread_1.start()  # 开始线程def click_2(self):self.btn_2.setEnabled(False)self.thread_2 = Thread_2()self.thread_2._signal.connect(self.set_btn)self.thread_2.start()def set_btn(self):self.btn_2.setEnabled(True)if __name__ == "__main__":app = QApplication(sys.argv)myshow = MyWin()myshow.show()sys.exit(app.exec_())

案例二:
子线程向主线程实时发送时间信息,主线程实时显示当前时间。

from PyQt5.QtCore import QThread,pyqtSignal,QDateTime
from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit
import time
import sysclass BackendThread(QThread): #创建子线程的具体实现update_date=pyqtSignal(str)  #设置传送信号def run(self):while True:data=QDateTime.currentDateTime()  #读取时间currentTime=data.toString("yyyy-MM-dd  hh:mm:ss")  #更改显示格式self.update_date.emit(str(currentTime))  #触发更新信号time.sleep(1) #设置休眠时间
class ThreadUpdateUI(QDialog):#主窗口类def  __init__(self):QDialog.__init__(self)  #初始化部件self.setWindowTitle('多线程更新UI数据') #设置窗口标题self.resize(400,100)  #窗口大小self.input=QLineEdit(self)  #创建加载内容框self.input.resize(400,100)   #设置为和窗口一样大self.initUI()  #调用子线程函数def initUI(self):self.backend=BackendThread()  #创建子线程self.backend.update_date.connect(self.handleDisplay)  #利用槽接收子进程更新的时间self.backend.start()  #开始子进程def handleDisplay(self,data):#用于显示self.input.setText(data)if __name__ == '__main__':app = QApplication(sys.argv)object_num = 0ui1 = ThreadUpdateUI()ui1.show()sys.exit(app.exec_())

pyqt5多线程使用方法及学习案例(QThread)相关推荐

  1. Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法

    一 前言 二Qt多线程方法一 继承QThread 2.1使用多线程的原因分析 2.2 写一个继承于QThread的线程 三 总结 一 前言   本篇文章部分内容参考了该博文:传送门.   Qt中有两种 ...

  2. Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略

    Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介.使用方法.经典案例之详细攻略 目录 *args和**kwargs(设计不同数量的参数函数)的简介 1 ...

  3. Python语言学习之图表可视化:python语言中可视化工具包的简介、安装、使用方法、经典案例之详细攻略

    Python语言学习之图表可视化:python语言中可视化工具包的简介.安装.使用方法.经典案例之详细攻略 目录 python语言中可视化工具包的简介 python语言中可视化工具包的安装 pytho ...

  4. DL框架之MXNet :深度学习框架之MXNet 的简介、安装、使用方法、应用案例之详细攻略

    DL框架之MXNet :深度学习框架之MXNet 的简介.安装.使用方法.应用案例之详细攻略 目录 MXNet 的简介 1.优缺点 2.相关文章 3.相关链接 MXNet 的安装 MXNet 的使用方 ...

  5. pyqt5中sender方法介绍_PyQt5学习记录(二):Event sender

    Sometimes it is convenient to know which widget is the sender of a signal. For this, PyQt5 has the s ...

  6. PyQt5多线程的执行和停止

    参考资料:哔哩哔哩 pyqt5 thread多线程示例 以下代码来自该视频,我自己手动实现了一下,当作一个模板来学习,欢迎大家一起学习. 运行示例 三个进程同时执行,并且可以单独控制暂停和继续执行. ...

  7. php curl_setopt抓取内容,PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

    通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个扩展库 使用条件:需要在php.ini 中配置开启.(PHP 4 >= 4.0.2) ...

  8. pyqt5 多线程遇到的问题总结

    前言     在使用pyqt5时,程序运行时间过长可能会造成界面假死的情况,为了解决这个问题,可以采用多线程.将程序放到子线程中运行.     这里pyqt5 多线程用的方法是继承QThread类,然 ...

  9. 九、PyQt5多线程编程

    (三)多线程编程 如果一次只完成一件事情,那是一个不错的想法,但事实上很多事情都是同时进行的,所以在Python中为了模拟这种状态,引入了线程机制,简单地说,当程序同时完成多件事情时,就是所谓的多线程 ...

最新文章

  1. python二维列表排序
  2. 分享下自己写的一个微信小程序请求远程数据加载到页面的代码
  3. excel相乘后求和_Excel求和只会sum函数就out了,这五个求和公式一个比一个强
  4. 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法...
  5. 微信公众号开发之微信买单
  6. Eclipse中执行Tomcat源代码
  7. php base64_decode 图片,php读取和保存base64编码图片
  8. ES6 推荐网络文档书籍
  9. html设置input透明背景,input背景透明的穿透问题_html/css_WEB-ITnose
  10. 《JavaScript高级程序设计》目录笔记
  11. springboot Validation
  12. Mac技巧之 Numbers 排除重复表格(去重)方法
  13. python123:大小写转换
  14. 希望Online -- 前10级快速功略 + 怪物掉的装备
  15. python 包络线_如何简明易懂地说明数据包络线分析法(DEA)?
  16. 太极图正确画法_道教知识:太极图的正确画法
  17. Eclipse怎样改变字体大小
  18. tomcat命名来源(歪批)
  19. 检测到#include错误,请更新IncludePath.已为此翻译单元xxx禁用波形曲线,最详细解决教程
  20. 分享 | OHBM2020所有poster的信息

热门文章

  1. python 字符集utf-8|精简版(三分钟了解)
  2. linux 附加数据库文件,SQL Server 数据库分离与附加图文详解
  3. rpg制作大师2003_RPG制作大师MV 我们一起做游戏(十四)
  4. [转]抛弃jQuery,使用原生JavaScript
  5. O(n)复杂度求没有出现的数字(leetcode448)
  6. Github的README中插入图片,Github仓库项目主页显示图片
  7. C语言函数名以及取地址的区别和联系
  8. Kubernetes(k8s)底层网络原理刨析
  9. JAVA——孪生素数
  10. Linux GPIO键盘驱动开发记录_OMAPL138