2016-09-30 101 views
0

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

编辑:我找到了一种方法来播放声音,直到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模块。

+0

我已经尝试了一个解决方案,在这个问题中提出 - http://stackoverflow.com/questions/27391240/how-to-play-music-continuously-in-pyglet –

回答

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 

注意:我中省略的语句,如进口和他人,用于初始化,因为它们不是与这一问题有关。