Проблемы с запуском скрипта без звука при загрузке - PullRequest
0 голосов
/ 18 октября 2019

Я создаю безголовую деку, используя Raspberry Pi, и поэтому мне нужен способ запустить скрипт, который я использую при загрузке. Программа была отредактирована и протестирована с использованием стандартного редактора Pi 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 - не единственная кнопка, которой назначены две функции, а единственная, которая выдает эту ошибку, независимо от того, какой вывод я использую. Ошибка не появляется, если я удаляю цикл из кода.

1 Ответ

0 голосов
/ 19 октября 2019

Вы снова и снова создаете btn_0 в бесконечном цикле while. Во второй итерации 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
...