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基于phantomjs实现导入图片
May 13 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
Django内容增加富文本功能的实例
Oct 17 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
Python smtplib实现发送邮件功能
May 22 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
python制作简单五子棋游戏
Jun 18 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
Python实现数值积分方式
Nov 20 Python
Python内置函数locals和globals对比
Apr 28 Python
如何向scrapy中的spider传递参数的几种方法
Nov 18 Python
python用opencv 图像傅里叶变换
Jan 04 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公用函数列表[正则]
2007/02/22 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python日期操作学习笔记
2008/10/07 Python
Python中下划线的使用方法
2015/03/27 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
python实现视频读取和转化图片
2019/12/10 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
如何在pycharm中安装第三方包
2020/10/27 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
运动会通讯稿500字
2014/02/20 职场文书
入职担保书范文
2014/05/21 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
创业计划书之酒吧
2019/12/02 职场文书
pyqt5打包成exe可执行文件的方法
2021/05/14 Python
详解Vue的options
2021/05/15 Vue.js
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
JavaScript实现简单拖拽效果
2021/09/15 Javascript
Vue深入理解插槽slot的使用
2022/08/05 Vue.js