在下一个声音完成之前,在python?

时间:2016-12-25 07:34:43

标签: python loops audio tkinter pygame

在Python / pygame中,我希望重复某个wav文件(在循环中由pygame.mixer.Sound("foo.wav").play()读取,并让它们一个接一个地播放,最好是在完成之后或默认延迟(1500ms工作)

到目前为止,换句话说,我有这个:

    for x in range(0, 5):
        pygame.mixer.Sound("foo.wav").play()

然而,当它播放时,它会一次播放。

使用pygame.time进行延迟会使窗口挂起,就像tkinter .after(1500)一样,我似乎无法找到一个直接的方法来使用库或python执行此操作,或者甚至是一个播放内容的示例我打算用延迟的几个音调。我可以用更多的标准替换pygame' Python的音频插件,或者如果按钮按下它可能会使用线程,如果它需要hackery单独使用pygame混音器来做这样的事情。

如果需要,可以使用一些方便的参考: http://www.pygame.org/docs/ref/music.html https://docs.python.org/2/library/tkinter.html

1 个答案:

答案 0 :(得分:2)

最直接的方法似乎是通过Tkinter after方法获取每个声音的长度并在给定时间过后播放下一个声音。

self.sound_queue = [pygame.mixer.Sound(s) for s in ('foo.wav', 'bar.ogg', 'baz.mp3')]

def play_queue(self, q, num=0)
    sound = q[num]
    duration = int(sound.get_length() * 1000)
    sound.play()
    if num < len(q)-1:
        self.root.after(duration, self.play_queue, q, num+1)

self.play_queue(self.sound_queue)

您还可以查看pygame.mixer.Channel.queue()pygame.mixer.Channel.set_endevent,因为这些可能是执行此类操作的预期方式。