首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何中断while循环、运行函数并返回到循环

如何中断while循环、运行函数并返回到循环
EN

Stack Overflow用户
提问于 2016-11-13 20:32:27
回答 1查看 1K关注 0票数 0

我从Python和Raspberry Pi开始,并尝试用它们进行一些物理计算。

我从这个开始:https://www.raspberrypi.org/learning/physical-computing-with-python/,一切都很顺利。

然后我试着玩红绿灯(成功了!):https://www.raspberrypi.org/learning/physical-computing-with-python/trafficlights/

下面是我的代码:

代码语言:javascript
复制
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()

然后我试着在人行横道上加一个按钮。但在这里我遇到了问题。

代码如下:

代码语言:javascript
复制
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给了我最好的结果。

问题是,当我按下按钮时,函数被调用,但循环仍在继续。那么我如何重写代码,然后当我按下按钮时,循环停止,函数被调用,函数中的所有事情都完成了,然后它又回到了循环中?

或者有另一种解决方案,使用其他按钮属性?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2016-11-13 21:30:35

如下所示,不是在按下按钮时直接调用行人过街函数,而是设置一个变量来指示行人过街按下触发器,然后在while循环内部调用pedestrian_crossing函数,如果按下则返回while循环

将对pedestrian_press变量的检查放在my_sleep函数中,这样每次在while循环中调用my_sleep时,它都会得到检查,这使得它几乎延迟了~1s

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40573860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档