Воспроизведение музыки в цикле, пока клавиша не будет отпущена. Питон

Я делаю небольшой графический интерфейс с python, используя модули cocos2d и pyglet. Графический интерфейс должен воспроизводить звук при нажатии «h» и останавливаться при отпускании. Проблема здесь в том, что я не могу найти решение этой проблемы. После поиска на этом сайте я нашел этот вопрос - Как непрерывно воспроизводить музыку в pyglet, проблема в том, что я не могу остановить звук после его запуска.

РЕДАКТИРОВАТЬ: я нашел способ воспроизводить звук до отпускания клавиши, но столкнулся с другой проблемой

Прямо сейчас код, который должен воспроизводить музыку, выглядит так:

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.


person Ignas Juodžbalis    schedule 30.09.2016    source источник
comment
Я пробовал решение, предложенное в этом вопросе - stackoverflow.com/questions/27391240/   -  person Ignas Juodžbalis    schedule 30.09.2016


Ответы (1)


Ничего, я понял это, все, что мне нужно было сделать, это переместить строку 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 и другие, используемые для инициализации, поскольку они не имеют отношения к этой проблеме.

person Ignas Juodžbalis    schedule 01.10.2016