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 解析XML文件
Apr 15 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
Jan 03 Python
Python中的函数作用域
May 07 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
Python3如何实现Win10桌面自动切换
Aug 11 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
Python批量获取并保存手机号归属地和运营商的示例
Oct 09 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
多重?l件?合查?(一)
2006/10/09 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
javascript下有关dom以及xml节点访问兼容问题
2007/11/26 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
浅谈Python单向链表的实现
2015/12/24 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
django将数组传递给前台模板的方法
2019/08/06 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python动态视频下载器的实现方法
2019/09/16 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
Django视图、传参和forms验证操作
2020/07/15 Python
详解Anaconda 的安装教程
2020/09/23 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
mysql 获取相邻数据项
2022/05/11 MySQL