Функции when_pressed и when_released в gpiozero не работают - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь сделать звук в Raspberry Pi, пока нажата кнопка, и как только она будет отпущена или по истечении тайм-аута, звук должен прекратиться.

Я использую gpiozero и имею следующий код, но я не могу понять, как заставить работать when_pressed и when_released. Функции обратного вызова просто не запускаются при нажатии и отпускании кнопки.

С другой стороны, такие свойства, как is_pressed, работают должным образом.

MyDoor(object):

    ...

    def function1(self, gpio_button, held_duration):

        ds = DoorSound()

        gpio_button.when_pressed = ds.start_door_sound
        # gpio_button.when_pressed = lambda: ds.start_door_sound() # <-- I have also tried this alternative
        gpio_button.when_released = ds.stop_door_sound
        # gpio_button.when_released = lambda: ds.stop_door_sound()

        do_loop = True
        while do_loop:
            ...
            # do more stuff and at some point set do_loop to False

    ...

DoorSound определяется следующим образом:

class DoorSound(object):

    def __init__(self):
        self.file_path = 'sounds/door_sound.mp3'
        self.pygame_door = pygame.mixer


    def start_door_sound(self):
        print('Start door sound!')
        self.pygame_door.init()
        self.pygame_door.music.load('sounds/door_sound.mp3')
        self.pygame_door.music.play()
        time.sleep(0.1)

    def stop_door_sound(self):
        print('Stop door sound!')
        self.pygame_door.music.stop()
        time.sleep(0.1)

Я также пробовал:

  • start_door_sound и stop_door_sound функции внутри класса MyDoor
  • следующую простую функцию. Это работает, когда он вызывается напрямую, а не как обратный вызов.

, но ни один из них не имеет никакого значения.

def door_sound(self):

    """Reproduce a DOOR SOUND"""

    print('♩ ♪ ♫ ♬  Door sound ♩ ♪ ♫ ♬')
    print()

    pygame.mixer.init()
    pygame.mixer.music.load('sounds/door_sound.mp3')
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy() == True:
        continue

Текст внутри функций не печатается, поэтому Думаю, проблема в том, что почему-то функция обратного вызова никогда не вызывается.

Я где-то читал, что функции when_pressed и when_released могут плохо работать внутри циклов, но, к сожалению, документация не очень обширна, поэтому я не знаю, может ли это быть так. В любом случае, function1 работает внутри некоторых while циклов.

Кто-нибудь знает, в чем может быть проблема?

...