我从Python和Raspberry Pi开始,并尝试用它们进行一些物理计算。
我从这个开始:https://www.raspberrypi.org/learning/physical-computing-with-python/,一切都很顺利。
然后我试着玩红绿灯(成功了!):https://www.raspberrypi.org/learning/physical-computing-with-python/trafficlights/
下面是我的代码:
from gpiozero import Button, TrafficLights
from time import sleep
lights = TrafficLights(25, 8, 7)
while True:
lights.green.on()
print("GREEN")
sleep(12)
lights.green.off()
lights.amber.on()
print("AMBER")
sleep(4)
lights.red.on()
lights.amber.off()
print("RED")
sleep(12)
lights.amber.on()
print("RED & AMBER")
sleep(4)
lights.red.off()
lights.amber.off()然后我试着在人行横道上加一个按钮。但在这里我遇到了问题。
代码如下:
from gpiozero import Button, TrafficLights
from time import sleep
button = Button(21)
lights = TrafficLights(25, 8, 7)
def pedestrian_crossing():
sleep(4)
lights.off()
lights.amber.on()
print("Pedestrian crossing: AMBER")
sleep(4)
lights.red.on()
lights.amber.off()
print("Pedestrian crossing: RED")
sleep(12)
lights.amber.on()
print("Pedestrian crossing: RED & AMBER")
sleep(4)
lights.red.off()
lights.amber.off()
button.when_pressed = pedestrian_crossing
while True:
lights.green.on()
print("GREEN")
sleep(12)
lights.green.off()
lights.amber.on()
print("AMBER")
sleep(4)
lights.red.on()
lights.amber.off()
print("RED")
sleep(12)
lights.amber.on()
print("RED & AMBER")
sleep(4)
lights.red.off()
lights.amber.off()我尝试了button.wait_for_press,button.wait_for_release & Co.,但button.is_pressed给了我最好的结果。
问题是,当我按下按钮时,函数被调用,但循环仍在继续。那么我如何重写代码,然后当我按下按钮时,循环停止,函数被调用,函数中的所有事情都完成了,然后它又回到了循环中?
或者有另一种解决方案,使用其他按钮属性?
提前感谢!
发布于 2016-11-13 21:30:35
如下所示,不是在按下按钮时直接调用行人过街函数,而是设置一个变量来指示行人过街按下触发器,然后在while循环内部调用pedestrian_crossing函数,如果按下则返回while循环
将对pedestrian_press变量的检查放在my_sleep函数中,这样每次在while循环中调用my_sleep时,它都会得到检查,这使得它几乎延迟了~1s
pedestrian_press = False
def pedestrian_crossing():
global pedestrian_press
pedestrian_press = False # reset press
sleep(4)
lights.off()
lights.amber.on()
print("Pedestrian crossing: AMBER")
sleep(4)
lights.red.on()
lights.amber.off()
print("Pedestrian crossing: RED")
sleep(12)
lights.amber.on()
print("Pedestrian crossing: RED & AMBER")
sleep(4)
lights.red.off()
lights.amber.off()
def set_pedestrian_press():
global pedestrian_press
pedestrian_press = True
button.when_pressed = set_pedestrian_press
def my_sleep(n):
# checking for pedestrian press done at 1 sec interval
# to make it check at smaller interval
# change to range(n*10) then sleep(0.1), for 0.1s interval
for i in range(n):
sleep(1)
if pedestrian_press: # check if pedestrian press
pedestrian_crossing()
while True:
lights.green.on()
print("GREEN")
my_sleep(12) # every second will check for pedestrian_press
lights.green.off()
lights.amber.on()
print("AMBER")
my_sleep(4) # every second will check for pedestrian_press
lights.red.on()
lights.amber.off()
print("RED")
my_sleep(12) # every second will check for pedestrian_press
lights.amber.on()
print("RED & AMBER")
my_sleep(4) # every second will check for pedestrian_press
lights.red.off()
lights.amber.off()https://stackoverflow.com/questions/40573860
复制相似问题