我正在编写一些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
答案 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
这样,最大延迟是最大的睡眠时间,而不是整个模式。代码更紧凑,数据驱动(每个模式只有一行)。