Python 3.x 如何使用gpiozero按钮方法检查在特定时间按下按钮的情况
我目前正在做一个小项目,用Python开始物理计算——使用raspberry pi。我正在尝试使用3个LED和一个按钮制作一个游戏。3个LED将按特定顺序闪烁不同时间,当琥珀色LED打开时,您必须单击按钮。到目前为止,我已经尝试使用gpiozero来识别按钮何时打开,并查看琥珀色led是否在时间范围内打开 游戏代码: (如果上面的链接不起作用,请让我知道) 代码: 我理解为什么会发生这种情况,但我不知道如何在琥珀色LED亮起之前“阻止”任何按钮的点击。正如您所看到的,我有一个while循环来尝试在前4秒阻止任何命令,但它作为延迟而不是后台循环(因此它在4秒之后才会启动下一个代码) 我注意到使用这种方法-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循环来尝试
按钮。当按下=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