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 json encode datetime类型
Dec 28 Python
python自动化测试之setUp与tearDown实例
Sep 28 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
Python连接mssql数据库编码问题解决方法
Jan 01 Python
Python实现发送QQ邮件的封装
Jul 14 Python
python实现用户答题功能
Jan 17 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
使用python进行拆分大文件的方法
Dec 10 Python
python实现加密的方式总结
Jan 19 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
django orm模块中的 is_delete用法
May 20 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-fpm.service not found问题的办法
2017/06/06 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
js点击文本框后才加载验证码实例代码
2015/10/20 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
英国网上超市:Ocado
2020/03/05 全球购物
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
团代会主持词
2014/04/02 职场文书
幼儿园门卫岗位职责范本
2014/07/02 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
统计学教授推荐信
2014/09/18 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
民事撤诉申请书范本
2015/05/18 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS