PyQt5 pyqt多线程操作入门

首先来看一个例子:

# 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()函数)。再次运行程序,你会发现现在界面已经不会被阻塞了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解pyqt5 动画在QThread线程中无法运行问题
  • PyQt5实现拖放功能
  • python3+PyQt5实现自定义分数滑块部件
  • python3+PyQt5实现自定义流体混合窗口部件
  • python3+PyQt5实现拖放功能
  • python3+PyQt5使用数据库表视图
  • python3+PyQt5使用数据库窗口视图
  • python3+PyQt5实现文档打印功能
  • python3+PyQt5实现柱状图
(0)

相关推荐

  • python3+PyQt5实现自定义分数滑块部件

    本文通过Python3+PyQt5实现自定义部件–分数滑块.它既能支持键盘也支持鼠标,使用物理(视口)坐标通过绘制方式显示. #!/usr/bin/env python3 import platform from PyQt5.QtCore import (QPointF, QRectF, QSize, Qt,pyqtSignal) from PyQt5.QtWidgets import (QApplication, QDialog,QSizePolicy, QGridLayout, QLCDNu

  • 详解pyqt5 动画在QThread线程中无法运行问题

    自己做了一个tcp工具,在学习动画的时候踩了坑,需求是根据上线变绿色,离线变灰色,如果连接断开了,则变为灰色 问题现象: 可以看到点击"连接","离线"的时候动画是正常的,但是当tcp超时断开后,虽然离线按钮变为连接了,却没有执行离线动画 关键源代码如下 class BSJTcpThread(QtCore.QThread): recv_signal = QtCore.pyqtSignal(str) send_signal = QtCore.pyqtSignal(st

  • python3+PyQt5使用数据库窗口视图

    能够为数据库数据提供的最简单的用户界面之一就是窗体,窗体可以一次性呈现出来自同一记录的各个域.本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子. #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (QDate, QDateTime, QFile, QVariant, Qt) from PyQt5.QtWidgets import (QApplication, QDa

  • python3+PyQt5实现拖放功能

    本文是对<Python Qt GUI快速编程>的第10章的例子拖放用Python3+PyQt5进行改写,对图表列表,表格等进行相互拖放,基本原理雷同,均采用setAcceptDrops(True)和setDragEnabled(True). #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QApplication, QDialog, QHBo

  • python3+PyQt5实现柱状图

    本文通过Python3+pyqt5实现了python Qt GUI 快速编程的16章的excise例子. #!/usr/bin/env python3 import random import sys from PyQt5.QtCore import (QAbstractListModel, QAbstractTableModel, QModelIndex, QSize, QTimer, QVariant, Qt,pyqtSignal) from PyQt5.QtWidgets import (

  • python3+PyQt5实现自定义流体混合窗口部件

    本文通过Python3+PyQt5实现自定义部件–流体混合窗口部件.通过逻辑(窗口)坐标绘制而成.调用setWindow,所有的绘制工作都会根据逻辑坐标系发生. #!/usr/bin/env python3 from PyQt5.QtCore import (QPointF, QSize, Qt,pyqtSignal) from PyQt5.QtWidgets import (QApplication, QFrame, QLabel, QSizePolicy, QSpinBox, QWidget

  • PyQt5实现拖放功能

    在这节教程中,我们将探讨PyQt5中的拖放操作. 在计算机图形用户界面(GUI)中,拖放是在某个虚拟对象上点击并拖动到另一个位置或虚拟对象上的操作.它通常用于调用多个动作,或为两个抽象对象创建某些联系. 拖放是图形用户界面的一部分.拖放可以使用户直观地完成某些复杂的操作. 通常我们可以对两种事物进行拖放操作:数据或某些图形对象.如果我们将某个应用中的图片拖放到另一个应用,我们拖放的是二进制数据.如果将Firefox的某个标签页拖放到其他地方,我们拖放的是一个图形组件. 简单的拖放 在第一个示例中

  • python3+PyQt5使用数据库表视图

    上文提到窗体可以一次性呈现出来自同一记录的各个域,但是对于用户希望能看到多条记录的表来说,就需要使用表格化的视图了.本文通过python3+pyqt5改写实现了python Qt gui 快速变成15章的例子,用户能够一次看到多条记录. #!/usr/bin/env python3 import os import sys from PyQt5.QtCore import (PYQT_VERSION_STR, QDate, QFile, QRegExp, QVariant, QModelInde

  • python3+PyQt5实现文档打印功能

    本文通过Python3+PyQt5实现<python Qt Gui 快速编程>这本书13章文档打印功能.本文共通过三种方式: 1.使用HTML和QTextDOcument打印文档 2.使用QTextCusor和QTextDocument打印文档 3.使用QPainter打印文档 使用Qpainter打印文档比QTextDocument需要更操心和复杂的计算,但是QPainter确实能够对输出赋予完全控制. #!/usr/bin/env python3 import math import sy

  • PyQt5 pyqt多线程操作入门

    首先来看一个例子: # 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) #计

  • Python基于多线程操作数据库相关问题分析

    本文实例分析了Python多线程操作数据库相关问题.分享给大家供大家参考,具体如下: python多线程并发操作数据库,会存在链接数据库超时.数据库连接丢失.数据库操作超时等问题. 解决方法:使用数据库连接池,并且每次操作都从数据库连接池获取数据库操作句柄,操作完关闭连接返回数据库连接池. *连接数据库需要设置charset = 'utf8', use_unicode = True,不然会报中文乱码问题 *网上说解决python多线程并发操作数据库问题,连接时使用self.conn.ping(T

  • Python3多线程操作简单示例

    本文实例讲述了Python3多线程操作.分享给大家供大家参考,具体如下: python3 线程中常用的两个模块为: _thread threading(推荐使用) thread 模块已被废弃.用户可以使用 threading 模块代替.所以,在 python3 中不能再使用"thread" 模块.为了兼容性,python3 将 thread 重命名为 "_thread". test.py # -*- coding:utf-8 -*- #!/usr/bin/pytho

  • PYQT5 vscode联合操作qtdesigner的方法

    除了使用pycharm外,还可使用vscode来操作pyqt,方法如下: 1. 在vscode中配置相关的pyqt的相关 根据自己实际情况修改第一项pyqt的路径 2. 创建一个文件夹,右键,最后一项可以创建一个新窗口 创建的新窗口后缀为 .ui 右键中有以下四个选项,分别是创建一个新窗口,预览,编辑,编译产生py文件. 我们在designer中设计完成后,通过最后一个编译生成文件. 通过pycharm生成的为一个和designer一样的py文件,如上图中第二个文件.通过vscode生成的是以U

  • Python多线程操作之互斥锁、递归锁、信号量、事件实例详解

    本文实例讲述了Python多线程操作之互斥锁.递归锁.信号量.事件.分享给大家供大家参考,具体如下: 互斥锁: 为什么要有互斥锁:由于多线程是并行的,如果某一线程取出了某一个数据将要进行操作,但它还没有那么快执行完操作,这时候如果另外一个线程也要操作这个数据,那么这个数据可能会因为两次操作而发生错误 import time,threading x=6 def run1(): print("run1我拿到了数据:",x) print("我现在还不想操作,先睡一下")

  • java多线程从入门到精通看这篇就够了

    目录 一.认识线程及线程的创建 1.线程的概念 2.线程的特性 3.线程的创建方式 <1>继承Thread类 <2>实现Runnable接口 <3>实现Callable接口 二.线程的常用方法 1.构造方法和属性的获取方法 2.常用方法 <1>run()和start() <2>interrupt()方法 <3>join方法 <4>获取当前线程的引用currentThread();方法 <5>休眠当前线程slee

  • PHP 字符串操作入门教程

    无论哪种语言,字符串操作都是一个重要的基础,往往是简单而重要.正像人说话一样,一般有形体(图形界面),有语言(print 字符串?),显然字符串能解释更多的东西.PHP提供了大量的字符串操作函数,功能强大,使用也比较简单,详细请参看 http://cn2.php.net/manual/zh/ref.strings.php . 以下将简单的讲述它的功能和特性. 弱类型 PHP是弱类型语言,所以其它类型的数据一般可以直接应用于字符串操作函数里,而自动转换成字符串类型,进行处理,如: echo sub

  • PHP使用Pthread实现的多线程操作实例

    本文实例讲述了PHP使用Pthread实现的多线程操作.分享给大家供大家参考,具体如下: <?php class vote extends Thread { public $res = ''; public $url = array(); public $name = ''; public $runing = false; public $lc = false; public function __construct($name) { $this->res = '暂无,第一次运行.'; $th

  • python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice, QRegExp, Qt) from PyQt5.QtWidgets import (QApplication, QDateEdit, QFrame, QGridLayout, QHBoxLayout, QLabel

  • c++11新特性多线程操作实战

    c++11多线程操作 线程 thread int main() { thread t1(Test1); t1.join(); thread t2(Test2); t2.join(); thread t3 = t1; thread t4(t1); thread t5 = std::move(t1); thread t6(std::move(t1)); return 0; } t3,t4创建失败,因为thread的拷贝构造和赋值运算符重载的原型是: thread(const thread&) = d

随机推荐