python - 在启动时启动无头音板脚本的问题
问题描述
我正在使用 Raspberry Pi 构建一个无头音板,因此需要一种方法来启动我在启动时使用的脚本。该程序使用默认编辑器 Pi shot up,Thonny 进行了编辑和测试,一切似乎都按预期运行。我使用的按钮都会播放我期望的声音,没有问题。
我继续编辑rc.local
以在 Pi 启动后立即运行脚本(具体来说,我在sudo python /filepath/soundboard.py &
上面添加了exit 0
),它确实如此。它的运行方式似乎与使用 Thonny 的方式相同,但即使没有按下任何按钮,声音也会在大约 5 秒后中断。当我直接通过命令行运行它时,会出现同样的问题。
这里的代码已经被压缩了,因为有不止一个按钮,但它们都使用同一行。
import pygame
import random
import glob
from gpiozero import Button
import time
pygame.init()
while True:
n = glob.glob('/filepath/*.wav')
btn_0 = Button(8)
btn_0.when_pressed = pygame.mixer.stop
btn_0.when.held = lambda: pygame.mixer.Sound(random.choice(n)).play()
据我所知,while
循环继续运行程序,但按下按钮什么也没做。此外,由于添加了循环,代码转储了一个 Traceback,显示错误
gpiozero.exc.GPIOPinInUse: pin 8 is already in use by <gpiozero.Button objext on pin GPIO8, pull_up=True, is_active=False>
这可能与我的问题有关?btn_0
不是唯一一个分配了两个功能的按钮,而是唯一一个引发此错误的按钮,无论我使用什么引脚。如果我从代码中删除循环,则不会出现错误。
解决方案
您一次又一次地在无限循环中创建 btn_0。在第二次迭代中,btn_0 可能是再次创建的第一个按钮。但是引脚 8(应该用于按钮)在上一次迭代中已分配给 btn_0 的旧实例。
您应该将 glob.glob 语句和按钮初始化移到 While 循环之外。如果需要 while 循环来保持程序运行,请将其放在初始化代码下方并遍历 nop ore pause 语句(无论什么都有效)。如果pygame.init
启动它自己的循环线程,则最后根本不需要 while 循环。
我对pygame一无所知,所以最后的陈述只是一个猜测。
例子:
import pygame
import random
import glob
from gpiozero import Button
import time
pygame.init()
n = glob.glob('/filepath/*.wav')
btn_0 = Button(8)
btn_0.when_pressed = pygame.mixer.stop
btn_0.when.held = lambda: pygame.mixer.Sound(random.choice(n)).play()
while True:
nop
推荐阅读
- http-post - 如何在 STRAPI 中发布关系
- python - AttributeError: 'NoneType' 对象在使用 pip 包安装包时没有属性'encoding'
- elasticsearch - 弹性搜索上的滚动时间增量效果
- javascript - 在 Selenium 中使用 Xpath 改变 innerHTML;Python 创建多个导致 SyntaxError: Invalid or unexpected token 的转义
- php - 致命错误:在布尔值上调用成员函数 bind_param()。PHP 错误
- python - Selenium 很好地检测到弹出对话框,但无法处理它
- python - 计算python列表中对象的出现次数
- reactjs - 图像 URL 同时采用 localhost 和服务器主机
- python - Django:会话在 Heroku 上没有按预期工作
- android - 程序类型已经存在:com.opencsv.CSVParser