# -*- coding: utf-8 -*-
# 注意文件编码也必须是utf-8
SCREEN_SIZE=(800,600)
# 存放音乐文件的位置
MUSIC_PATH="./MUSIC"
importpygame
from pygame.localsimport*
frommathimportsqrt
import os
importos.path
defget_music(path):
# 从文件夹来读取所有的音乐文件
raw_filenames=os.listdir(path)
music_files=[]
forfilenameinraw_filenames:
# 不是Windows的话,还是去掉mp3吧
iffilename.lower().endswith('.ogg')orfilename.lower().endswith('.mp3'):
music_files.append(os.path.join(MUSIC_PATH,filename))
returnsorted(music_files)
class Button(object):
"""这个类是一个按钮,具有自我渲染和判断是否被按上的功能"""
def__init__(self,image_filename,position):
self.position=position
self.image=pygame.image.load(image_filename)
defrender(self,surface):
# 家常便饭的代码了
x,y=self.position
w,h=self.image.get_size()
x-=w/2
y-=h/2
surface.blit(self.image,(x,y))
defis_over(self,point):
# 如果point在自身范围内,返回True
point_x,point_y=point
x,y=self.position
w,h=self.image.get_size()
x-=w/2
y-=h/2
in_x=point_x>=xandpoint_x<x+w
in_y=point_y>=yandpoint_y<y+h
returnin_xandin_y
defrun():
pygame.mixer.pre_init(44100,16,2,1024*4)
pygame.init()
screen=pygame.display.set_mode(SCREEN_SIZE,0)
#font = pygame.font.SysFont("default_font", 50, False)
# 为了显示中文,我这里使用了这个字体,具体自己机器上的中文字体请自己查询
# 详见本系列第四部分:http://eyehere.net/2011/python-pygame-novice-professional-4/
font=pygame.font.SysFont("simsunnsimsun",50,False)
x=100
y=240
button_width=150
buttons={}
buttons["prev"]=Button("prev.png",(x,y))
buttons["pause"]=Button("pause.png",(x+button_width*1,y))
buttons["stop"]=Button("stop.png",(x+button_width*2,y))
buttons["play"]=Button("play.png",(x+button_width*3,y))
buttons["next"]=Button("next.png",(x+button_width*4,y))
music_filenames=get_music(MUSIC_PATH)
iflen(music_filenames)==0:
print"No music files found in ",MUSIC_PATH
return
white=(255,255,255)
label_surfaces=[]
# 一系列的文件名render
forfilenameinmusic_filenames:
txt=os.path.split(filename)[-1]
print"Track:",txt
# 这是简体中文Windows下的文件编码,根据自己系统情况请酌情更改
txt=txt.split('.')[0].decode('gb2312')
surface=font.render(txt,True,(100,0,100))
label_surfaces.append(surface)
current_track=0
max_tracks=len(music_filenames)
pygame.mixer.music.load(music_filenames[current_track])
clock=pygame.time.Clock()
playing=False
paused=False
# USEREVENT是什么?请参考本系列第二部分:
# http://eyehere.net/2011/python-pygame-novice-professional-2/
TRACK_END=USEREVENT+1
pygame.mixer.music.set_endevent(TRACK_END)
whileTrue:
button_pressed=None
foreventinpygame.event.get():
ifevent.type==QUIT:
return
ifevent.type==MOUSEBUTTONDOWN:
# 判断哪个按钮被按下
forbutton_name,buttoninbuttons.iteritems():
ifbutton.is_over(event.pos):
printbutton_name,"pressed"
button_pressed=button_name
break
ifevent.type==TRACK_END:
# 如果一曲播放结束,就“模拟”按下"next"
button_pressed="next"
ifbutton_pressedisnotNone:
ifbutton_pressed== "next":
current_track=(current_track+1)%max_tracks
pygame.mixer.music.load(music_filenames[current_track])
ifplaying:
pygame.mixer.music.play()
elifbutton_pressed== "prev":
# prev的处理方法:
# 已经播放超过3秒,从头开始,否则就播放上一曲
ifpygame.mixer.music.get_pos()>3000:
pygame.mixer.music.stop()
pygame.mixer.music.play()
else:
current_track=(current_track-1)%max_tracks
pygame.mixer.music.load(music_filenames[current_track])
ifplaying:
pygame.mixer.music.play()
elifbutton_pressed== "pause":
ifpaused:
pygame.mixer.music.unpause()
paused=False
else:
pygame.mixer.music.pause()
paused=True
elifbutton_pressed== "stop":
pygame.mixer.music.stop()
playing=False
elifbutton_pressed== "play":
ifpaused:
pygame.mixer.music.unpause()
paused=False
else:
ifnotplaying:
pygame.mixer.music.play()
playing=True
screen.fill(white)
# 写一下当前歌名
label=label_surfaces[current_track]
w,h=label.get_size()
screen_w=SCREEN_SIZE[0]
screen.blit(label,((screen_w-w)/2,450))
# 画所有按钮
forbuttoninbuttons.values():
button.render(screen)
# 因为基本是不动的,这里帧率设的很低
clock.tick(5)
pygame.display.update()
if__name__=="__main__":
run()