PyQt5:视频结束后如何删除小部件并将图片放在视频播放器的位置

问题描述 投票:1回答:1

我是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上遇到了类似的问题,但无法达到预期的结果。

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

python-3.x user-interface video pyqt pyqt5
1个回答
0
投票

[信号]无效QMediaPlayer :: mediaStatusChanged(QMediaPlayer :: MediaStatus状态)

表示当前媒体的状态已更改。

注意:属性mediaStatus的通知程序信号。

另请参见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

© www.soinside.com 2019 - 2024. All rights reserved.