0

我希望有人可以帮助我解决这个问题。我希望修复起来相当简单,但我已经尝试了一段时间来解决这个问题。我已将较大的代码修剪为此,因为我相信这里的问题是问题的症结所在。

我有一个树莓派和一个外部按钮。这是在 Linux 上的 python3 上。我正在使用 GPIOZero 作为按钮。我相信下面的代码很容易理解,但基本上,我希望函数始终循环。当我按下一个按钮时,我希望另一个函数运行,但前提是变量是某个数字。我在下面的评论中描述了我最终想要发生的事情,但是我的代码未完成并且仅针对这个问题进行了简化。

我只想button.when_pressedtimer = 0. 问题是,一旦代码自然地进入button.when_pressed函数,它就再也不会“放开”函数了。当我成功将变量重新定义为时,当我按下按钮时timer = 1,它仍然打印按钮被按下。我不知道为什么。对我来说,它似乎应该只工作一次timer = 0

有什么建议么?我想我对我将计划研究的全局变量有误解。我不确定这是否是问题所在。我也尝试过使用breakcontinue试图让它“回到它的循环”,但这也没有奏效。我也想使用button.when_pressed而不是btn.is_pressed,因为我希望程序仅在我按住按钮一次时执行某些操作,而不是在按住按钮时循环。在这种情况下,我希望按下按钮以打印一次。如果我这样做btn.is_pressed了,它将每两秒按下一次打印按钮,这是我不想要的。

谢谢你的帮助。我很高兴学习。

#!/usr/bin/python3

from gpiozero import Button
from time import sleep
import time

button = Button(4)
timer = 0

def press():
    print("Button is pressed")
    global timer
    timer = 1
   
def loop():
    global timer
    timer =  1
   
while True:
       
    if timer == 0:
        button.when_pressed = press
   
    else:
        loop()

    sleep(2)
4

2 回答 2

0

如果你想禁用你设置的回调button.when_pressed,你需要用 做另一个分配button.when_pressed = None这在文档中列出:

何时发布

[...]将此属性设置为None(默认值)以禁用事件。

目前尚不清楚您希望从当前代码中获得什么行为。如果您希望按钮激活 2 秒,然后无限期停用,您可以使用:

button.when_pressed = press
sleep(2)
button.when_pressed = None

不需要循环,因为您不想重复任何事情。

如果您只希望按钮在单次按下时处于活动状态,这需要在 2 秒内发生,您可以改为调用button.wait_for_press(2). 不过,我不愿为此编写完整的代码块,因为文档没有指定如何发出超时信号(可能是通过返回值或通过异常)。我没有 Raspberry Pi,所以我无法测试自己,但您可以尝试一下,看看会发生什么。

于 2021-12-21T00:12:45.220 回答
0

把你的整段代码当作一个“黑匣子”,问问自己,输入/输出是什么?button press还是timer mode?(因为我不太明白timer你的代码中的变量是什么意思)

您的代码暗示timer mode是控制流程的顶级输入,

while True:
    if timer == 0:
        button.when_pressed = press
    else:
        loop()
    sleep(2)

是预期的吗?

如果您允许用户随时按下按钮,建议您button press作为您的顶级输入,更改逻辑以保持when_pressed回调始终打开,一旦触发就设置标志,然后检查按钮是否已经pressed并且仍在is_pressed您的 while 循环中.

pressed = False

def play_video_1():
    pass

def play_video_2():
    pass

def press():
    print("Button is pressed")
    global pressed
    pressed = True


button.when_pressed = press

while True:
       
    if pressed and not_playing_video2:
        if is_pressed:
            play_video_1()
        else:
            pressed = False
            play_video_2()
    else:
        play_video_2()

于 2021-12-21T05:23:27.203 回答