Продолжайте цикл до тех пор, пока кнопка не будет нажата с помощью gpiozero - нажатие кнопки не зарегистрировано - PullRequest
0 голосов
/ 27 марта 2019

У меня есть некоторый код 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 Ответ

0 голосов
/ 27 марта 2019

Добро пожаловать в мир параллелизма (в некоторой степени)!

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

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

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

...