首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >视频结束后Python窗口不会关闭

视频结束后Python窗口不会关闭
EN

Stack Overflow用户
提问于 2022-02-26 10:26:56
回答 1查看 169关注 0票数 1

目前,我正在编写一个代码,可以执行各种操作,例如控制电机等,但有一段时间我需要编写代码在vlc上弹出一个视频,并在视频结束时退出窗口,问题是该窗口当前停留在视频结束后,整个代码只是冻结,无法在视频之后执行任何操作。

我尝试了各种方法,比如计算视频长度,并在计时器命中时调用self.close(),但仍然是一样的。

我也尝试过将"--play-and-exit"添加到vlc参数中,但它仍然不改变.

这是代码,如果有人知道如何正确地做到这一点!

代码语言:javascript
复制
import PySimpleGUI as sg

import os
import sys
import platform
import time
from time import sleep
from PyQt5.QtCore import (QCoreApplication, QObject, QRunnable, QThread,
                          QThreadPool, pyqtSignal)
from PyQt5 import QtCore, QtGui, QtWidgets
import vlc

class Player(QtWidgets.QMainWindow):

    def __init__(self, master=None):
        QtWidgets.QMainWindow.__init__(self, master)

        self.media_files = [
            "Toxic.mp4",
        ]
        self.current_index = 0
        self.showFullScreen()
        self.init_ui()
        vlc_options = [
            "--embedded-video",
            "--play-and-exit",
            "--autoscale",
            "--fullscreen",
            "--video-on-top",
            "--verbose -1",
            "--canvas-aspect 3:4",
            "--no-canvas-padd"
        ]

        self.instance = vlc.Instance(" ".join(vlc_options))
        self.media = None
        self.player = self.instance.media_player_new()
        
        if platform.system() == "Linux":
            self.player.set_xwindow(int(self.videoframe.winId()))
        elif platform.system() == "Windows":  # for Windows
            self.player.set_hwnd(int(self.videoframe.winId()))

        self.open_file(self.media_files[self.current_index])
        
    def init_ui(self):
        
      
        self.videoframe = QtWidgets.QFrame()
       
        self.palette = self.videoframe.palette()
        self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0))
        self.videoframe.setPalette(self.palette)
        self.videoframe.setAutoFillBackground(True)
        self.setCentralWidget(self.videoframe)
        
    def with_opencv(filename):
        
        import cv2
        video = cv2.VideoCapture(filename)
    
        duration = video.get(cv2.CAP_PROP_POS_MSEC)
        frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT)
    
        return duration, frame_count

    def open_file(self, filename):
       
        if not filename:
            return
        
        self.media = self.instance.media_new(filename)
      
        self.player.set_media(self.media)
       
        self.media.parse()
     
        self.player.play()
        
        
    
def main():
    
    layout = [[sg.Text('Test', font=("Helvetica", 30))],
              [sg.Text('Clique sur le boutton <<Lancer>>', font=("Calibri", 20))],
              [sg.Button('Lancer'), sg.Button('Sortie')]
              ]
    
    window = sg.Window('02.05.2022', layout, size = (800, 480), element_justification="Center", finalize=True)
    
    
   
        
    while True:
        event, values = window.Read()
        print(event, values)
        if event in (sg.WINDOW_CLOSED, 'Sortie'):
            break
        if event in (sg.WINDOW_CLOSED, 'Lancer'):
            
            app = QtWidgets.QApplication(sys.argv)
        
            player = Player()
            player.show()
            
            sys.exit(app.exec_())           
            break
    
    window.close()

if __name__ == '__main__':
   main()

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-26 13:41:38

我已经找到了解决办法。这是新的主循环:

代码语言:javascript
复制
while True:
    event, values = window.Read()
    print(event, values)
    if event in (sg.WINDOW_CLOSED, 'Sortie'):
        break
    if event in (sg.WINDOW_CLOSED, 'Lancer'):
        
        app = QtWidgets.QApplication(sys.argv)
    
        player = Player()
        player.show()
        # Wait for is_playing to register the fact that it is playing 
        time.sleep(0.1)
        while True:
            app.processEvents()

            if not player.player.is_playing():
                break        
        break

而不是app.exec_(),它在循环中调用app.processEvents(),并检查播放机是否停止在该循环中播放。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71275864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档