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列表与元组详解实例
Nov 01 Python
用Python编写简单的微博爬虫
Mar 04 Python
python实时分析日志的一个小脚本分享
May 07 Python
利用python写个下载teahour音频的小脚本
May 08 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
Windows下安装Django框架的方法简明教程
Mar 28 Python
python模块导入的细节详解
Dec 10 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
解决Django一个表单对应多个按钮的问题
Jul 18 Python
Django用户认证系统 组与权限解析
Aug 02 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
Pygame Event事件模块的详细示例
Nov 17 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/07/08 PHP
解析csv数据导入mysql的方法
2013/07/01 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
PHP实现的激活用户注册验证邮箱功能示例
2017/06/06 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
javascript显示选择目录对话框的代码
2008/11/10 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
实现python版本的按任意键继续/退出
2016/09/26 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
python如何编写win程序
2020/06/08 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
Yahoo-PHP面试题4
2012/05/05 面试题
电大学习个人自我评价范文
2013/10/04 职场文书
八年级生物教学反思
2014/01/22 职场文书
新春联欢会主持词
2014/03/24 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
初三语文教学反思
2016/03/03 职场文书
优秀大学生申请书
2019/06/24 职场文书
z-index不起作用
2021/03/31 HTML / CSS
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
python3读取文件指定行的三种方法
2021/05/24 Python
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android