import os
import sys
import pygame
class MusicPlayer:
def __init__(self, music_folder):
self.music_folder = music_folder
self.music_list = []
self.current_music_index = 0
self.is_paused = False
self.volume = 0.5
self.search_str = ""
# 初始化 Pygame Mixer
pygame.mixer.pre_init(44100, -16, 2, 512)
pygame.mixer.init()
# 加载音乐列表
self.load_music_list()
def load_music_list(self):
"""
加载音乐文件列表
"""
self.music_list = []
for file in os.listdir(self.music_folder):
if file.endswith(".mp3"):
filepath = os.path.join(self.music_folder, file)
self.music_list.append(filepath)
def play_music(self):
"""
播放当前音乐
"""
pygame.mixer.music.load(self.music_list[self.current_music_index])
pygame.mixer.music.set_volume(self.volume)
pygame.mixer.music.play()
def pause_music(self):
"""
暂停或恢复当前音乐
"""
self.is_paused = not self.is_paused
if self.is_paused:
pygame.mixer.music.pause()
else:
pygame.mixer.music.unpause()
def set_volume(self, volume):
"""
调节音量
"""
self.volume = volume
pygame.mixer.music.set_volume(volume)
def next_music(self):
"""
播放下一首音乐
"""
self.current_music_index = (self.current_music_index + 1) % len(self.music_list)
self.play_music()
def search_music(self, search_str):
"""
搜索音乐并播放
"""
match_list = []
for i, filepath in enumerate(self.music_list):
if search_str in os.path.basename(filepath):
match_list.append(i)
if not match_list:
return False
self.current_music_index = match_list[0]
self.play_music()
return True
class MusicPlayerWindow:
def __init__(self, width, height, title, music_folder):
self.width = width
self.height = height
self.title = title
self.music_folder = music_folder
# 创建 Pygame 窗口
pygame.init()
self.screen = pygame.display.set_mode((self.width, self.height))
pygame.display.set_caption(self.title)
# 加载字体
self.font = pygame.font.SysFont("Arial", 18)
# 创建音乐播放器
self.music_player = MusicPlayer(self.music_folder)
self.music_player.play_music()
def draw(self):
"""
绘制窗口内容
"""
# 清空屏幕
self.screen.fill((255, 255, 255))
# 绘制音乐文件夹名称
folder_text = self.font.render("Music Folder: " + self.music_folder, True, (0, 0, 0))
self.screen.blit(folder_text, (20, 20))
# 绘制当前音乐名称
current_music_text = self.font.render("Now Playing: " + os.path.basename(self.music_player.music_list[self.music_player.current_music_index]), True, (0, 0, 0))
self.screen.blit(current_music_text, (20, 60))
# 绘制暂停/恢复按钮
pause_text = "Pause" if not self.music_player.is_paused else "Resume"
pause_button_text = self.font.render(pause_text, True, (0, 0, 0))
pygame.draw.rect(self.screen, (200, 200, 200), pygame.Rect(20, 100, 80, 30))
self.screen.blit(pause_button_text, (38, 108))
# 绘制音量调节条
volume_text = self.font.render("Volume: " + str(round(self.music_player.volume * 100)) + "%", True, (0, 0, 0))
self.screen.blit(volume_text, (20, 150))
pygame.draw.rect(self.screen, (200, 200, 200), pygame.Rect(20, 180, 200, 10))
pygame.draw.rect(self.screen, (0, 0, 0), pygame.Rect(20, 180, int(200 * self.music_player.volume), 10))
# 绘制下一首按钮
next_button_text = self.font.render("Next", True, (0, 0, 0))
pygame.draw.rect(self.screen, (200, 200, 200), pygame.Rect(20, 210, 80, 30))
self.screen.blit(next_button_text, (38, 218))
# 绘制搜索音乐输入框和按钮
pygame.draw.rect(self.screen, (200, 200, 200), pygame.Rect(20, 260, 200, 30))
search_text = self.font.render(self.music_player.search_str, True, (0, 0, 0))
self.screen.blit(search_text, (26, 266))
search_button_text = self.font.render("Search", True, (0, 0, 0))
pygame.draw.rect(self.screen, (200, 200, 200), pygame.Rect(230, 260, 80, 30))
self.screen.blit(search_button_text, (248, 268))
# 显示更新后的画面
pygame.display.flip()
def run(self):
"""
运行主循环
"""
while True:
# 处理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONUP:
# 暂停/恢复按钮点击事件
if pygame.Rect(20, 100, 80, 30).collidepoint(event.pos):
self.music_player.pause_music()
# 下一首按钮点击事件
elif pygame.Rect(20, 210, 80, 30).collidepoint(event.pos):
self.music_player.next_music()
# 搜索音乐按钮点击事件
elif pygame.Rect(230, 260, 80, 30).collidepoint(event.pos):
self.music_player.search_music(self.music_player.search_str)
elif event.type == pygame.KEYDOWN:
# 监听搜索音乐输入框
if event.unicode.isalpha() or event.unicode.isdigit() or event.unicode == " ":
self.music_player.search_str += event.unicode
elif event.key == pygame.K_BACKSPACE:
self.music_player.search_str = self.music_player.search_str[:-1]
elif event.key == pygame.K_RETURN:
if self.music_player.search_str:
success = self.music_player.search_music(self.music_player.search_str)
if not success:
error_text = self.font.render("No matching music found!", True, (255, 0, 0))
self.screen.blit(error_text, (20, 300))
pygame.display.flip()
pygame.time.wait(1000)
self.music_player.search_str = ""
elif event.type == pygame.MOUSEBUTTONDOWN:
# 监听音量调节条
if pygame.Rect(20, 180, 200, 10).collidepoint(event.pos):
click_pos = event.pos[0] - 20
self.music_player.set_volume(click_pos / 200)
# 绘制窗口
self.draw()
# 创建音乐播放器窗口实例
window = MusicPlayerWindow(640, 480, "Music Player", "Alimusic")
# 运行窗口主循环
window.run()