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大牛 应该都有这份书单
Oct 31 Python
python实现基于SVM手写数字识别功能
May 27 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
基于python中theano库的线性回归
Aug 31 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
python django生成迁移文件的实例
Aug 31 Python
python实现字典嵌套列表取值
Dec 16 Python
python 线程的五个状态
Sep 22 Python
Python Process创建进程的2种方法详解
Jan 25 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 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读取和编写XML DOM的实现代码
2011/02/03 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php中动态变量用法实例
2015/06/10 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Python的多态性实例分析
2015/07/07 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
python和php哪个更适合写爬虫
2020/06/22 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
海飞丝的广告词
2014/03/20 职场文书
加油口号大全
2014/06/13 职场文书
升国旗演讲稿
2014/09/05 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python
Python基本数据类型之字符串str
2021/07/21 Python