Продолжайте цикл до тех пор, пока кнопка не будет нажата с помощью 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

и нажатие кнопки просто осталось незамеченным!

Я считаю, что это отвечает на ваш вопрос, спрашивая, в чем вы ошиблись.

Другие вопросы по тегам