在启动时启动无头音板脚本的问题

时间:2019-10-18 19:10:17

标签: python raspberry-pi raspbian gpio

我正在使用Raspberry Pi构建无头音板,因此需要一种方法来启动我在引导时使用的脚本。该程序使用默认的Pi编辑器Thonny进行了编辑和测试,一切似乎都按预期运行。我正在使用的所有按钮都能播放希望的声音,没有问题。

我继续进行操作,并在Pi启动时编辑了rc.local以运行脚本(具体来说,我在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不是唯一分配了两个功能的按钮,而是无论我使用什么引脚,都会引发此错误的唯一按钮。如果我从代码中删除循环,则不会出现该错误。

1 个答案:

答案 0 :(得分: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