Я пытаюсь сделать звук в 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
циклов.
Кто-нибудь знает, в чем может быть проблема?