2016-09-30 96 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 

注意:我中省略的語句,如進口和他人,用於初始化,因爲它們不是與這一問題有關。