在循环中使用time.sleep()时应用程序挂起

时间:2012-12-05 12:56:02

标签: python wxpython media-player playlist mplayer

我正在开展关于制作自定义媒体播放器的学校项目。我在网上有一些我一直在使用的源代码。我想添加另一个新功能,即制作源代码所没有的播放列表

然而,当我尝试拖动窗口时,我遇到一个错误,即窗口“停止响应”。由于我的光标显示“加载标志”(圆形光标),我似乎无法点击任何东西,因为它似乎有一些背景踏板运行。

我试过让它保持运行而不拖动它似乎工作正常。

当我使用“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)

1 个答案:

答案 0 :(得分: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)