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实现的二叉树算法和kmp算法实例
Apr 25 Python
Python实现把数字转换成中文
Jun 29 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Tensorflow环境搭建的方法步骤
Feb 07 Python
Python中常见的异常总结
Feb 20 Python
Python unittest单元测试框架总结
Sep 08 Python
Python可迭代对象操作示例
May 07 Python
python中的数据结构比较
May 13 Python
Python识别html主要文本框过程解析
Feb 18 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
详解python内置模块urllib
Sep 09 Python
Python序列化模块JSON与Pickle
Jun 05 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
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
拓展培训心得体会
2014/01/04 职场文书
优秀村官事迹材料
2014/01/10 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
2014年纠风工作总结
2014/12/08 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js
在Docker容器中部署SQL Server
2022/04/11 Servers