[英]How to interrupt a while loop, run a function and go back to the loop
我從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
是給我最好結果的那個。
問題是當我按下按鈕時,該函數被調用,但是循環繼續。 因此,我該如何重寫代碼,而不是按下按鈕時,循環停止,調用函數,完成函數內部的所有操作,然后返回循環?
或者還有其他按鈕屬性的解決方案?
提前致謝!
如下所示,不是在按下按鈕時直接調用行人過路功能,而是設置一個變量來指示行人過路按下觸發器,然后在while循環內,如果被按下,則會調用walker_crossing功能,然后返回while循環
將check_walker_press var放在my_sleep函數中,以便每次在while循環中調用my_sleep時都會得到檢查,這使得它幾乎延遲了約1秒的延遲中斷
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.