在循环播放音乐,直到释放一个键。蟒蛇

时间:2016-09-30 17:46:03

标签: python python-3.x audio pyglet keyrelease

我正在用python制作一个GUI,使用cocos2d和pyglet模块。 GUI按下“h”时应播放声音,释放时停止播放。这里的问题是我无法找到解决方案。在搜索了这个网站后,我发现了这个问题 - How to play music continuously in pyglet,这个问题的一个问题就是我无法在启动后停止声音。

编辑:我找到了一种播放声音的方法,直到keyrelease,但遇到了另一个问题

现在,播放音乐的代码如下所示:

class Heartbeat (cocos.layer.Layer):
    is_event_handler=True

    def __init__ (self):
        super(Heartbeat, self).__init__()

        global loop, music, player
        music = pyglet.media.load('long_beep.wav')
        loop=pyglet.media.SourceGroup(music.audio_format, None)
        player=pyglet.media.Player()
        loop.queue(music)
        player.queue(loop)

    def on_key_press(self, key, modifiers):
        if chr(key)=='h':
            loop.loop=True
            player.play()
    def on_key_release (self, key, modifiers):
        if chr(key)=="h":
            loop.loop=False

此代码在第一次按下并按住“h”键时起作用,在后续尝试中不起作用。 Python不会引发异常,它似乎忽略了在第一次发布后发生的“h”键按下。

注意:声明 - if chr(key)=="h"可能不是按键处理的最佳解决方案,但我对使用cocos2d和pyglet模块非常陌生。

1 个答案:

答案 0 :(得分:0)

没关系,我已经想到了这一点,我所要做的就是将行player.queue(loop)从初始化函数移动到处理按键的函数。更新后的代码如下所示:

class Heartbeat (cocos.layer.Layer):
    is_event_handler=True

    def __init__ (self):
        super(Heartbeat, self).__init__()

        global loop, music, player
        music = pyglet.media.load('long_beep.wav')
        loop=pyglet.media.SourceGroup(music.audio_format, None)
        player=pyglet.media.Player()
        loop.queue(music)

    def on_key_press(self, key, modifiers):
        if chr(key)=='h':
            loop.loop=True
            player.queue(loop) #This is the line that had to be moved
            player.play()

    def on_key_release (self, key, modifiers):
        if chr(key)=="h":
            loop.loop=False

注意:我省略了用于初始化的语句,例如import和其他语句,因为它们与此问题无关。