【问题标题】:How to stop repeat on button press/hold - Python如何在按钮按下/按住时停止重复 - Python
【发布时间】:2021-11-08 08:12:00
【问题描述】:

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

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

我已经录制了一个快速记录来演示这个问题,如果它有帮助的话,这里: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()

【问题讨论】:

  • 您想要的应用程序正在播放音频。如果再次点击,是不是播放结束才播放?
  • 是的,完全正确。我将有两个按钮,一个开始按钮和一个停止按钮。我的目标是只按一次开始按钮即可开始播放音频。然后让第二个按钮在按下时停止音频。但是在播放音频时,我希望启动按钮在被按下时无法激活。阻止音频重复。

标签: python python-3.x button gpiozero


【解决方案1】:

因此,从简短的角度来看,'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

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

【讨论】:

    【解决方案2】:

    我认为您必须在循环中编写类似的内容:

    import time, vlc
    
    def Sound(sound):
        vlc_instance = vlc.Instance()
        player = vlc_instance.media_player_new()
        media = vlc_instance.media_new(sound)
        player.set_media(media)
        player.play()
        time.sleep(1.5)
        duration = player.get_length() / 1000
        time.sleep(duration)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多