PyQt5 pyqt多线程操作入门


Posted in Python onMay 05, 2018

首先来看一个例子:

# coding=utf-8 
__author__ = 'a359680405'  
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import *  
global sec 
sec=0 
def setTime(): 
  global sec 
  sec+=1 
  lcdNumber.display(sec)     #LED显示数字+1  
def work(): 
  timer.start(1000)        #计时器每秒计数 
  for i in range(2000000000): 
    pass 
  timer.stop()  
app=QApplication([]) 
top=QWidget() 
layout=QVBoxLayout(top)       #垂直布局类QVBoxLayout; 
lcdNumber=QLCDNumber()       #加个显示屏 
layout.addWidget(lcdNumber) 
button=QPushButton("测试") 
layout.addWidget(button)  
timer=QTimer() 
timer.timeout.connect(setTime)   #每次计时结束,触发setTime 
button.clicked.connect(work)  
top.show() 
app.exec()

我们的主界面有一个用于显示时间的 LCD 数字面板还有一个用于启动任务的按钮。程序的目的是用户点击按钮,开始一个非常耗时的运算(程序中我们以一个 2000000000 次的循环来替代这个非常耗时的工作,在真实的程序中,这可能是一个网络访问,可能是需要复制一个很大的文件或者其它任务),同时 LCD 开始显示逝去的毫秒数。毫秒数通过一个计时器QTimer进行更新。计算完成后,计时器停止。这是一个很简单的应用,也看不出有任何问题。但是当我们开始运行程序时,问题就来了:点击按钮之后,程序界面直接停止响应,直到循环结束才开始重新更新,于是计时器使用显示0。

有经验的开发者立即指出,这里需要使用线程。这是因为 Qt 中所有界面都是在 UI 线程中(也被称为主线程,就是执行了QApplication::exec()的线程),在这个线程中执行耗时的操作(比如那个循环),就会阻塞 UI 线程,从而让界面停止响应。界面停止响应,用户体验自然不好,不过更严重的是,有些窗口管理程序会检测到你的程序已经失去响应,可能会建议用户强制停止程序,这样一来你的程序可能就此终止,任务再也无法完成。所以,为了避免这一问题,我们要使用 QThread 开启一个新的线程:

# coding=utf-8 
__author__ = 'a359680405'  
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import *  
global sec 
sec=0 
class WorkThread(QThread): 
  trigger = pyqtSignal() 
  def __int__(self): 
    super(WorkThread,self).__init__() 
 
  def run(self): 
    for i in range(203300030): 
      pass 
    self.trigger.emit()     #循环完毕后发出信号 
 
def countTime(): 
  global sec 
  sec+=1 
  lcdNumber.display(sec)     #LED显示数字+1 
 
def work(): 
  timer.start(1000)        #计时器每秒计数 
  workThread.start()       #计时开始 
  workThread.trigger.connect(timeStop)  #当获得循环完毕的信号时,停止计数 
 
def timeStop(): 
  timer.stop() 
  print("运行结束用时",lcdNumber.value()) 
  global sec 
  sec=0  
app=QApplication([]) 
top=QWidget() 
layout=QVBoxLayout(top)       #垂直布局类QVBoxLayout; 
lcdNumber=QLCDNumber()       #加个显示屏 
layout.addWidget(lcdNumber) 
button=QPushButton("测试") 
layout.addWidget(button)  
timer=QTimer() 
workThread=WorkThread() 
button.clicked.connect(work) 
timer.timeout.connect(countTime)   #每次计时结束,触发setTime  
top.show() 
app.exec()

我增加了一个WorkerThread类。WorkerThread继承自QThread类,重写了其run()函数。可以认为,run()函数就是新的线程需要执行的代码。在这里就是要执行这个循环,然后发出计算完成的信号。而在按钮点击的槽函数中,使用work()中的workThread.start()函数启动一个线程(注意,这里不是run()函数)。再次运行程序,你会发现现在界面已经不会被阻塞了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
pygame实现简易飞机大战
Sep 11 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
Python实现括号匹配方法详解
Feb 10 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
解决echarts中饼图标签重叠的问题
May 16 Python
Python3如何在服务器打印资产信息
Aug 27 Python
python/golang 删除链表中的元素
Sep 14 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 #Python
python中in在list和dict中查找效率的对比分析
May 04 #Python
Django如何配置mysql数据库
May 04 #Python
Python实现求一个集合所有子集的示例
May 04 #Python
python list是否包含另一个list所有元素的实例
May 04 #Python
Python判断两个list是否是父子集关系的实例
May 04 #Python
python判断一个集合是否为另一个集合的子集方法
May 04 #Python
You might like
PHP对字符串的递增运算分析
2010/08/08 PHP
PHP模板解析类实例
2015/07/09 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
Python中列表(list)操作方法汇总
2014/08/18 Python
python实现的文件夹清理程序分享
2014/11/22 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Django查询数据库的性能优化示例代码
2017/09/24 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
Python中的类与类型示例详解
2019/07/10 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
中学生家长评语大全
2014/04/16 职场文书
保险专业求职信
2014/07/07 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
幼儿园六一儿童节活动总结
2015/02/10 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书