首页 > 解决方案 > 如何在按钮按下/按住时停止重复 - Python

问题描述

我希望有人可能对如果按住按钮(或者在我的情况下按下超过一秒)如何阻止脚本继续重复有一些见解?

基本上我在面包板上设置了一个按钮,并且我将它编码为在按下按钮时播放音频文件。这是可行的,但是如果按钮不是很快被点击,那么音频将自行重复,直到按钮完全释放。此外,如果按住按钮,音频文件将无限期地重复。

如果它有帮助,我已经录制了一个快速记录来演示这个问题,这里:https ://streamable.com/esvoy6

我还应该注意,我对 python 非常陌生(实际上是一般的编码),所以它很可能是一些我还没有找到的简单的东西。我正在为我的图书馆使用 gpiozero。

非常感谢任何帮助或见解!


这是我的代码现在的样子:

from gpiozero import LED, Button
import vlc
import time
import sys
def sleep_minute(minutes):
    sleep(minutes * 60)


# GPIO Pins of Green LED
greenLight = LED(17)
greenButton = Button(27)


# Green Button Pressed Definition
def green_btn_pressed():
    print("Green Button Pressed")
    greenButton.when_pressed = greenLight.on
    greenButton.when_released = greenLight.on

# Executed Script
while True:
    if greenButton.is_pressed:
        green_btn_pressed()
        time.sleep(.1)
        print("Game Audio Start")
        p = vlc.MediaPlayer("/home/pi/Desktop/10 Second Countdown.mp3")
        p.play()

标签: pythonpython-3.xbuttongpiozero

解决方案


因此,从简短的角度来看,'time.sleep(.1)' 似乎没有达到你的预期。IE。它显然被按钮按下中断。这不是异常行为,因为在 Ardiuno 和 raspPi(在这里猜测)上的按钮按下将作为中断处理。脚本本身不包含任何防止双击或按住等的措施。

你有没有输入任何调试行来查看按下按钮时正在执行什么?我将从那里开始并根据您所看到的进行调整。

我不熟悉这个 gpiozero,所以我无法了解它可能在做什么,但是查看代码并考虑到您遇到的问题,我将从两个函数中的一些调试行开始确认什么是正在发生。

不过想一想,你能不能把检查改成'if greenButton.is_released:'?那时您就知道该按钮已被按下,并且按住它的时间变得无关紧要。可能还需要检查文件是否已经在播放以停止并重新启动它,或者忽略并继续播放(如果这是所需的行为)。

进一步的建议:

对于这部分代码:

# Executed Script
while True:
    if greenButton.is_pressed:
        green_btn_pressed()
        time.sleep(.1)
        print("Game Audio Start")
        p = vlc.MediaPlayer("/home/pi/Desktop/10 Second Countdown.mp3")
        p.play()

您想将其更改为以下内容:

alreadyPlaying = 0
# Executed Script
while True:
    if greenButton.is_pressed:
        green_btn_pressed()

        #Check if already playing file.
        if alreadyPlaying == 1:
   
            # Do check to see if file is still playing (google this, not sure off the top of head how to do this easiest).
            # If file still playing do nothing, 
            #else set 'alreadyPlaying' back to '0'
            break


        #Check if already playing file.
        if alreadyPlaying == 0:
            time.sleep(.1)
            print("Game Audio Start")
            p = vlc.MediaPlayer("/home/pi/Desktop/10 Second Countdown.mp3")
            p.play()
            alreadyPlaying = 1

希望你明白我在说什么。祝你好运!


推荐阅读