Продолжайте цикл до тех пор, пока кнопка не будет нажата с помощью gpiozero - нажатие кнопки не зарегистрировано
У меня есть код Python на Raspberry Pi, который я хочу запустить и продолжить цикл, пока не будет нажата кнопка.
Button.wait_for_press() не подходит, потому что это приостанавливает программу, пока она не запустится, но я попробовал ее, чтобы увидеть, работает ли аппаратное обеспечение, и оно работает.
def shutterPressed():
global shutterHasBeenPressed
shutterHasBeenPressed = True
def main():
"""
Main program loop
"""
#start camera preview
camera.start_preview(resolution=(SCREEN_W, SCREEN_H))
#Display Intro screens
intro_image_1 = REAL_PATH + '/assets/intro_1.png'
intro_image_2 = REAL_PATH + '/assets/intro_2.png'
overlay_1 = overlay_image(intro_image_1, 0, 3)
overlay_2 = overlay_image(intro_image_2, 0, 4)
#Wait for button press
i = 0
blink_speed = 10
button.when_pressed = shutterPressed
while True:
global shutterHasBeenPressed
shutterHasBeenPressed = False
#Stay in loop until button is pressed
if shutterHasBeenPressed is False:
i += 1
if i == blink_speed:
overlay_2.alpha = 255
elif i == (2 * blink_speed):
overlay_2.alpha = 0
i = 0
#Restart while loop
sleep(0.1)
continue
#button has been pressed!
print("Button Pressed!")
Когда я запускаю этот код, нажатие кнопки вообще не регистрируется.
Что я не так понял?
РЕДАКТИРОВАТЬ: поэтому я добавил оператор печати в функцию shutterPressed() и подтвердил, что он работает при нажатии кнопки.
В также добавлен оператор для вывода значения shutterHasBeenPressed непосредственно перед оператором if. Это никогда не менялось от ложного.
Однако, если я удалил строку, меняющую переменную на false в начале цикла, то код работал, так что, очевидно, это связано с тем, что запускаются различные биты. Может быть, цикл while запускается снова после запуска функции shutterPressed()?
В любом случае, я исправил это, переместив переназначение переменной в после оператора if.
1 ответ
Добро пожаловать в мир параллелизма (немного)!
Просто представьте, что ваша программа работает: инструкции выполняются одна за другой в том порядке, в котором они написаны, в соответствии с потоком выполнения, который они определяют, за исключением shutterPressed
который выполняется асинхронно (возможно).
Поэтому представьте, что мы входим в цикл и находимся на первой строке, <here>
:
while True:
global shutterHasBeenPressed
shutterHasBeenPressed = False # <here>
#Stay in loop until button is pressed
if shutterHasBeenPressed is False:
i += 1
if i == blink_speed:
overlay_2.alpha = 255
elif i == (2 * blink_speed):
overlay_2.alpha = 0
i = 0
#Restart while loop
sleep(0.1)
continue
#button has been pressed!
print("Button Pressed!")
Сейчас, shutterHasBeenPressed
был установлен на False
и следующее условие проверяется так, что мы вводим if
,
программа продолжает работать до тех пор, пока не будет нажата кнопка. Скажи, что достиг <here>
:
while True:
global shutterHasBeenPressed
shutterHasBeenPressed = False
#Stay in loop until button is pressed
if shutterHasBeenPressed is False:
i += 1
if i == blink_speed:
overlay_2.alpha = 255 # <here>
elif i == (2 * blink_speed):
overlay_2.alpha = 0
i = 0
#Restart while loop
sleep(0.1)
continue
#button has been pressed!
print("Button Pressed!")
С этой точки зрения, shutterPressed
работает, устанавливает shutterHasBeenPressed
в True
, Затем, снова в нашем цикле, итерация заканчивается, мы continue
в начале цикла и... что там?!
shutterHasBeenPressed = False
и нажатие кнопки просто осталось незамеченным!
Я считаю, что это отвечает на ваш вопрос, спрашивая, в чем вы ошиблись.