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 threading多线程编程实例
Sep 18 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
获取Django项目的全部url方法详解
Oct 26 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
Python实现的求解最小公倍数算法示例
May 03 Python
PyCharm代码格式调整方法
May 23 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
在python 中实现运行多条shell命令
Jan 07 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
pandas中pd.groupby()的用法详解
Jun 16 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
拼音码表的生成
2006/10/09 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
简单实现python爬虫功能
2015/12/31 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
parser.add_argument中的action使用
2020/04/20 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
Android面试题附答案
2014/12/08 面试题
护士自荐信怎么写
2013/10/18 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
项目验收申请报告
2015/05/15 职场文书
文艺晚会开场白
2015/05/29 职场文书