面对pygame的问题



我正在尝试使用pygame构建一个音乐播放器,但我面临很多问题。
基本思想是把一些歌曲放在一个列表中并访问它们。

  1. 对于shuffle选项,我导入了random模块并使用randint方法生成随机数,当循环为真时,这些随机数将用作索引值来访问列表。数字正在按预期生成,但是mixer.music.load(song_list[random_numbers)不工作并且没有播放歌曲。

  2. 对于循环选项,我使用了while循环来播放特定歌曲的特定次数。我写了一段代码,它应该在循环中断时询问用户是否继续侦听。相反,这段代码是在循环中断之前实现的。

  3. 我已经使用if语句来实现shuffle和loop选项。如果两者都为假,则执行else语句,并按顺序播放歌曲。为此,我使用了' For '循环来迭代歌曲列表,但是' For '循环不工作,甚至没有执行循环中断

# playlist using python
def dir_path(path):
try:
import os
import time
import random
from pygame import mixer
mixer.init()
# songs list
songs_list = []
lis = os.listdir(path)
for i in lis:
a = os.path.join(path, i)
songs_list.append(a)
# to enable shuffling
shuffle = input('enable shuffling? y/n: ')
if shuffle.lower() == 'y':
b = []
t_end = time.time() + 60 * float(input('play time in minutes: '))
while time.time() < t_end:
a = random.randint(0, len(songs_list) - 1)
if a not in b:
b.append(a)
mixer.music.load(songs_list[a])
mixer.music.play()
if len(b) == len(songs_list):
b.clear()
print('thanks for listening :)')
# to enable looping
elif shuffle.lower() == 'n':
loop = input('enable looping? y/n: ')
if loop.lower() == 'y':
sl_num = 1
for i in lis:
print(f'{sl_num}) {i}')
sl_num += 1
sl_no = int(input('sl_no of the song: '))
loop_no = int(input('number of loops: '))
loop_times = 0
while loop_times < loop_no:
if sl_no <= len(songs_list):
mixer.music.load(songs_list[sl_no - 1])
mixer.music.play()
loop_times += 1
else:
print(f'only {len(songs_list)} songs are available')
loop_times = loop_no
if loop_times == loop_no:
conn = input('continue listening? y/n: ')
if conn.lower() == 'y':
dir_path(path)
elif conn.lower() == 'n':
print('Thanks for listening :)')
break
else:
print('invalid command')
break
# to play songs in order
elif loop.lower() == 'n':
for i in range(0, len(songs_list)):
mixer.music.load(songs_list[i])
mixer.music.play()
print('thanks for listening :)')
else:
print('invalid command')
else:
print('invalid command')
except KeyboardInterrupt:
print('Thanks for listening :)')


dir_path('song directory path')

问题来源

当mixer正在播放歌曲时,您应该在程序中等待。否则程序将继续运行并最终结束(您将没有时间听到任何内容)。

<标题>

解决方案在mixer.music.play()之后,您应该在播放歌曲时暂停程序的执行。mixer.music.get_busy()是一个用于测试歌曲是否正在播放的函数。

<标题>

我对程序的结构做了一些小的不重要的改变,但是你仍然可以把我的解决方案应用到你的程序中。

import os
import time
import random
from pygame import mixer

def ValidInput(user_input):
if(user_input == 'y' or user_input == 'n'):
return 1
return 0

def dir_path(path):
mixer.init()
songs_list = []
lis = os.listdir(path)
for i in lis:
a = os.path.join(path, i)
songs_list.append(a)
# to enable shuffling
shuffle = input('enable shuffling? y/n: ')
if(not ValidInput(shuffle)):
print('invalid command')
if shuffle.lower() == 'y':
already_played_songs = []  # index of songs already played
t_end = time.time() + 60 * float(input('play time in minutes: '))
while time.time() < t_end:
a = random.randint(0, len(songs_list) - 1)
if a not in already_played_songs:
already_played_songs.append(a)
mixer.music.load(songs_list[a])
mixer.music.play()
# keep playing current song until it finishes
# or allocated time ends
while(True):
if(time.time() >= t_end or not mixer.music.get_busy()):
break
if len(already_played_songs) == len(songs_list):
already_played_songs.clear()
mixer.music.stop()  # stop any playing song at this point
print('thanks for listening :)')
return
# to enable looping
if shuffle.lower() == 'n':
loopActivated = input('enable looping? y/n: ')
if(not ValidInput(loopActivated)):
print('invalid command')
if loopActivated.lower() == 'y':
sl_num = 1
for i in lis:
print(f'{sl_num}) {i}')
sl_num += 1
sl_no = int(input('sl_no of the song: '))
loop_no = int(input('number of loops: '))
loop_times = 0
while loop_times < loop_no:
if sl_no <= len(songs_list):
mixer.music.load(songs_list[sl_no - 1])
mixer.music.play()
while(True):
if(not mixer.music.get_busy()):
break  # song finished playing
loop_times += 1
else:
print(f'only {len(songs_list)} songs are available')
loop_times = loop_no
if loop_times == loop_no:
conn = input('continue listening? y/n: ')
if conn.lower() == 'y':
dir_path(path)
elif conn.lower() == 'n':
print('Thanks for listening :)')
return
else:
print('invalid command')
return
#  play songs in order
if loopActivated.lower() == 'n':
for i in range(0, len(songs_list)):
mixer.music.load(songs_list[i])
mixer.music.play()
while(True):
if(not mixer.music.get_busy()):
break  # song finished playing
print('thanks for listening :)')
return

dir_path('C:\Users\user\Music')