【PyQt5】PyQt5 多线程 QThread 实现

本是古典 何须时尚 2023-07-05 05:27 124阅读 0赞

简介#

QThread 类提供了一种独立于平台的线程管理方法。

QThread 对象管理程序中的一个控制线程。在 run() 中开始执行 QThreads。默认情况下,run() 通过调用 exec() 启动事件循环,并在线程中运行 Qt 事件循环。
ps:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步

创建一个新线程

  1. class Thread(QThread):
  2. def __init__(self):
  3. super().__init__()
  4. def run(self):
  5. # 线程相关代码
  6. pass
  7. # 创建一个新的线程
  8. thread = Thread()
  9. thread.start()

在使用线程时可以直接得到 Thread 实例,调用其 start() 函数即可启动线程,线程启动后,会调用其实现的 run 方法,该方法就是线程的执行函数,当 run() 退出之后线程基本就结束了。

QThread 中常用的方法

【PyQt5】PyQt5 多线程 QThread 实现

例子实现

下面的例子通过在 QThread 中定义两个自定义信号实现时间的变化和动态为 QListWidget 添加控件

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Created on 2019年1月16日
  5. @author: yiluo
  6. @site: https://github.com/bingshilei
  7. @email: 786129166@qq.com
  8. @file: QThreadDemo2
  9. @description: 使用多线程动态添加控件
  10. """
  11. import time
  12. from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
  13. from PyQt5.QtWidgets import QWidget, QLineEdit, QListWidget, QPushButton,\
  14. QVBoxLayout, QLabel
  15. '''
  16. 声明线程类
  17. '''
  18. class addItemThread(QThread):
  19. add_item = pyqtSignal(str)
  20. show_time = pyqtSignal(str)
  21. '''
  22. 添加控件
  23. '''
  24. def __init__(self,*args, **kwargs):
  25. super(addItemThread, self).__init__(*args, **kwargs)
  26. self.num = 0
  27. def run(self, *args, **kwargs):
  28. while True:
  29. file_str = 'File index{0}'.format(self.num,*args, **kwargs)
  30. self.num +=1
  31. #发送添加信号
  32. self.add_item.emit(file_str)
  33. date = QDateTime.currentDateTime()
  34. currtime = date.toString('yyyy-MM-dd hh:mm:ss')
  35. print(currtime)
  36. self.show_time.emit(str(currtime))
  37. time.sleep(1)
  38. class Window(QWidget):
  39. def __init__(self, *args, **kwargs):
  40. super(Window, self).__init__(*args, **kwargs)
  41. self.setWindowTitle('多线程动态添加控件')
  42. # x,y,w,h
  43. self.setGeometry(800, 100, 500, 750)
  44. #创建QListWidget控件
  45. self.listWidget = QListWidget()
  46. #创建按钮控件
  47. self.btn = QPushButton('开始',self)
  48. self.lb = QLabel('显示时间',self)
  49. #创建布局控件
  50. self.vlayout = QVBoxLayout()
  51. #将按钮和列表控件添加到布局
  52. self.vlayout.addWidget(self.btn)
  53. self.vlayout.addWidget(self.lb)
  54. self.vlayout.addWidget(self.listWidget)
  55. #设置窗体的布局
  56. self.setLayout(self.vlayout)
  57. #绑定按钮槽函数
  58. self.btn.clicked.connect(self.startThread)
  59. #声明线程实例
  60. self.additemthread = addItemThread()
  61. #绑定增加控件函数
  62. self.additemthread.add_item.connect(self.addItem)
  63. #绑定显示时间函数
  64. self.additemthread.show_time.connect(self.showTime)
  65. '''
  66. @description:按钮开始,启动线程
  67. '''
  68. def startThread(self):
  69. #按钮不可用
  70. self.btn.setEnabled(False)
  71. #启动线程
  72. self.additemthread.start()
  73. '''
  74. @description:为listwidget增加项
  75. @param:项的值
  76. '''
  77. def addItem(self,file_str):
  78. self.listWidget.addItem(file_str)
  79. '''
  80. @description:显示时间
  81. @param:项的值
  82. '''
  83. def showTime(self,time):
  84. self.lb.setText(time)
  85. if __name__ == '__main__':
  86. import sys
  87. from PyQt5.QtWidgets import QApplication
  88. app = QApplication(sys.argv)
  89. w = Window()
  90. w.show()
  91. sys.exit(app.exec_())

运行结果

点击开始按钮,时间会进行变化,且在下方为 QListWidget 不断增加项

【PyQt5】PyQt5 多线程 QThread 实现(转载)

【PyQt5】PyQt5 多线程 QThread 实现(转载)

以上,就是自定义信号和 QThread 的运用。

总结:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此我整理啦从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF等】需要的可以进Python全栈开发交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面有最新Python教程项目可拿,不懂的问题有老司机解决哦,一起相互监督共同进步
本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

发表评论

表情:
评论列表 (有 0 条评论,124人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PyQt5篇】线

    这是因为QThread类提供了一个事件循环,可以在后台处理线程的任务,而不会影响到线程的响应性。,当在主线程中执行耗时操作时(例如click_1方法中的for循环),它。...

    相关 PyQt5定时器

    想必大家都知道呢定时器的功能,就是在固定的一段时间内执行一段逻辑,下面我们来一起分析下,首先看一段代码 自定义object对象,重写里面的timerEvent方法