开发环境:
windows10
python 3.6
thinter(显示界面)
pygame(播放音乐)
#-*- coding: utf-8 -*- import os import tkinter import tkinter.filedialog import time import threading import pygame root = tkinter.Tk() root.title('音乐播放器v1.0') #窗口大小及位置 root.geometry('460x600+500+100') root.resizable(False, False) folder = '' res = [] num = 0 now_music = '' #添加文件函数 def buttonChooseClick(): # 选择要播放的音乐文件夹 global folder global res if not folder: folder = tkinter.filedialog.askdirectory() musics = [folder + '\\' + music for music in os.listdir(folder) \ \ if music.endswith(('.mp3', '.wav', '.ogg'))] #res = musics #print(res) ret = [] for i in musics: ret.append(i.split('\\')[1:]) res.append(i.replace('\\','/')) var2 = tkinter.StringVar() var2.set(ret) lb = tkinter.Listbox(root, listvariable=var2) lb.place(x=50, y=100, width=260, height=300) if not folder: return global playing playing = True # 根据情况禁用和启用相应的按钮 buttonPlay['state'] = 'normal' buttonStop['state'] = 'normal' #buttonPause['state'] = 'normal' pause_resume.set('播放') #播放音乐函数 def play(): # 初始化混音器设备 if len(res): pygame.mixer.init() global num while playing: if not pygame.mixer.music.get_busy(): # 随机播放一首歌曲 nextMusic = res[num] print(nextMusic) print(num) pygame.mixer.music.load(nextMusic.encode()) # 播放一次 pygame.mixer.music.play(1) #print(len(res)-1) if len(res)-1 == num: num = 0 else: num = num + 1 nextMusic = nextMusic.split('\\')[1:] musicName.set('playing....' + ''.join(nextMusic)) else: time.sleep(0.1) #点击播放 def buttonPlayClick(): buttonNext['state'] = 'normal' buttonPrev['state'] = 'normal' # 选择要播放的音乐文件夹 if pause_resume.get() == '播放': pause_resume.set('暂停') global folder if not folder: folder = tkinter.filedialog.askdirectory() if not folder: return global playing playing = True # 创建一个线程来播放音乐,当前主线程用来接收用户操作 t = threading.Thread(target=play) t.start() elif pause_resume.get() == '暂停': #pygame.mixer.init() pygame.mixer.music.pause() pause_resume.set('继续') elif pause_resume.get() == '继续': #pygame.mixer.init() pygame.mixer.music.unpause() pause_resume.set('暂停') #停止播放 def buttonStopClick(): global playing playing = False pygame.mixer.music.stop() #下一首 def buttonNextClick(): global playing playing = False pygame.mixer.music.stop() # # pygame.mixer.quit() global num # num += 1 # num -= 1 if len(res) == num: num = 0 # elif num < 0: # num = 0 #buttonPlayClick() # global playing # playing = True # 创建一个线程来播放音乐,当前主线程用来接收用户操作 t = threading.Thread(target=play) t.start() #关闭窗口 def closeWindow(): # 修改变量,结束线程中的循环 global playing playing = False time.sleep(0.3) try: # 停止播放,如果已停止, # 再次停止时会抛出异常,所以放在异常处理结构中 pygame.mixer.music.stop() pygame.mixer.quit() except: pass root.destroy() #声音控制 def control_voice(value=0.5): # 设置背景音乐的音量。取值从0.0到1.0。在新的音乐加载前设置,音乐加载时生效。 #注意; 音乐加载时生效 pygame.mixer.music.set_volume(float(value)) #上一首 def buttonPrevClick(): global playing playing = False pygame.mixer.music.stop() # # pygame.mixer.quit() global num # num += 1 # num -= 1 if num == 0: num = len(res)-2 #num -= 1 elif num == len(res) -1: num -=2 else: num -=2 #num -= 1 print(num) playing = True # 创建一个线程来播放音乐,当前主线程用来接收用户操作 t = threading.Thread(target=play) t.start() root.protocol('WM_DELETE_WINDOW', closeWindow) buttonChoose = tkinter.Button(root,text='添加',command=buttonChooseClick) buttonChoose.place(x=50, y=10, width=50, height=20) #buttonChoose['state'] = 'disabled' #播放按钮 # now_music = res #print(res) pause_resume = tkinter.StringVar(root, value='播放') buttonPlay = tkinter.Button(root,textvariable=pause_resume,command=buttonPlayClick) buttonPlay.place(x=190, y=10, width=50, height=20) buttonPlay['state'] = 'disabled' #停止播放 buttonStop = tkinter.Button(root,text='停止',command=buttonStopClick) buttonStop.place(x=120, y=10, width=50, height=20) buttonStop['state'] = 'disabled' #下一首 buttonNext = tkinter.Button(root,text='下一首',command=buttonNextClick) buttonNext.place(x=260, y=10, width=50, height=20) buttonNext['state'] = 'disabled' #上一首 buttonPrev = tkinter.Button(root,text='上一首',command=buttonPrevClick) buttonPrev.place(x=330, y=10, width=50, height=20) buttonPrev['state'] = 'disabled' musicName = tkinter.StringVar(root,value='暂时没有播放音乐...') labelName = tkinter.Label(root,textvariable=musicName) labelName.place(x=10, y=30, width=260, height=20) # HORIZONTAL表示为水平放置,默认为竖直,竖直为vertical s = tkinter.Scale(root, label='音量', from_=0, to=1, orient=tkinter.HORIZONTAL, length=240, showvalue=0, tickinterval=2, resolution=0.1, command=control_voice) s.place(x=50, y=50 ,width=200) # 启动消息循环 root.mainloop()
效果图如下: