2016-09-30 1 views
0

Я создаю небольшой графический интерфейс с помощью python, используя модули cocos2d и pyglet. GUI должен воспроизводить звук, пока «h» нажат и остановится, когда он будет отпущен. Проблема здесь в том, что я не могу найти решение этого. После поиска этого сайта я нашел этот вопрос - How to play music continuously in pyglet, проблема с этим заключается в том, что я не могу заставить звук останавливаться после его запуска.Воспроизведение музыки на петле до отпускания клавиши. Python

EDIT: Я нашел способ, чтобы играть звук до 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

Nevermind, я понял, все, что мне нужно было сделать, это переместить линию 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 

Примечание: Я не определять такие утверждения, как импорт и другие, используемые для инициализации, поскольку они не имеют отношения к этому вопросу.

Смежные вопросы