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中进行自动化单元测试的教程
Apr 15 Python
详解python3百度指数抓取实例
Dec 12 Python
python+matplotlib实现礼盒柱状图实例代码
Jan 16 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
详解python解压压缩包的五种方法
Jul 05 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 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
在 PHP 中使用随机数的三个步骤
2006/10/09 PHP
基于mysql的论坛(1)
2006/10/09 PHP
phpmyadmin的#1251问题
2006/11/25 PHP
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
thinkphp中的多表关联查询的实例详解
2017/10/12 PHP
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 语法
2015/01/09 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
浅析script标签中的defer与async属性
2016/11/30 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
js实现带有动画的返回顶部
2020/08/09 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python 实现在txt指定行追加文本的方法
2018/04/29 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
几个SQL的面试题
2014/03/08 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
大家访活动实施方案
2014/03/10 职场文书
教师求职信范文
2014/05/24 职场文书
乡镇团代会开幕词
2016/03/04 职场文书