2016-11-13 160 views
0

我已經開始使用Python和Raspberry Pi,並試圖使用它們進行一些物理計算。如何中斷while循環,運行函數並返回循環

我從那開始: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_pressbutton.wait_for_release &有限,但button.is_pressed是給我的最好成績之一。

問題是,當我按下按鈕時,函數被調用,但循環繼續。那麼我怎樣才能重寫代碼,而不是當我按下循環停止的按鈕時,函數被調用,函數內的所有內容都已完成,然後又回到循環?

還有另一種解決方案,與其他按鈕屬性?

在此先感謝!

回答

0

如何像下面,而是調用的人行橫道功能時,直接按下按鈕,設置一個變量來表示人行橫道扣動扳機,那裏面while循環將調用pedestrian_crossing功能,如果是按然後返回到while循環

把檢查的pedestrian_press VAR在my_sleep功能,因此它會得到檢查每次my_sleep是在while循環中調用,使得它幾乎〜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() 
+0

謝謝您的回答@Skycc但更改'pedestrian_cross( )'在循環內部的綠燈後立即觸發按下按鈕。 –

+0

我的錯誤,我檢查函數名稱,而不是var名稱,修復它,請再試一次 – Skycc

+0

Hi @Skycc!現在如預期的那樣。我按下腳本運行的按鈕,直到「if」和人行橫道過程開始。但是當按下按鈕開始行人過路處時,是否有辦法立即中斷循環?正如你在按下按鈕時記住我的原始代碼那樣。唯一的問題是循環不停止。 ;-) 不管怎麼說,還是要謝謝你!!! –