循环可以在外部提前终止吗?

时间:2017-11-25 00:37:56

标签: python raspberry-pi

我正在编写一些Python代码,在按下按钮之前会播放蜂鸣器音调模式,这会将模式切换到while True:循环中的下一个模式。为简洁起见,我没有包含模块导入或按钮和蜂鸣器声明。此外,在每个循环结束时,可以假设蜂鸣器将处于关闭位置。

i = 1 # the current pattern
patterns = 2 # total number of patterns, or last pattern

def buttonClicked(): # changes i when button is pressed
    if i > patterns:
        i = 1
    else:
        i = i + 1

while True:

    while i == 1:
        # buzzer on
        # sleep
        # buzzer off

    while i == 2:
        #buzzer on
        #sleep
        #buzzer off
        #sleep
        #buzzer on
        #sleep
        #buzzer off

我知道这个解决方案并不是最好的,但除了一件事之外,它在很大程度上起作用了。使用当前设置,仅检查i是否在每个内循环开始时递增,因此模式必须完成以切换到下一个(如果按下按钮)。这是有问题的,因为一些模式的单次迭代(为简洁起见未示出)可以持续长达10秒。

对好事: 如何让按钮立即触发模式切换?

我已经研究过使用多个线程,因为按下按钮后按钮的标准方法会立即执行,但我不知道如何在按下按钮后停止while循环。此行为类似于JavaScript中的事件侦听器。

以下是我查看按钮的一些文档:https://gpiozero.readthedocs.io/en/stable/api_input.html#gpiozero.Button.when_pressed

1 个答案:

答案 0 :(得分:0)

这个怎么样?

step = 0 # where we are in the cycle
patterns = [ # time to sleep between on/off
    [0.5, 1.0],
    [2.0, 3.0, 4.5, 1.0],
]

while True:
    if step % 2 == 0: # even cycle
        # buzzer on
    else: # odd cycle
        # buzzer off
    pat = patterns[i]
    sleep(pat[step % len(pat)])
    step += 1

这样,最大延迟是最大的睡眠时间,而不是整个模式。代码更紧凑,数据驱动(每个模式只有一行)。