继续运行循环,直到使用 gpiozero 按下按钮 - 按钮按下未注册

我在树莓派上有一些 python 代码,我想运行并继续循环,直到按下按钮。


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() 函数中添加了一个打印语句,并确认它在按下按钮时正在运行。


In 还添加了一个语句,用于在 if 语句之前打印shutterHasBeenPressed 的值。这从未改变过虚假。


但是,如果我删除了在循环开始时将变量更改为 false 的行,那么代码就起作用了,所以这显然与运行各种位有关。也许在shutterPressed() 函数运行后while 循环又开始了?


无论哪种方式,我都通过将变量的重新分配移到 if 语句之后来修复它。


潇湘沐
浏览 263回答 1
1回答

幕布斯7119047

欢迎来到并发世界(有点)!试想一下,你的程序运行:根据执行流程,他们定义的指令正在执行一个接一个的在它们的排列顺序后,与例外的shutterPressed这是异步执行的(可能)。因此,假设我们进入循环并在第一行<here>:&nbsp; &nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; global shutterHasBeenPressed&nbsp; &nbsp; &nbsp; &nbsp; shutterHasBeenPressed = False&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# <here>&nbsp; &nbsp; &nbsp; &nbsp; #Stay in loop until button is pressed&nbsp; &nbsp; &nbsp; &nbsp; if shutterHasBeenPressed is False:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if i == blink_speed:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overlay_2.alpha = 255&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif i == (2 * blink_speed):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overlay_2.alpha = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Restart while loop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(0.1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; #button has been pressed!&nbsp; &nbsp; &nbsp; &nbsp; print("Button Pressed!")现在,shutterHasBeenPressed已设置为False并且验证了随后的条件,以便我们输入if.程序一直运行,直到意外地按下按钮。说,它达到了<here>:&nbsp; &nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; global shutterHasBeenPressed&nbsp; &nbsp; &nbsp; &nbsp; shutterHasBeenPressed = False&nbsp; &nbsp; &nbsp; &nbsp; #Stay in loop until button is pressed&nbsp; &nbsp; &nbsp; &nbsp; if shutterHasBeenPressed is False:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if i == blink_speed:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overlay_2.alpha = 255&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# <here>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif i == (2 * blink_speed):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overlay_2.alpha = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #Restart while loop&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(0.1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; #button has been pressed!&nbsp; &nbsp; &nbsp; &nbsp; print("Button Pressed!")此时,shutterPressed运行,设置shutterHasBeenPressed为True。然后,回到我们的循环,迭代结束,我们continue在循环的开始......那里有什么?!&nbsp; &nbsp; &nbsp; &nbsp; shutterHasBeenPressed = False按下按钮完全没有引起注意!我相信这可以回答您的问题,询问您做错了什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python