Search code examples
pythonwxpython

Wxpython wx.media Video & image control There are questions


# -*- coding: utf-8 -*-
import wx, wx.media
import sqlite3
import os
import time

class MainFream(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.leftPanel = wx.Panel(self, size=(0,0))
        self.media = wx.media.MediaCtrl(self,
                                        #szBackend=wx.media.MEDIABACKEND_GSTREAMER,
                                        szBackend=wx.media.MEDIABACKEND_WMP10,
                                        size=(0,0),
                                        style=wx.SIMPLE_BORDER | wx.ALIGN_CENTER_HORIZONTAL)
        #Penael Sizer
        self.hBoxSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.hBoxSizer.Add(self.leftPanel, 1, wx.EXPAND, 1)
        self.hBoxSizer.Add(self.media, 1, wx.EXPAND, 1)
        self.SetSizer(self.hBoxSizer)


        #Video Image File Folder Serach & Load Play
        self.mediaCounter = 0
        self.folderSerach = [f for f in os.listdir() if f.endswith(('.wmv','mp4','avi','.jpg'))]
        self.media.Load(self.folderSerach[self.mediaCounter])
        self.media.Bind(wx.media.EVT_MEDIA_LOADED, self.mediaPlay, self.media)
        self.media.Bind(wx.media.EVT_MEDIA_FINISHED, self.mediaLoop, self.media)


    def auto(self):
        self.TextShow()
        wx.CallLater(1000, self.auto) #60min

    def mediaPlay(self, event):
        self.folderSerach = [x for f in os.listdir() for x in os.path.splitext(f) if x.endswith(('.wmv','mp4','avi','.jpg'))]
        for i in self.folderSerach:
            if i == '.jpg':
                self.media.Play()
                time.sleep(10)
                print('test1')
            else:
                self.media.Play()
                print('test2')

    def mediaLoop(self, evnet):
        self.media.Stop()
        self.mediaCounter += 1
        if self.mediaCounter > len(self.folderSerach) -1: self.mediaCounter = 0
        self.folderSerach = [f for f in os.listdir() if f.endswith(('.wmv','mp4','avi','.jpg'))]
        self.media.Load(self.folderSerach[self.mediaCounter])

if __name__ == '__main__':
    app = wx.App()
    fream = MainFream()
    fream.Show(True)
    app.MainLoop()

I am creating a panel to search and play jpg, avi, mp4, etc. in folders.

In the def mediaPlay() section, jpg makes the picture file visible for 10 seconds, and the movie is played until the end of the playing time.

The question is, if = '.jpg', only one print ('test1') statement needs to be executed, and 'test2' will be displayed at the same time. So time.sleep() is applied to the if or else statement. Why is this?


Solution

  • In this function you are overwriting self.folderSerach with a list of file suffixes.

    def mediaPlay(self, event):
        self.folderSerach = [x for f in os.listdir() for x in os.path.splitext(f) if x.endswith(('.wmv','mp4','avi','.jpg'))]
        for i in self.folderSerach:
            if i == '.jpg':
                self.media.Play()
                time.sleep(10)
                print('test1')
            else:
                self.media.Play()
                print('test2')
    

    replace it with:

    def mediaPlay(self, event):
        if self.folderSerach[self.mediaCounter].endswith('.jpg'):
            self.media.Play()
            time.sleep(10)
            print('test1')
        else:
            self.media.Play()
            print('test2')
    

    This overwriting of self.folderSerach means that you are having to re-load it again in def medialoop (remove that code)

    Also, os.listdir() (at least on Linux) requires an argument i.e. os.listdir('./')
    And, remove the def auto function it is not used