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编程之多态用法实例详解
May 19 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python 判断奇数偶数的方法
Dec 20 Python
python求质数列表的例子
Nov 24 Python
关于sys.stdout和print的区别详解
Dec 05 Python
python isinstance函数用法详解
Feb 13 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
基于python实现对文件进行切分行
Apr 26 Python
python进行参数传递的方法
May 12 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
python单例模式的应用场景实例讲解
Feb 24 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
使用adodb lite解决问题
2006/12/31 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
js表头排序实现方法
2015/01/16 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JavaScript中string对象
2015/06/12 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python3中的json模块使用详解
2018/05/05 Python
python 同时运行多个程序的实例
2019/01/07 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python类及获取对象属性方法解析
2020/06/15 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书