Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用gpiozero按钮方法检查在特定时间按下按钮的情况_Python 3.x_Raspberry Pi_Gpio_Raspberry Pi4_Gpiozero - Fatal编程技术网

Python 3.x 如何使用gpiozero按钮方法检查在特定时间按下按钮的情况

Python 3.x 如何使用gpiozero按钮方法检查在特定时间按下按钮的情况,python-3.x,raspberry-pi,gpio,raspberry-pi4,gpiozero,Python 3.x,Raspberry Pi,Gpio,Raspberry Pi4,Gpiozero,我目前正在做一个小项目,用Python开始物理计算——使用raspberry pi。我正在尝试使用3个LED和一个按钮制作一个游戏。3个LED将按特定顺序闪烁不同时间,当琥珀色LED打开时,您必须单击按钮。到目前为止,我已经尝试使用gpiozero来识别按钮何时打开,并查看琥珀色led是否在时间范围内打开 游戏代码: (如果上面的链接不起作用,请让我知道) 代码: 我理解为什么会发生这种情况,但我不知道如何在琥珀色LED亮起之前“阻止”任何按钮的点击。正如您所看到的,我有一个while循环来尝试

我目前正在做一个小项目,用Python开始物理计算——使用raspberry pi。我正在尝试使用3个LED和一个按钮制作一个游戏。3个LED将按特定顺序闪烁不同时间,当琥珀色LED打开时,您必须单击按钮。到目前为止,我已经尝试使用gpiozero来识别按钮何时打开,并查看琥珀色led是否在时间范围内打开

游戏代码: (如果上面的链接不起作用,请让我知道)

代码:

我理解为什么会发生这种情况,但我不知道如何在琥珀色LED亮起之前“阻止”任何按钮的点击。正如您所看到的,我有一个while循环来尝试在前4秒阻止任何命令,但它作为延迟而不是后台循环(因此它在4秒之后才会启动下一个代码)

我注意到使用这种方法-
按钮。当按下=lambda:clickedRight(ambTime,greenTime,time.time())
-它总是在检查按钮按下情况,无论这一行在代码中的什么位置,所以如果我把这一行放在amberLed.on()之前,这一点都不重要

我希望我已经正确地解释了这一点,这已经困扰了我很长一段时间,所以任何帮助都将不胜感激。我曾尝试过多处理,但对如何在这里集成它感到困惑,但我愿意接受任何建议。我完全理解您可能无法测试您的代码,所以我很乐意尝试任何东西,并对出现的任何问题(如果有)作出回应


谢谢你。

正如你所说;运行

    button.when_pressed = lambda:clickedRight(ambTime, greenTime, time.time())
…立即启动监视按钮单击的线程,如果 您的
lambda
函数在定义
ambTime
之前运行,它将失败。 最简单的解决方案可能是将ambTime初始化为某个值 设置
按钮之前。按下
操作时,例如:

def gameEasy():
    ...
    ambTime = None
    button.when_pressed = lambda:clickedRight(ambTime, greenTime, time.time())
    ...
clickedRight
函数中,明确检查
ambTime
具有有效值。可能是这样的:

def clickedRight(led_clicked_time, led_after_turnedon_time, button_time):
    if led_clicked_time is not None and (
      button_time >= led_clicked_time and
      button_time <= led_after_turnedon_time
    ):
        print("Yay")
    else:
        print("Missed")
    button.when_pressed = None
def clickedRight(led(发光二极管)单击时间、led(发光二极管)打开时间后、按钮时间):
如果led_单击_时间不是无,则(
按钮\u时间>=发光二极管\u单击\u时间和

按钮时间最好是在问题本身中包含您要询问的代码。如果代码共享链接过期,请回答此问题(以及答案)对于未来的读者来说,这将变得不那么有用。您不需要包含整个程序;理想情况下,只需要包含足够的代码,就可以让我们在自己的设备上重现问题。当然,我会添加我认为最重要的代码。抱歉,我觉得代码共享不会过期。谢谢,这非常有效,我不确定为什么我没有这样做想想看。
def gameEasy():
    ...
    ambTime = None
    button.when_pressed = lambda:clickedRight(ambTime, greenTime, time.time())
    ...
def clickedRight(led_clicked_time, led_after_turnedon_time, button_time):
    if led_clicked_time is not None and (
      button_time >= led_clicked_time and
      button_time <= led_after_turnedon_time
    ):
        print("Yay")
    else:
        print("Missed")
    button.when_pressed = None