Pygame音乐开关(打开/关闭多首歌曲)

2024-04-23 09:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python很陌生,所以没有太多经验。我正在创建一个RPi程序,使用切换开关(https://ktechnics.com/wp-content/uploads/2015/12/mini-6a-125vac-spdt-mts-102-3-pin-2-position-on-on-toggle-switch.jpg)播放和停止7首不同的歌曲。你知道吗

我使用的是GPIO引脚的上拉/下拉电阻,用于开关和pygame.mixer.音乐播放歌曲的模块。它的工作原理与预期的一首歌:

import RPi.GPIO as GPIO
import pygame

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pygame.init()
pygame.mixer.init()

cancion_1 = '/media/pi/PIERRE/0001.mp3'

while True:
    switch_1 = GPIO.input(18)

    if switch_1 == False:
        if pygame.mixer.music.get_busy() == False:
            print("Cancion 1 Sonando")
            pygame.mixer.music.load(cancion_1)
            pygame.mixer.music.play()

    else:
        if pygame.mixer.music.get_busy() == True:
            print("Cancion 1 Callada")
            pygame.mixer.music.stop()

但当我尝试添加更多歌曲时,程序只播放第一首歌曲:

import RPi.GPIO as GPIO
import pygame

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pygame.init()
pygame.mixer.init()

cancion_1 = '/media/pi/PIERRE/0001.mp3'
cancion_2 = '/media/pi/PIERRE/0002.mp3'

while True:
    switch_1 = GPIO.input(18)
    switch_2 = GPIO.input(19)

    if switch_1 == False:
        if pygame.mixer.music.get_busy() == False:
            print("Cancion 1 Sonando")
            pygame.mixer.music.load(cancion_1)
            pygame.mixer.music.play()

    elif switch_1 == True:
        if pygame.mixer.music.get_busy() == True:
            print("Cancion 1 Callada")
            pygame.mixer.music.stop()

    elif switch_2 == False:
        if pygame.mixer.music.get_busy() == False:
            print("Cancion 2 Sonando")
            pygame.mixer.music.load(cancion_2)
            pygame.mixer.music.play()

    elif switch_2 == True:
        if pygame.mixer.music.get_busy() == True:
            print("Cancion 2 Callada")
            pygame.mixer.music.stop()

我试着为每首歌创建一个函数,稍后再调用它,但也不起作用。有什么想法吗??你知道吗


Tags: importfalsetruegetgpioifinitmusic
1条回答
网友
1楼 · 发布于 2024-04-23 09:17:49

正如我在评论中提到的,您的逻辑只允许播放第一首歌。因为第一个条件(if switch_1 == False:)或第二个条件(elif switch_1 == True:)中的一个将为真。因此,条件3和4永远无法达到。你知道吗

这里有一种重新配置的方法:

import RPi.GPIO as GPIO
import pygame

# Create a list of tuples. First index is gpio pin, 2nd is song
# This marries the pin data with the song data
# It also allows you to easily add more pins/songs
song_data = [(18, "/media/pi/PIERRE/0001.mp3"),
             (19, "/media/pi/PIERRE/0002.mp3")]

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)

# Use a loop to setup pins
for pin,_ in song_data:
   GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pygame.init()
pygame.mixer.init()

# A function to check a pin and react
def check_toggle(pin, song):
    # Looks like you want to play when switch == False
    # I'm adding these variables to clarify
    button_is_pressed = not GPIO.input(pin)
    music_is_playing = pygame.mixer.music.get_busy()
    if button_is_pressed and not music_is_playing:
        pygame.mixer.music.load(song)
        pygame.mixer.music.play()
    elif not button_is_pressed and music_is_playing:
        pygame.mixer.music.stop()

while True:
    for pin,song in song_data:
        check_toggle(pin, song)
    # You might want to add a sleep here to keep from hogging the CPU

注意:在本例中,如果两个开关都打开,则只播放第一首歌曲。Pygame一次只能播放一首歌。这使得拨动开关在这里看起来是个糟糕的选择。不清楚当两个开关都打开时会发生什么。考虑使用momentary switchesrotary switch。你知道吗

相关问题 更多 >