Python使用gpiozero库如何解决按钮按下/长按触发功能重复执行问题
问题原因
- 现有代码用while循环轮询按钮状态,只要按钮保持按下,每轮循环都会触发播放逻辑,自然会重复播放音频
- 没有加播放状态判断,也没有利用gpiozero内置的按钮事件机制,无法避免重复执行
解决方案
直接用gpiozero内置的按钮事件回调+按下时长判断逻辑,不需要复杂的状态控制,修改后代码如下:
from gpiozero import LED, Button import vlc import time # GPIO 初始化 greenLight = LED(17) # 配置按钮,设置长按判定时间为1秒 greenButton = Button(27, hold_time=1) # 初始化vlc播放器,不要每次播放都新建实例 player = vlc.MediaPlayer("/home/pi/Desktop/10 Second Countdown.mp3") # 状态标记:是否允许播放 allow_play = True # 按钮按下瞬间触发 def on_press(): global allow_play allow_play = True greenLight.on() print("Green Button Pressed") # 按钮长按达到1秒时触发 def on_hold(): global allow_play # 按住超过1秒,禁止播放 allow_play = False print("Hold over 1s, play blocked") # 按钮松开时触发 def on_release(): if allow_play: print("Game Audio Start") # 先停止之前的播放,避免重叠 player.stop() player.play() # 绑定事件回调 greenButton.when_pressed = on_press greenButton.when_held = on_hold greenButton.when_released = on_release # 主循环只需要保持程序运行即可 while True: time.sleep(0.1)
修改点说明
- 去掉了轮询判断按钮状态的逻辑,改用gpiozero自带的事件回调,
when_pressed只会在按钮按下的瞬间触发一次,按住不会重复执行 - 新增了
hold_time=1配置,按钮按住超过1秒就会触发when_held回调,把播放开关置为否 - 播放器实例全局只初始化一次,每次播放前先停止之前的播放,避免音频重叠
- 播放逻辑放在松开按钮的回调里,根据按住时长判断是否要播放,完全匹配需求
内容的提问来源于stack exchange,提问作者NormanD
相关产品推荐
相关产品推荐

