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使用pymysql小技巧
Jun 04 Python
python实现百度语音识别api
Apr 10 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
pygame实现简易飞机大战
Sep 11 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python Tensor和Array对比分析
Jan 08 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
Apr 03 Python
django正续或者倒序查库实例
May 19 Python
Python实现SMTP邮件发送
Jun 16 Python
python缺失值填充方法示例代码
Dec 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
PHP+DBM的同学录程序(1)
2006/10/09 PHP
一个用于网络的工具函数库
2006/10/09 PHP
如何使用Strace调试工具
2013/06/03 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
ThinkPHP的模版中调用session数据的方法
2014/07/01 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
python实现Flappy Bird源码
2018/12/24 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
python创建学生成绩管理系统
2019/11/22 Python
Python continue语句实例用法
2020/02/06 Python
python脚本和网页有何区别
2020/07/02 Python
Python colormap库的安装和使用详情
2020/10/06 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
俄罗斯儿童和青少年服装、鞋子及配件的在线商店:Orby
2020/02/20 全球购物
主题酒店策划书
2014/01/28 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
购房协议书
2014/04/11 职场文书
家庭教育的心得体会
2014/09/01 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
南京导游词
2015/02/03 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
Redis 配置文件重要属性的具体使用
2021/05/20 Redis