当前位置: 首页 > news >正文

界面开发(4)--- PyQt5实现打开图像及视频播放功能

PyQt5创建打开图像及播放视频页面

上篇文章主要介绍了如何实现登录界面的账号密码注册及登录功能,还简单介绍了有关数据库的连接方法。这篇文章我们介绍一下如何在设计的页面中打开本地的图像,以及实现视频播放功能。

实现打开图像功能

为了便于记录实现细节,我们尽量一步步地来。之前的文章已经介绍过如何将新的页面与之前的页面建立连接了,这里就不再赘述,从建立新页面开始。

  1. 首先将label拖到屏幕中央,并在左侧设计成合适的宽和高,用于显示图像和视频。

在这里插入图片描述

  1. 这个label是透明的,为了方便展示,我们为它填充个黑色,呈现出一种幕布的感觉。
  • 使用鼠标右击 label 中心,点击改变样式表;
  • 点击添加颜色,background-color;
  • 选择黑色,点击ok;
  • 然后再点击Apply,最后点击ok。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 之后,在下面拖入 Push Button 按钮和 Text Browser 按钮,分别用于打开本文文件,以及显示打开的路径。

在这里插入图片描述

做到这里基础界面就算完成了,将其保存,并使用PyUIC工具转化为.py文件,剩下的部分就剩编写逻辑代码了。

在显示图像方面,我们主要的思想就是通过点击“打开文件”按钮,来选取本地库中的图像,并把路径显示到文本框中。self.image的取值用来判断选取的不是图像的情况。核心代码如下:

class Image_open(QMainWindow, image.Ui_MainWindow):def __init__(self, parent=None):super(Image_open, self).__init__(parent)# UI界面self.setupUi(self)self.pushButton.clicked.connect(self.open_image)def open_image(self):self.image = None# 获取图像的路径self.img_path = QFileDialog.getOpenFileName()[0]# 将路径存储到对话框中self.textBrowser.setText(self.img_path)# 可选的图像格式img_type = [".bmp", ".jpg", ".png", ".gif"]for ig in img_type:if ig not in self.img_path:continueelse:self.image = True# 如果是图像文件名的话,读取图像img = QPixmap(self.img_path)# 获取图像的宽和高w = img.width()h = img.height()# 根据图像与label的比例,最大化图像在label中的显示ratio = max(w / self.label.width(), h / self.label.height())img.setDevicePixelRatio(ratio)# 图像在label中居中显示self.label.setAlignment(Qt.AlignCenter)self.label.setPixmap(img)if self.image is None:QMessageBox.information(self, "警告", "我们暂时不支持此格式的文件!", QMessageBox.Ok)

上面单独介绍了打开图像的代码,是为了方便阅读和理解。

而视频播放和打开图像的部分代码是可以共同使用的,因此下面的视频播放也会将打开图像的代码进行介绍。

实现视频播放功能

为了实现视频播放,暂停和关闭功能,我们额外增加了两个 Push Button 按钮,其中左边的那个按钮要实现本地视频的播放与暂停,右边的按钮用于实现视频的关闭。

在这里插入图片描述

接下来是逻辑代码部分。

可以发现我们的两个按钮上面并没有写汉字,这是为了我们在逻辑代码中给他加入标准图标。第一个按钮是播放的图标,第二个按钮是关闭的图标。

为了方便展示,我们把这些连接的设置都放在一个函数里。

 def background(self):# 文件选择按钮self.pushButton.clicked.connect(self.open_image)# 视频播放图标self.pushButton_2.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))  # 播放图标self.pushButton_3.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))  # 停止图标# 用于开始播放视频的按钮self.pushButton_2.clicked.connect(self.play_file) # 这是对应的函数# 用于关闭播放视频的按钮self.pushButton_3.clicked.connect(self.close_file) # 这是对应的函数# 当播放的为图像时,设计这两个按钮不能点击,只有当播放的是视频时,才能点击self.pushButton_2.setEnabled(False)self.pushButton_3.setEnabled(False

重复上面的判断文件类型函数,这里我们考虑了视频及图像。

当所选文件为视频时,将播放按钮置为可使用。

def pre_judge(self):# 创建文件对话框,如果是视频,令self.video = True,如果是图像,令self.video = False,# 当self.video = None时,报错。self.video = Noneself.img_path = QFileDialog.getOpenFileName()[0]self.textBrowser.setText(self.img_path)video_type = [".mp4", ".mkv", ".MOV", "avi"]img_type = [".bmp", ".jpg", ".png", ".gif"]for vdi in video_type:if vdi not in self.img_path:continueelse:self.video = True# 当是视频时,将开始按钮置为可点击状态self.pushButton_2.setEnabled(True)for ig in img_type:if ig not in self.img_path:continueelse:self.video = Falseimg = QPixmap(self.img_path)w = img.width()h = img.height()ratio = max(w / self.label.width(), h / self.label.height())img.setDevicePixelRatio(ratio)self.label.setAlignment(Qt.AlignCenter)self.label.setPixmap(img)if self.video is None:QMessageBox.information(self, "警告", "我们暂时不支持此格式的文件!", QMessageBox.Ok)

这里介绍如何播放视频,这里是整个的重点,也是难点。

播放视频,主要是使用其中的 QTimer 计时器,如果计时器被激活,就每隔一段时间读取一个视频帧,并显示。

我们根据计时器是否激活,将开始播放按钮置为暂停或播放,主要由 self.playing 参数控制。

import sys
from PyQt5.QtWidgets import QMessageBox, QFileDialog, QLineEdit
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import mainwindow, image
import cv2
import sqlite3### 主页面设计,略
class MainWindow(QMainWindow, mainwindow.Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)self.setupUi(self)self.image_open = Image_open()self.pushButton.clicked.connect(self.image_open.show)
### 未详细说明,请参考前三篇博客class Image_open(QMainWindow, image.Ui_MainWindow):def __init__(self, parent=None):super(Image_open, self).__init__(parent)# UI界面self.setupUi(self)self.background()self.cap = cv2.VideoCapture()self.playing = False# 在label中播放视频self.init_timer()def background(self):# 文件选择按钮self.pushButton.clicked.connect(self.pre_judge)# 视频播放图标self.pushButton_2.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))  # 播放图标self.pushButton_3.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))  # 停止图标# 用于开始播放视频的按钮self.pushButton_2.clicked.connect(self.play_file) # 这是对应的函数# 用于关闭播放视频的按钮self.pushButton_3.clicked.connect(self.close_file) # 这是对应的函数# 当播放的为图像时,设计这两个按钮不能点击,只有当播放的是视频时,才能点击self.pushButton_2.setEnabled(False)self.pushButton_3.setEnabled(Falsedef pre_judge(self):# 创建文件对话框,如果是视频,令self.video = True,如果是图像,令self.video = False,# 当self.video = None时,报错。self.video = Noneself.img_path = QFileDialog.getOpenFileName()[0]self.textBrowser.setText(self.img_path)video_type = [".mp4", ".mkv", ".MOV", "avi"]img_type = [".bmp", ".jpg", ".png", ".gif"]for vdi in video_type:if vdi not in self.img_path:continueelse:self.video = True# 当是视频时,将开始按钮置为可点击状态self.pushButton_2.setEnabled(True)for ig in img_type:if ig not in self.img_path:continueelse:self.video = Falseimg = QPixmap(self.img_path)w = img.width()h = img.height()ratio = max(w / self.label.width(), h / self.label.height())img.setDevicePixelRatio(ratio)self.label.setAlignment(Qt.AlignCenter)self.label.setPixmap(img)if self.video is None:QMessageBox.information(self, "警告", "我们暂时不支持此格式的文件!", QMessageBox.Ok)# 打开本地视频文件def play_file(self):self.label.setEnabled(True)# 如果播放视频,则使得关闭视频按钮可用self.pushButton_3.setEnabled(True)# 如果计时器没激活,证明是暂停阶段,需要重新播放,并把self.playing = True。if self.timer.isActive() is False:self.cap.open(self.img_path)self.timer.start(30)self.playing = True# 更换播放按钮为暂停按钮self.set_state()# 如果计时器激活了,证明是开始阶段,需要暂停播放,并把self.playing = False。else:self.timer.stop()self.playing = False# 更换暂停按钮为播放按钮self.set_state()# 关闭本地视频def close_file(self):self.cap.release()self.pushButton_2.setEnabled(True)self.pushButton_3.setEnabled(False)self.timer.stop()self.playing = False# 关闭视频将按钮置为可以播放self.set_state()# 本地视频播放暂停转换图标按钮def set_state(self):if self.playing:# 暂停图标self.pushButton_2.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))else:self.pushButton_2.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))# 播放视频画面def init_timer(self):self.timer = QTimer(self)self.timer.timeout.connect(self.show_pic)# 显示视频图像def show_pic(self):ret, img = self.cap.read()if ret:cur_frame = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 视频流的长和宽height, width = cur_frame.shape[:2]pixmap = QImage(cur_frame, width, height, QImage.Format_RGB888)pixmap = QPixmap.fromImage(pixmap)# 获取是视频流和label窗口的长宽比值的最大值,适应label窗口播放,不然显示不全ratio = max(width/self.label.width(), height/self.label.height())pixmap.setDevicePixelRatio(ratio)# 视频流置于label中间部分播放self.label.setAlignment(Qt.AlignCenter)self.label.setPixmap(pixmap)if __name__ == '__main__':app = QApplication(sys.argv)main = MainWindow()main.show()sys.exit(app.exec_())

完成出来的结果大概就是这样的!

在这里插入图片描述
日常学习记录,一起交流讨论吧!侵权联系~

相关文章:

界面开发(4)--- PyQt5实现打开图像及视频播放功能

PyQt5创建打开图像及播放视频页面 上篇文章主要介绍了如何实现登录界面的账号密码注册及登录功能,还简单介绍了有关数据库的连接方法。这篇文章我们介绍一下如何在设计的页面中打开本地的图像,以及实现视频播放功能。 实现打开图像功能 为了便于记录实…...

核心系统国产平台迁移验证

核心系统国产平台迁移验证 摘要:信息技术应用创新,旨在实现信息技术领域的自主可控,保障国家信息安全。金融领域又是关系国家经济命脉的行业,而对核心交易系统的信息技术应用创新是交易所未来将要面临的重大挑战。为了推进国产化进…...

【数据结构之二叉树】——二叉树的概念及结构,特殊的二叉树和二叉树性质

文章目录一、二叉树的概念及结构1.概念2.现实中的二叉树3. 特殊的二叉树:3.二叉树的性质二、二叉树练习题总结一、二叉树的概念及结构 1.概念 一棵二叉树是结点的一个有限集合,该集合: 或者为空由一个根节点加上两棵别称为左子树和右子树的二叉树组成…...

Android学习之帧动画和视图动画

帧动画 帧动画中的每一帧其实都是一张图片&#xff0c;将许多图片连起来播放&#xff0c;就形成了帧动画。 在drawable目录下新建frmae_animation文件&#xff0c;在这个文件中定义了帧动画的每一帧要显示的图片&#xff0c;播放时&#xff0c;按从上到下显示。 <?xml v…...

vue2和vue3的区别

这周呢主要就是整理整理学的东西&#xff0c;不然看的也记不住&#xff0c;把这些学的东西做成笔记&#xff0c;感觉会清楚许多&#xff0c;这次就把vue2和vue3的区别总结一下&#xff0c;明天要考四级&#xff0c;嗐&#xff0c;本来想着复习四级&#xff0c;结果只写了一两套…...

【你不知道的事】JavaScript 中用一种更先进的方式进行深拷贝:structuredClone

你是否知道&#xff0c;JavaScript中有一种原生的方法来做对象的深拷贝? 本文我们要介绍的是 structuredClone 函数&#xff0c;它是内置在 JavaScript 运行时中的: const calendarEvent {title: "Builder.io Conf",date: new Date(123),attendees: ["Steve…...

XE开发Linux应用(二)-Webservice

新建一个工程。选择如图。继续输入服务名然后就生成对应的单元。增加linux 平台。完善对应的单元代码{ Invokable implementation File for Txaliontest which implements Ixaliontest }unit xaliontestImpl;interfaceuses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns…...

kubernetes实战与源码学习

1.1 关于Kubernetes的介绍与核心对象概念 关于Kubernetes的介绍与核心对象概念-阿里云开发者社区 k8s架构 核心对象 使用kubeadm10分钟部署k8集群 使用 KuboardSpray 安装kubernetes_v1.23.1 | Kuboard k8s-上部署第一个应用程序 Deployment基本概念 给应用添加service&a…...

CNCF x Alibaba云原生技术公开课 第八章 应用配置管理

Pod配置管理分类 可变配置就用 ConfigMap&#xff1b;敏感信息是用 Secret&#xff1b;身份认证是用 ServiceAccount&#xff1b;资源配置是用 Resources&#xff1b;安全管控是用 SecurityContext&#xff1b;前置校验是用 InitContainers。 1、ConfigMap 概念&#xff1a;…...

YUV实践记录

文章目录YUV基础介绍&#xff1a;不同采样YUV格式的区别为什么要使用YUV格式呢&#xff1f;YUV的存储方式Android中的YUV_420_888附录&#xff1a;YUV基础介绍&#xff1a; YUV在做手机图像或者视频处理的时候会经常用到的一个格式&#xff0c;用此文来记录YUV相关介绍&#xf…...

【题解】百度2020校招Web前端工程师笔试卷(第一批):单选题、多选题

题目来源 若有错误请指正&#xff01; 单选 1 分页存储管理将进程的逻辑地址空间分成若干个页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;若某一计算机主存按字节编址&#xff0c;逻辑地址和物理地址都是32位&#xff0c;页表项大小为4字节&#xff0c;若…...

探索云原生技术之容器编排引擎-kubeadm安装kubernetes1.21.10(新版:针对高版本内核)

❤️作者简介&#xff1a;2022新星计划第三季云原生与云计算赛道Top5&#x1f3c5;、华为云享专家&#x1f3c5;、云原生领域潜力新星&#x1f3c5; &#x1f49b;博客首页&#xff1a;C站个人主页&#x1f31e; &#x1f497;作者目的&#xff1a;如有错误请指正&#xff0c;将…...

2023广西自治区职业技能大赛“网络安全” 项目比赛任务书

2023广西自治区职业技能大赛“网络安全” 项目比赛任务书2023广西自治区职业技能大赛“网络安全” 项目比赛任务书A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#xff1a;Nginx安全策略&a…...

Reactor模式

Reactor是一种设计模式&#xff0c;可以用于构建高并发的网络服务器。 Reactor模式的好处在于&#xff1a;可以在一个或多个reactor线程使用多路复用技术去管理所有网络连接连接建立、IO请求&#xff0c;保证工作线程不被IO阻塞。 前置知识&#xff1a;IO多路复用技术 1. 传统网…...

Git图解-IDEA中的Git操作

目录 一、配置Idea 二、项目克隆 三、文件状态识别 四、Git操作 4.1 git add--添加暂存区 4.2 git commit--提交本地仓库 4.3 git push--推送远程仓库 4.4 git pull--更新本地仓库 五、完整开发流程 5.1 步骤1&#xff1a;克隆项目 5.2 步骤2&#xff1a;创建自己开发…...

在一个web应用中应该如何完成资源的跳转

在一个web应用中通过两种方式&#xff0c;可以完成资源的跳转&#xff1a; 第一种方式&#xff1a;请求转发 第二种方式&#xff1a;重定向 转发和重定向的区别&#xff1a; 代码上的区别&#xff1a; 请求转发 // 获取请求转发器对象 RequestDispatcher dispatcher request.…...

前缀和部分题目

前缀和 前缀和指数组的前 N项之和&#xff0c;是个比较基础的算法 例题 面试题 17.05. 字母与数字 给定一个放有字母和数字的数组&#xff0c;找到最长的子数组&#xff0c;且包含的字母和数字的个数相同。 返回该子数组&#xff0c;若存在多个最长子数组&#xff0c;返回左…...

三天吃透MySQL面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…...

Giving You A guide to learning any topic faster than 95% of people

A guide to learning any topic faster than 95% of people: Richard Feynman was a physician who won the Nobel Prize in 1965. But he became known for his great lectures. Why? He was able to explain complex concepts in simple terms with these 4 steps: 1 • E…...

(七十七)大白话MySQL是如何根据成本优化选择执行计划的?(中)

上次我们讲完了全表扫描的成本计算方法&#xff0c;相信大家应该都理解了&#xff0c;其实还是比较简单的&#xff0c;今天我们来讲一下索引的成本计算方法&#xff0c;因为除了全表扫描之外&#xff0c;还可能多个索引都可以使用&#xff0c;但是当然同时一般只能用一个索引&a…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...