0

我在树莓派上有一些 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 语句之后来修复它。

4

1 回答 1

3

欢迎来到并发世界(有点)!

想象一下您的程序正在运行:指令按照它们的写入顺序一个接一个地执行,根据它们定义的执行流程,除了异步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运行,设置shutterHasBeenPressedTrue。然后,回到我们的循环,迭代结束,我们continue在循环的开始......那里有什么?!

        shutterHasBeenPressed = False

按钮按下就完全被忽视了!

我相信这回答了你的问题,问你做错了什么。

于 2019-03-27T18:47:23.103 回答