gpt4 book ai didi

python-3.x - PyQt5 : How to delete widget once video gets over and put a picture at the place of video player

转载 作者:行者123 更新时间:2023-12-05 05:07:55 28 4
gpt4 key购买 nike

我是 Pyqt5 的新手。我使用 Pyqt5 设计器设计了一个 UI,它有一个 QmainWindow,我在其中放置了 QWidget。在 QWidget 中,我放置了包含 QFrame 的 QHBoxlayout。这个 QFrame 我曾经包含 QVideoWidget。QVideoWidget 用于播放视频文件。我想要达到的目标是1.) 播放时视频到达最后一帧时暂停视频。要么1.) 视频结束后,我将播放器替换为用于固定视频播放器的同一帧中的图片。

为了实现上述目标,我编写了以下代码 --

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'video_1.ui'
#
# Created by: PyQt5 UI code generator 5.13.1
#
# WARNING! All changes made in this file will be lost!



from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QPushButton, QSizePolicy
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
import sys
import time
import sip


class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1119, 891)
self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
self.centralwidget.setSizePolicy(sizePolicy)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(400, 10, 711, 841))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.frame = QtWidgets.QFrame(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
self.frame.setSizePolicy(sizePolicy)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.widget_2 = QVideoWidget(self.frame)
self.widget_2.setGeometry(QtCore.QRect(20, 40, 681, 771))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_2.sizePolicy().hasHeightForWidth())
self.widget_2.setSizePolicy(sizePolicy)
self.widget_2.setObjectName("widget_2")
self.horizontalLayout.addWidget(self.frame)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1119, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def run(self, fileName):
self.player = QMediaPlayer()
self.player.setVideoOutput(self.widget_2)
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))
self.player.play()

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.run("/home/shantanu/UI/intro.mp4")




if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

我的想法是,如果我能够在视频开始播放之前获得视频的总持续时间,然后通过结合使用 while 和 if 循环,我可以在视频达到其总持续时间时暂停视频。代码是——

def run(self, fileName):
self.player = QMediaPlayer()
self.player.setVideoOutput(self.widget_2)
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))

from moviepy.editor import VideoFileClip
clip = VideoFileClip("/home/shantanu/UI/intro.mp4")
print( int(clip.duration) )

# Assume the clip = 6

i = 0
while i < 6:
self.player.play()
i = i+1
if i == 5 :
self.video.pause()

但是上面的方法并没有奏效。因为一旦我执行文件,所有内容都会被执行,而我无法实现我想做的事情。

代码运行良好,没有任何错误,但我无法得到我想要得到的东西。

我尝试使用 Pyqt5 提供的 deleteLater() 函数,但它也不起作用。以下是可以完成的最佳方法,但我无法做到。我在 Stackoveflow 上经历了类似的问题,但未能获得预期的结果。

任何人都可以指导我如何使用删除小部件,然后我将其替换为图片。

最佳答案

[signal] void QMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status)

Signals that the status of the current media has changed.

Note: Notifier signal for property mediaStatus.

See also mediaStatus().

import sys
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QPushButton, QSizePolicy
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
#import sip


class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1119, 891)
self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
self.centralwidget.setSizePolicy(sizePolicy)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(400, 10, 711, 841))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")

self.frame = QtWidgets.QFrame(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
self.frame.setSizePolicy(sizePolicy)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.widget_2 = QVideoWidget(self.frame)
self.widget_2.setGeometry(QtCore.QRect(20, 40, 381, 371)) # 20, 40, 681, 771
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.widget_2.sizePolicy().hasHeightForWidth())
self.widget_2.setSizePolicy(sizePolicy)
self.widget_2.setObjectName("widget_2")

self.horizontalLayout.addWidget(self.frame)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1119, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def run(self, fileName):
self.player = QMediaPlayer()
self.player.setVideoOutput(self.widget_2)
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))

self.player.mediaStatusChanged.connect(self.media_status) # <---

self.player.play()

def media_status(self, status): # <---
if status == 7:
print("The End!")
self.label = QtWidgets.QLabel("The End!", self.centralwidget,
alignment=QtCore.Qt.AlignCenter)
self.label.setStyleSheet("""
QLabel {
background-color : blue;
color : #fff;
font-weight: bold;
font-size: 32px;
}
""")
self.label.setGeometry(QtCore.QRect(420, 50, 381, 371))
self.label.show()

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.run("D:/_Qt/Python-Examples/_PyQt5/Test/video5.avi")


if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

enter image description here

关于python-3.x - PyQt5 : How to delete widget once video gets over and put a picture at the place of video player,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58679396/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com