Pygame 音乐切换(ON/OFF 多首歌曲)
Pygame music switch (ON/OFF multiple songs)
我是 python 的新手,所以我没有太多经验。我正在创建一个 RPi 程序来使用拨动开关播放和停止 7 首不同的歌曲 (https://ktechnics.com/wp-content/uploads/2015/12/mini-6a-125vac-spdt-mts-102-3-pin-2-position-on-on-toggle-switch.jpg)。
我正在使用 GPIO 引脚的 PullUP/DOWN 电阻作为开关和 pygame.mixer.music 模块来播放歌曲。一首歌曲的效果如预期:
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()
我尝试为每首歌曲创建一个函数并稍后调用它,但它也不起作用。有什么想法吗??
正如我在评论中提到的,您的逻辑只允许播放第一首歌曲。因为第一个条件 (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 一次只能播放一首歌曲。这使得拨动开关在这里似乎是一个糟糕的选择。目前尚不清楚当 2 个开关都打开时会发生什么。考虑使用 momentary switches or a rotary switch.
我是 python 的新手,所以我没有太多经验。我正在创建一个 RPi 程序来使用拨动开关播放和停止 7 首不同的歌曲 (https://ktechnics.com/wp-content/uploads/2015/12/mini-6a-125vac-spdt-mts-102-3-pin-2-position-on-on-toggle-switch.jpg)。
我正在使用 GPIO 引脚的 PullUP/DOWN 电阻作为开关和 pygame.mixer.music 模块来播放歌曲。一首歌曲的效果如预期:
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()
我尝试为每首歌曲创建一个函数并稍后调用它,但它也不起作用。有什么想法吗??
正如我在评论中提到的,您的逻辑只允许播放第一首歌曲。因为第一个条件 (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 一次只能播放一首歌曲。这使得拨动开关在这里似乎是一个糟糕的选择。目前尚不清楚当 2 个开关都打开时会发生什么。考虑使用 momentary switches or a rotary switch.