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多进程实现进程间通信实例
Nov 24 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
python使用folium库绘制地图点击框
Sep 21 Python
Django中使用Celery的方法示例
Nov 29 Python
Python assert语句的简单使用示例
Jul 28 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
利用Python复制文件的9种方法总结
Sep 02 Python
python异步编程 使用yield from过程解析
Sep 25 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
Python爬虫教程之利用正则表达式匹配网页内容
Dec 08 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 调试利器debug_print_backtrace()
2012/07/23 PHP
PHP防止跨域提交表单
2013/11/01 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
深入浅析php json 格式控制
2015/12/24 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
php文件缓存方法总结
2016/03/16 PHP
PHP读取word文档的方法分析【基于COM组件】
2017/08/01 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python反编译学习之字节码详解
2019/05/19 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
.NET面试题:什么是反射
2016/09/30 面试题
自我鉴定范文300字
2013/10/01 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
民政工作个人总结
2015/02/28 职场文书
环保证明
2015/06/23 职场文书