0

カスタマイズされたメディア プレーヤーの作成に関する学校のプロジェクトに取り組んでいます。私が使用しているソースコードがウェブ上にいくつかあります。ソース コードにないプレイリストを作成するという別の新機能を追加したかったのです。

ただし、ウィンドウをドラッグしようとすると、ウィンドウが「応答を停止する」というエラーが発生します。カーソルが「読み込みサイン」(円形カーソル)を表示しているため、バックグラウンドでトレッドが実行されているように見えるため、何もクリックできませんでした。

ドラッグせずに実行したままにしてみましたが、正しく動作しているようです。

関数「time.sleep(second)」を使用すると、この問題が発生する理由を知っている人はいますか?

参考:http ://www.blog.pythonlibrary.org/2010/07/24/wxpython-creating-a-simple-media-player/

ロジック (コード):

def load_playlist(self, event):
    playlist = ["D:\Videos\test1.mp4", "D:\Videos\test2.avi"]
    for path in playlist:
        #calculate each media file duration
        ffmpeg_command = ['C:\\MPlayer-rtm-svn-31170\\ffmpeg.exe', '-i' , path]

        pipe = subprocess.Popen(ffmpeg_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        results = pipe.communicate()

        #Regular expression to get the duration
        length_regexp = 'Duration: (\d{2}):(\d{2}):(\d{2})\.\d+,'
        re_length = re.compile(length_regexp)

        # find the matches using the regexp that to compare with the buffer/string
        matches = re_length.search(str(results))
        #print matches

        hour = matches.group(1)
        minute = matches.group(2)
        second = matches.group(3)

        #Converting to second
        hour_to_second = int(hour) * 60 * 60
        minute_to_second = int(minute) * 60
        second_to_second = int(second)

        num_second = hour_to_second + minute_to_second + second_to_second
        print num_second

        #Play the media file
        trackPath = '"%s"' % path.replace("\\", "/")
        self.mplayer.Loadfile(trackPath)

        #Sleep for the duration of second(s) for the video before jumping to another video
        time.sleep(num_second)
4

1 に答える 1

0

問題は、time.sleep() が wxPython のメイン ループをブロックして更新できないため、応答していないように見えることです。ビデオ間に休憩を挿入する必要がある場合は、代わりに wx.Timer を使用する必要があります。それ以外の場合は、スレッドの使用を検討する必要があります。

wx.Timer のチュートリアルは次のとおりです: http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

基本的にタイマーを作成し、メソッドの最後でそれをオンにします。終了すると、次のビデオをロードするために使用できるイベントが発生します。または、 wx.CallLater(numOfMillSec, self.loadVideo) を使用できます

于 2012-12-05T14:26:56.723 に答える