python - 如何在按钮按下/按住时停止重复 - 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()
解决方案
因此,从简短的角度来看,'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
希望你明白我在说什么。祝你好运!
推荐阅读
- python - 我无法通过子域登录
- java - 动态修改的 CXF 故障转移管道 - 保证相同的 SSL 会话和客户端线程安全?
- automator - 不再能够粘贴到 automator 中创建的对话框中。莫哈韦 10.14.5
- ios - 从第三个容器更新 UITableView
- jenkins - 动态查找要上传到 Artifactory Jenkins 管道的文件
- ios - WKWebView 在 WKHTTPCookieStore 中设置 cookie 时不更新 document.cookie
- keras - Google ML 作业被随机终止并在没有给出原因的情况下重新启动
- c# - 声明对象集合的问题
- c# - 关于 Nuget 包的商店认证问题
- c# - 如果我想使用外部库从 C# 项目调用 Python 代码,我应该如何设置 Visual Studio 解决方案?