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 splitlines使用技巧
Sep 06 Python
centos下更新Python版本的步骤
Feb 12 Python
Python脚本实现下载合并SAE日志
Feb 10 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
Python求正态分布曲线下面积实例
Nov 20 Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
Python音乐爬虫完美绕过反爬
Aug 30 Python
python中 Flask Web 表单的使用方法
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+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
Document 对象的常用方法
2009/07/31 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
javascript实现滑动解锁功能
2014/12/31 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
layui分页效果实现代码
2017/05/19 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
js实现筛选功能
2020/11/24 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python占位符输入方式实例
2019/05/27 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
个人党性剖析材料
2014/02/03 职场文书
工程资料员岗位职责
2014/03/10 职场文书
行政办公室岗位职责
2014/03/18 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
贷款担保书
2015/01/20 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
python如何查找列表中元素的位置
2022/05/30 Python
Python+pyaudio实现音频控制示例详解
2022/07/23 Python