Pyqt5安装并配置到pycharm方法:完全弄懂如何用pycharm安装pyqt5及其相关配置

Pyqt5播放视频:Pyqt5:使用Qlabel标签进行视频播放

本内容是根据之前写的内容(Pyqt5播放视频)进行修改。

pyqt5处理多线程主要有三种方法:

  1. 使用计时器模块QTimer
  2. 使用多线程模块QThread
  3. 使用事件处理功能

QTimer相当于一个定时器,每当定时器时间溢出后,会执行相关的函数。这个时候程序会从主线程界面跳到QTimer函数中,如果QTimer函数中有延时或者处理时间较长,就会出现界面失去响应,造成界面卡顿的现象。

QThread等于新开一个线程专门处理耗时间的程序,UI主线程显示界面,当子线程处理好数据后通过自定义的信号与槽,将数据交给主线程刷新界面。由于UI主线程一直运行,子线程的延时,耗时程序与主线程无关,所以不会有卡顿的现象。

事件处理功能相当于在耗时的程序中,主动刷新界面,使人觉得流畅。

通过QThread实现多线程:

Qt有两种多线程的方法

第一种:是继承QThread的run函数

第二种:是把一个继承于QObject的类用moveToThread函数转移到一个Thread里。

本例程中是使用第一种方法。

class VedioThread(QThread):sinout = pyqtSignal(str) # 自定义信号,执行run()函数时,从相关线程发射此信号def __init__(self):super(VedioThread, self).__init__()def run(self):# 需要执行的内容xxxxx# 定义的槽函数,当xxxxx执行完成后就向UI界面(调用多线程的程序)发送一个指令,并让UI界面执行相应的内容。# str(1)-->发送的值,该值可以是xxxxx执行后返回的值,也可以是任意值(表示是否执行另一程序)self.sinout.emit(str(1))
        self.timeThread = VedioThread()  # 调用线程的程序self.timeThread.start()  # 开启线程self.timeThread.sinout.connect(self.xxxx)  # 接受到槽函数的值之后要执行的程序

源码

实例内容:UI播放视频,后台打印0-9,打印到9后,停止播放视频

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.uic import loadUiType
import cv2
import sys
import timevedio_ui, _ = loadUiType('./UI/vedio.ui')class VedioGui(QMainWindow, vedio_ui):# 定义构造方法def __init__(self):QMainWindow.__init__(self)self.setupUi(self)self.timer_camera = QTimer()self.handle_buttons()self.result_label.setText("按下start播放视频")self.open_vedio()self.timeThread = VedioThread()self.timeThread.sinout.connect(self.show_Stop)  # 将show_Stop与槽函数相连# 所有Button的消息与槽的通信def handle_buttons(self):self.btn_Start.clicked.connect(self.Btn_Start)self.btn_Stop.clicked.connect(self.Btn_Stop)def Btn_Start(self):self.timeThread.start()  # 开启线程# 定时器开启,每隔一段时间,读取一帧self.timer_camera.start(100)self.timer_camera.timeout.connect(self.OpenFrame)self.result_label.setText("正在播放")def Btn_Stop(self):# self.cap.release()self.timer_camera.stop()self.result_label.setText("停止播放,按下start再次播放")def open_vedio(self):"""选取视频文件"""# 这里以mp4和avi视频播放为例openfile_name = QFileDialog.getOpenFileName(self, 'chose files', '', 'Image files(*.mp4 *.avi)')  # 打开文件选择框选择文件self.file_name = openfile_name[0]  # 获取图片名称# 得到文件后缀名  需要根据情况进行修改suffix = self.file_name.split("/")[-1][self.file_name.split("/")[-1].index(".") + 1:]# print(self.file_name, suffix)if self.file_name == '':passelif suffix == "mp4" or suffix == "avi":self.cap = cv2.VideoCapture(self.file_name)def OpenFrame(self):ret, image = self.cap.read()if ret:if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)elif len(image.shape) == 1:vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_Indexed8)else:vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)self.vedio_label.setPixmap(QPixmap(vedio_img))self.vedio_label.setScaledContents(True)  # 自适应窗口else:self.cap.release()self.timer_camera.stop()def show_Stop(self):self.Btn_Stop()# 界面关闭事件,询问用户是否关闭def closeEvent(self, event):reply = QMessageBox.question(self, '退出', "是否要退出该界面?",QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:self.close()event.accept()else:event.ignore()def show_print():for i in range(10):print(i)time.sleep(1)class VedioThread(QThread):sinout = pyqtSignal(int)def __init__(self):super(VedioThread, self).__init__()def run(self):# 需要执行的内容show_print()# 发出信号self.sinout.emit(1)if __name__ == "__main__":app = QApplication(sys.argv)window = VedioGui()window.show()sys.exit(app.exec_())

Pyqt5:使用多线程QThread相关推荐

  1. python服务器qt客户端_python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例...

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import ( ...

  2. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  3. PyQt5+socket+多线程,实现简单聊天室

    之前从没想过自己设计一套网络聊天室出来,但网络原理实验的时候老师说:"谁做出来了,就给谁加分",于是我(内卷王)又开始(偷偷地背着全班同学)自己做起了这一个实验项目.实验项目的主要 ...

  4. pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。

    渣渣用法,请等待我心情好的时候更新. 1.第一个例子 1.1 先看mainwindow.py from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Ma ...

  5. PyQT5线程:多线程(QThread),线程锁(QMutex)

    在编写GUI界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问 ...

  6. 【PyQt5】:QThread:Destroyed while thread is still running 解决方法

    PyQt5在执行多线程的时候遇到:QThread:Destroyed while thread is still running 错误分析: QThread的子线程还在运行但是线程就被销毁了,导致程序 ...

  7. PyQt5界面多线程多进程爬虫(爬了600w张网页, 出现了一些问题)

    有个问题没解决: 将运行过程显示在右边的界面框里的光标问题(光标问题容易解决), 及异常退出的问题. 错误代码: QObject::connect: Cannot queue arguments of ...

  8. pyqt5+mysql+多线程爬虫实现 python 携程机票爬虫 数据可视化

    基本目录 数据来源与获取方法 数据来源 网页分析 实现效果 完整代码与说明文档 数据来源与获取方法 数据来源 携程机票查询https://flights.ctrip.com/online/channe ...

  9. pyqt5多线程使用方法及学习案例(QThread)

    在使用pyqt5的过程中,会存在界面卡死的现象,为了优化改善,可以利用多线程来解决此类问题.可以实现信号与槽在多个线程中的相互传递数据. 用法很简单,创建一个进程类,不同触发时刻分别调用即可. 参考案 ...

最新文章

  1. .net 访问 geoserver 发布的 wms   跨域问题解决方案
  2. 学习如何面对失败比成功更重要
  3. Linux 查看当前用户id和组id
  4. 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
  5. 刷固件Layer1到手机FLASH(硬刷)
  6. Android—RxJava库知识
  7. guice注入带参构造器_带有Guice的富域模型
  8. 云通讯短信验证码实例
  9. 动态换ip如何实现_三种方法解决动态换IP需求
  10. java与平台无关的原因
  11. [ZJOI 2006]书架
  12. python数据分类方法_Python数据挖掘—分类—贝叶斯分类
  13. [笔记][原创]74HC595芯片使用方法介绍
  14. 如何免费在本地播放flv格式的视频
  15. Manjaro安装教程
  16. java获取发送时间间隔工具类,1秒前,1分钟前,1小时前...
  17. wpa_supplicant驱动移植
  18. c语言课程设计作业个人所得税计算,C Prime Plus 5th Edition 练习-个人所得税计算
  19. HBase的编程实践(实验3_熟悉常用的HBase操作)
  20. Java与go哪个更适合新手,零基础学哪个好?

热门文章

  1. java tomcat eclipse 环境变量配置
  2. 添加简单的linux内核模块,操作系统实践 第12章-添加最简单的Linux内核模块.ppt
  3. python的进程和线程定位_Python | 进程 线程的理解拾遗
  4. 4地形编辑插件_SketchUp高效建模插件
  5. oracle查询最近十条数据_Oracle-查询最近更新的前10条数据
  6. python从入门到_Python学习路线从入门到上手,如何快速Python学习?
  7. 好用的书法字体素材,可以用于各种项目;从商标和品牌到邀请、海报等
  8. UI设计素材|等轴测图(2.5D插画)
  9. hashmap是单向链表吗_HashMap源码大剖析
  10. ansys 内聚力模型_《ANSYS Workbench有限元分析实例详解(静力学)》,9787115446312