實戰項目 —python實現本地音樂播放器

實戰項目 —python實現本地音樂播放器

4 人贊了文章

隨著網路的發展,我們已經很少將音樂下載到本地,而是直接在線聽歌,方便而又直接。也許你用的音樂播放器是這個

也許是這個

這都不是重點,今天我們要用python自己打造一款音樂播放器。

具體思路

使用python製作一個本地的音樂播放器,通過tkinter庫編寫音樂播放器的界面,使用eyeD3庫來處理MP3文件,獲取歌曲的時長。打開本地音頻文件添加到歌曲列表,然後有播放、停止和暫停功能,還可以選擇上一曲和下一曲,可以通過滑塊進行音量控制。

模塊準備

安裝tkinter模塊

安裝eyeD3模塊

注意:在安裝eyeD3時,可用pip進行安裝,如果在import時出現報錯ImportError: failed to find libmagic. Check your installation。解決辦法是安裝python_magic_bin,python_magic_bin可在網站pypi.org/project/python上下載whl文件,然後直接pip安裝即可。

完整代碼如下

from tkinter import *from traceback import *from win32com.client import Dispatchimport time,eyed3,threadingname = []def openfile(index = [1]): global total,name filenames = filedialog.askopenfilenames(title = "音樂播放器",filetypes =[("mp3文件","*.mp3"),("WMA文件","*.wma"),("WAV文件","*.wav")]) if filenames: for i in range(len(filenames)): media = wmp.newMedia(filenames[i]) wmp.currentPlaylist.appendItem(media) print(filenames[i]) coco = eyed3.load(filenames[i])#eyed3模塊讀取mp3信息 total = int(coco.info.time_secs) minute = int(coco.info.time_secs)//60 sec = int(coco.info.time_secs)%60 length = int(coco.info.time_secs) name = filenames[i].split("/") i =index[-1] list_name.insert(END,str(i)+"."+name[-1]) list_name.insert(END," "*6) if sec >=10: list_name.insert(END,"0%d:%d" %(minute,sec)+ "
") else: list_name.insert(END,"0%s:0%d" %(minute,sec)+ "
") i = i +1 index.append(i)def play(event = None): #root.title("%s" % name[-1]),使用wmp.currentMedia.name更好,在per函數中 per_thread = threading.Thread(target = per) per_thread.daemnon = True wmp.controls.play() per_thread.start() #print(wmp.currentMedia.duration)#放到暫停那裡居然可以用,而這裡不行def per(): global total while wmp.playState !=1: progress_scal.set(int(wmp.controls.currentPosition)) progress_scal.config(label = wmp.controls.currentPositionString) progress_scal.config(to = total,tickinterval = 50) time.sleep(1) root.title("%s" % wmp.currentMedia.name)def stop(): wmp.controls.stop()def pause(event = None): wmp.controls.pause()def uselist(): passdef fullscr(): passdef exitit(): root.destroy()def Previous_it(): wmp.controls.previous()def Next_it(): wmp.controls.next()def Volume_ctr(none): wmp.settings.Volume = vio_scale.get()def Volume_add(i=[0]): wmp.settings.Volume =wmp.settings.Volume+5 i.append(wmp.settings.Volume) vio_scale.set(wmp.settings.Volume)def Volume_minus(i=[0]): wmp.settings.Volume = wmp.settings.Volume -5 i.append(wmp.settings.Volume) vio_scale.set(wmp.settings.Volume)def Scale_ctr(none): wmp.controls.currentPosition = var_scale.get() print(wmp.currentMedia.duration)def Clear_list(): wmp.currentPlaylist.clear() list_name.delete(1.0,END) name = [] index = []def List_random(): wmp.settings.setMode("shuffle",True) play()def List_loop(): wmp.settings.setMode("loop",True) play()root =Tk()root.title(本地音樂播放器)wmp = Dispatch("WMPlayer.OCX")canvas = Canvas(root,width =150,height = 100,bg = "white")img = PhotoImage(file = 111.gif)canvas.create_image((80,50),image = img)canvas.place(x=0,y=0)canvas.coords(img,100,50)canvas.grid(row =0,column = 0,sticky = "nw",rowspan =2)progress_lab = LabelFrame(root,text = "播放進度")progress_lab.grid(row =2,column =0,sticky = "we",rowspan = 2)var_scale = DoubleVar()progress_scal = Scale(progress_lab,orient = HORIZONTAL,showvalue = 0,length =180,variable = var_scale)progress_scal.bind("<Button-1>",pause)progress_scal.bind("")progress_scal.bind("<ButtonRelease-1>",play)progress_scal.grid(row =3,column =0)modee_lab = LabelFrame(root,text = "播放模式")modee_lab.grid(row =4,column =0,rowspan =2,sticky = "ws")var_mode = IntVar()randomradio = Radiobutton(modee_lab,variable = var_mode,value = 1,text ="隨機播放",command =List_random )randomradio.grid(row =4,column =2)inturnradio = Radiobutton(modee_lab,variable = var_mode,value =2,text= "順序播放",command = play)inturnradio.grid(row=4,column =3)alloop = Radiobutton(modee_lab,variable = var_mode,value =2,text = "全部循環播放",command = List_loop)alloop.grid(row =5,column = 2)sinloop = Radiobutton(modee_lab,variable = var_mode,value =3,text = "單曲循環播放")sinloop.grid(row =5,column =3)previous_play = Button(modee_lab,text = "上一曲",command = Previous_it)previous_play.grid(row =6,column =2,rowspan =2,pady =10)next_play = Button(modee_lab,text = "下一曲",command = Next_it)next_play.grid(row =6,column =3,rowspan =2,pady =10)var_volume = IntVar()vioce_lab = LabelFrame(root,text = "音量控制")vioce_lab.grid(row =8,column =0,sticky = "wes")vio_scale = Scale(vioce_lab,orient = HORIZONTAL,length =170,variable = var_volume,command =Volume_ctr)vio_scale.set(30)vio_scale.grid(row =8,column =0)vio_plus = Button(vioce_lab,width =8,text = "增加音量+",command =Volume_add)vio_plus.grid(row =9,column =0,sticky = "w")vio_minus = Button(vioce_lab,width =8,text ="減少音量-",command = Volume_minus)vio_minus.grid(row =9,column =0,sticky ="e")ctr_lab = LabelFrame(root,text = "播放控制",height =130)ctr_lab.grid(row =0,column =1,rowspan =12,sticky = "ns")btn_open = Button(ctr_lab,text ="打開音樂文件",width =10,command = openfile)btn_open.grid(row=0,column =1)btn_play = Button(ctr_lab,text ="播放",width =10,command = play)btn_play.grid(row =1,column =1,pady =5)btn_stop = Button(ctr_lab,text ="停止",width =10,command = stop)btn_stop.grid(row =2,column =1,pady =5)btn_pause = Button(ctr_lab,text ="暫停",width =10,command = pause)btn_pause.grid(row =3,column =1,pady =5)btn_playlist = Button(ctr_lab,text ="新建播放列表",width =10,command = uselist)btn_playlist.grid(row =4,column =1,pady =5)listimport = Button(ctr_lab,width =10,text = "導入列表")listimport.grid(row =6,column =1,sticky ="nw",pady =5)listexport = Button(ctr_lab,width =10,text = "導出列表")listexport.grid(row =7,column =1,sticky = "nw",pady =5)listdel_all = Button(ctr_lab,width =10,text = "清空列表",command = Clear_list)listdel_all.grid(row =8,column =1,sticky ="nw",pady =5)listdel_sel= Button(ctr_lab,width =10,text = "刪除歌曲")listdel_sel.grid(row =12,column =1,sticky = "nw",pady =5)savelist_btn = Button(ctr_lab,text = "保存為列表")savelist_btn.grid(row=9,column =1)min_btn = Button(ctr_lab,text = "最小化窗口",command = root.iconify)min_btn.grid(row =13,column =1)##time_lab= Label(root,width =20,height =2,text ="現在時間為:")##time_lab.grid(row =12,column =0,sticky = "nw",pady =5)time_text= Text(root,width =30,height =3,foreground ="green")time_text.grid(row =10,column =0,sticky = "nw",pady =5)list_name = Text(root,height =18,width =50)list_name.grid(row =0,column =2,sticky = "n",rowspan =6)root.mainloop()

代碼參考jb51.net/article/86641.

效果

歡迎大家關注公眾號《Python練手項目實戰》,了解更多python學習小項目。一起交流進步,多練熟能生巧。

▼在實戰中成長,在實戰中進步▼

weixin.qq.com/r/hkUxKQH (二維碼自動識別)


推薦閱讀:

【籌備通報】 @中國 Python 開發者大會 2018
pandas基本操作
加一行代碼,讓你的Python的運算速度加快100倍
面向機器學習的特徵工程 七、非線性特徵提取和模型堆疊

TAG:Python | 音樂 | tkinter |