簡體   English   中英

如何中斷while循環,運行函數並返回循環

[英]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_pressbutton.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM