好久没写文章了,最近因为工作繁忙的缘故,将博文发表的进度落下来了,今天周末便从之前的写的小项目中搜寻了个WAV格式的音乐播放器(本来想将德州扑克的代码贴出来,但德州扑克的算法有些问题,汗&^…^^),这是很早之前,为了了解PY写的音乐播放器,代码本身并没有多少难度,使用pyaudio这个模块播放WAV格式文件,并且加了频谱显示(wav模块可以读取频率数据是当时查阅模块资料才知道的)以及歌词的动态显示,废话不多说,直接上代码!

注:该程序只是为了练手,因此只完成了基本的功能,所以有很多不足之处,还请各位读者多多包涵!

主界面

播放界面1

播放界面2

频率设置界面

歌词设置页面

基于PythonTkinter的wav格式音乐播放器代码如下

# -*- coding: utf-8 -*-import pyaudio
import datetime
import wave
import pylab as pl
import numpy as np
from Tkinter import *
import Pmw
import thread
import sys
import os
import time
import tkFileDialog

1.主类文件

class wav_pol():def __init__(self):self.root=Tk()self.root.maxsize(868,430)self.root.minsize(868,430)self.root.geometry('868x430+300+100')self.root.title("wav格式音乐播放器")self.var=StringVar()self.var_up=StringVar()self.var_down=StringVar()self.song_shuzu=[]self.file_time=Noneself.file_shuzu=Noneself.col_ping_col='blue'self.pinlv_shezhi=32self.time_so=0self.time_song_tag=None

2.选项框操作

    def add_thread(self):#调用选项框try:thread.start_new_thread(self.add_song(),())except:passdef add_song(self):#增加歌曲song_path=tkFileDialog.askopenfilename(initialdir='C:\Users\nan\Desktop\py\wav_',defaultextension = '.wav',filetypes =[('all files', '.*'),('wav files', '.wav')])song_name=os.path.basename(song_path)if song_name[-4:]=='.wav' or song_name[-4:]=='.WAV':self.song_shuzu.append((song_name,song_path))self.list_.insert(END,song_name)if self.var_songname==None:self.var_songname.set(song_name)thread.exit()def list_command(self,event):#将歌曲文件读取到播放列表数组里self.var_songname.set(self.list_.get(self.list_.curselection()[0]))

3.关于界面选项

    def help_command(self):#---------------------------关于界面------------------------def close_():self.help_toplevel.destroy()self.help_toplevel=Toplevel()self.help_toplevel.geometry('500x250+400+150')self.help_toplevel.maxsize(500,250)self.help_toplevel.minsize(500,250)self.help_toplevel.title('关于')title_surface=Label(self.help_toplevel,text="wav格式音乐播放器",font=('Verdana bold',12))title_surface.pack(side=TOP,pady=5)banben_surface=Label(self.help_toplevel,text="wav格式音乐播放器 V1.0",font=('Verdana bold',10))banben_surface.pack(side=TOP)text_guanyu="该软件是基于wav格式(无损音乐格式)的音乐播放器并且带有频谱和同步歌词显示,用户可以根据需要调整频谱的颜色和同步歌词的颜色.    \\注意: \1.该软件仅仅用于学习和交流,严禁用于商业和其他用途. \2.该软件用于私人目的,由该软件带来的损失由使用者承担. \3.该软件解释权由xxx所有. \\谢谢使用!"text_surface=Message(self.help_toplevel,text=text_guanyu,font=('Verdana bold',9),width=340)text_surface.pack(side=TOP,pady=6)self.men=Frame(self.help_toplevel,relief=GROOVE,borderwidth=5)self.men.pack(side=TOP,fill=X,expand=1)but_close=Button(self.help_toplevel,text="关闭",font=('Verdana bold',9),command=close_)but_close.pack(side=TOP,pady=10)

4.歌词设置界面

    def lrcset_command(self):#---------------------------歌词设置界面---------------------------def command_quit():#歌词设置界面退出self.lrcset_toplevel.destroy()def com_listbox(event):#获取字号self.sel_font_size=fontsize_list.get(fontsize_list.curselection()[0])def command_shezhi():#选中歌词颜色,背景颜色的操作col_arr=[('red',1),('yellow',2),('green',3),('blue',4),('black',5),('white',6),('pink',7),('purple',8),('orange',9),('brown',10),('grey',11),('gold',12)]for k in col_arr:if bgcol_var.get()==k[1]:self.message_up.configure(bg=k[0])self.mes_down.configure(bg=k[0])self.message.configure(bg=k[0])self.lrc_song.configure(bg=k[0])for i in col_arr:if nolrc_var.get()==i[1]:self.message_up.configure(fg=i[0],font=('Verdana bold',self.sel_font_size))self.mes_down.configure(fg=i[0],font=('Verdana bold',self.sel_font_size))breakfor j in col_arr:if nowlrc_var.get()==j[1]:self.message.configure(fg=j[0],font=('Verdana bold',self.sel_font_size))breakself.lrcset_toplevel.destroy()self.sel_font_size=10self.lrcset_toplevel=Toplevel()self.lrcset_toplevel.geometry('500x520+400+150')self.lrcset_toplevel.maxsize(500,520)self.lrcset_toplevel.minsize(500,520)self.lrcset_toplevel.title('歌词设置')frame_nolrc_col=Pmw.Group(self.lrcset_toplevel,tag_text="选择非当前歌词颜色")frame_nolrc_col.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)no_color_label=Label(frame_nolrc_col.interior(),text="颜色选择:",font=('Verdana bold',10))no_color_label.pack(side=LEFT,anchor=N )nolrc_color_rad=Frame(frame_nolrc_col.interior())nolrc_color_rad.pack(side=LEFT)nolrc_color_rad00=Frame(nolrc_color_rad)nolrc_color_rad00.pack(side=TOP,anchor='w')nolrc_color_rad11=Frame(nolrc_color_rad)nolrc_color_rad11.pack(side=TOP,anchor='w')nolrc_color_rad22=Frame(nolrc_color_rad)nolrc_color_rad22.pack(side=TOP,anchor='w')nolrc_var=IntVar()for text,value in[('red',1),('yellow',2),('green',3),('blue',4)]:Radiobutton(nolrc_color_rad00,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nolrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,highlightbackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)for text,value in[('black',5),('white',6),('pink',7),('purple',8)]:Radiobutton(nolrc_color_rad11,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nolrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',bd=0,selectcolor='#f0f0f0').pack(side=LEFT,anchor='w',pady=3)for text,value in[('orange',9),('brown',10),('grey',11),('gold',12)]:Radiobutton(nolrc_color_rad22,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nolrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)frame_lrc_col=Pmw.Group(self.lrcset_toplevel,tag_text="选择当前歌词颜色")frame_lrc_col.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)now_color_label=Label(frame_lrc_col.interior(),text="颜色选择:",font=('Verdana bold',10))now_color_label.pack(side=LEFT,anchor=N)nowlrc_color_rad=Frame(frame_lrc_col.interior())nowlrc_color_rad.pack(side=LEFT)nowlrc_color_rad00=Frame(nowlrc_color_rad)nowlrc_color_rad00.pack(side=TOP,anchor='w')nowlrc_color_rad11=Frame(nowlrc_color_rad)nowlrc_color_rad11.pack(side=TOP,anchor='w')nowlrc_color_rad22=Frame(nowlrc_color_rad)nowlrc_color_rad22.pack(side=TOP,anchor='w')nowlrc_var=IntVar()for text,value in[('red',1),('yellow',2),('green',3),('blue',4)]:Radiobutton(nowlrc_color_rad00,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nowlrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,highlightbackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)for text,value in[('black',5),('white',6),('pink',7),('purple',8)]:Radiobutton(nowlrc_color_rad11,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nowlrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',bd=0,selectcolor='#f0f0f0').pack(side=LEFT,anchor='w',pady=3)for text,value in[('orange',9),('brown',10),('grey',11),('gold',12)]:Radiobutton(nowlrc_color_rad22,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=nowlrc_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)frame_lrcbg_col=Pmw.Group(self.lrcset_toplevel,tag_text="选择歌词背景颜色")frame_lrcbg_col.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)bg_color_label=Label(frame_lrcbg_col.interior(),text="颜色选择:",font=('Verdana bold',10))bg_color_label.pack(side=LEFT,anchor=N)bg_color_rad=Frame(frame_lrcbg_col.interior())bg_color_rad.pack(side=LEFT)bg_color_rad00=Frame(bg_color_rad)bg_color_rad00.pack(side=TOP,anchor='w')bg_color_rad11=Frame(bg_color_rad)bg_color_rad11.pack(side=TOP,anchor='w')bg_color_rad22=Frame(bg_color_rad)bg_color_rad22.pack(side=TOP,anchor='w')bgcol_var=IntVar()for text,value in[('red',1),('yellow',2),('green',3),('blue',4)]:Radiobutton(bg_color_rad00,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=bgcol_var,bg=text,font=('Verdana bold',10),indicatoron=0,highlightbackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)for text,value in[('black',5),('white',6),('pink',7),('purple',8)]:Radiobutton(bg_color_rad11,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=bgcol_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',bd=0,selectcolor='#f0f0f0').pack(side=LEFT,anchor='w',pady=3)for text,value in[('orange',9),('brown',10),('grey',11),('gold',12)]:Radiobutton(bg_color_rad22,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=bgcol_var,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)frame_font_size=Pmw.Group(self.lrcset_toplevel,tag_text="选择字体大小")frame_font_size.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)font_size_label=Label(frame_font_size.interior(),text="字体大小:",font=('Verdana bold',10))font_size_label.pack(side=LEFT,anchor=N)frame_list=Frame(frame_font_size.interior())frame_list.pack(side=LEFT)items=['7','8','9','10','11','12','13']fontsize_list=Listbox(frame_list,height=3,width=20,font=('Verdana bold',10),bg='white',selectbackground='blue',selectborderwidth=0)fontsize_list.pack(side=LEFT)fontsize_list.bind('<Double-Button-1>',com_listbox)for i in items:fontsize_list.insert(END,i)scroll2=Scrollbar(frame_list,width=20,jump=1)scroll2.pack(side=LEFT,fill=Y)fontsize_list.configure(yscrollcommand=scroll2.set)scroll2.configure(command= fontsize_list.yview)frm_but=Frame(self.lrcset_toplevel)frm_but.pack(side=TOP,anchor='w')but_sure=Button(frm_but,text="确定",width=10,font=('Verdana bold',10),command=command_shezhi)but_sure.pack(side=LEFT,padx=50,pady=10)but_quit=Button(frm_but,text="退出",width=10,font=('Verdana bold',10),command=command_quit)but_quit.pack(side=RIGHT,padx=100,pady=10)

5.频谱设置界面

    def pingpu_command(self):#-------------------------频谱设置界面--------------------------def command_quit():#关闭频谱设置选项卡self.pingpu_toplevel.destroy()def command_pingpu():#频谱设置操作print(var1.get())print(clo_ping.get())print(clo_bg_ping.get())pinlv_arr=[(32,1),(64,2),(128,3)]for k in pinlv_arr:if var1.get()==k[1]:self.pinlv_shezhi=k[0]breakcol_arr=[('red',1),('yellow',2),('green',3),('blue',4),('black',5),('white',6),('pink',7),('purple',8),('orange',9),('brown',10),('grey',11),('gold',12)]for i in col_arr:if clo_ping.get()==i[1]:self.col_ping_col=i[0]breakfor j in col_arr:if clo_bg_ping.get()==j[1]:self.canvas.configure(bg=j[0])breakself.pingpu_toplevel.destroy()self.pingpu_toplevel=Toplevel()self.pingpu_toplevel.geometry('500x380+400+150')self.pingpu_toplevel.title("频率设置")self.pingpu_toplevel.maxsize(500,380)self.pingpu_toplevel.minsize(500,380)frame_caiyang=Pmw.Group(self.pingpu_toplevel,tag_text="选择采样频率")frame_caiyang.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)self.caiyang_label=Label(frame_caiyang.interior(),text="采样频率:",font=('Verdana bold',10))self.caiyang_label.pack(side=LEFT,anchor=N)selection_caiyang=Frame(frame_caiyang.interior())selection_caiyang.pack(side=LEFT,anchor=N)var1=IntVar()radion_but=Radiobutton(selection_caiyang,text="32bit",value=1,variable=var1,font=('Verdana bold',10))radion_but.pack(side=LEFT,anchor='w')radion_but1=Radiobutton(selection_caiyang,text="64bit",value=2,variable=var1,font=('Verdana bold',10))radion_but1.pack(side=LEFT,anchor='w')radion_but1=Radiobutton(selection_caiyang,text="128bit",value=3,variable=var1,font=('Verdana bold',10))radion_but1.pack(side=LEFT,anchor='w')clo_ping=IntVar()ping_color_sele=Pmw.Group(self.pingpu_toplevel,tag_text="选择频谱颜色")ping_color_sele.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)self.color_label=Label(ping_color_sele.interior(),text="颜色选择:",font=('Verdana bold',10))self.color_label.pack(side=LEFT,anchor=N)ping_color_rad=Frame(ping_color_sele.interior())ping_color_rad.pack(side=LEFT)ping_color_rad00=Frame(ping_color_rad)ping_color_rad00.pack(side=TOP,anchor='w')ping_color_rad11=Frame(ping_color_rad)ping_color_rad11.pack(side=TOP,anchor='w')ping_color_rad22=Frame(ping_color_rad)ping_color_rad22.pack(side=TOP,anchor='w')for text,value in[('red',1),('yellow',2),('green',3),('blue',4)]:Radiobutton(ping_color_rad00,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_ping,bg=text,font=('Verdana bold',10),indicatoron=0,highlightbackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)for text,value in[('black',5),('white',6),('pink',7),('purple',8)]:Radiobutton(ping_color_rad11,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_ping,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',bd=0,selectcolor='#f0f0f0').pack(side=LEFT,anchor='w',pady=3)for text,value in[('orange',9),('brown',10),('grey',11),('gold',12)]:Radiobutton(ping_color_rad22,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_ping,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)#clo_ping.set(7)clo_bg_ping=IntVar()backgrond_color_sele=Pmw.Group(self.pingpu_toplevel,tag_text="选择频谱背景颜色")backgrond_color_sele.pack(side=TOP,anchor='sw',fill=X,padx=6,pady=6)bgcolor_label=Label(backgrond_color_sele.interior(),text="颜色选择:",font=('Verdana bold',10))bgcolor_label.pack(side=LEFT,anchor=N)bgcolor_rad=Frame(backgrond_color_sele.interior())bgcolor_rad.pack(side=LEFT)bgcolor_rad00=Frame(bgcolor_rad)bgcolor_rad00.pack(side=TOP,anchor='w')bgcolor_rad11=Frame(bgcolor_rad)bgcolor_rad11.pack(side=TOP,anchor='w')bgcolor_rad22=Frame(bgcolor_rad)bgcolor_rad22.pack(side=TOP,anchor='w')for text,value in[('red',1),('yellow',2),('green',3),('blue',4)]:Radiobutton(bgcolor_rad,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_bg_ping,bg=text,font=('Verdana bold',10),indicatoron=0,highlightbackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)for text,value in[('black',5),('white',6),('pink',7),('purple',8)]:Radiobutton(bgcolor_rad11,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_bg_ping,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',bd=0,selectcolor='#f0f0f0').pack(side=LEFT,anchor='w',pady=3)for text,value in[('orange',9),('brown',10),('grey',11),('gold',12)]:Radiobutton(bgcolor_rad22,text=text,value=value,width=10,relief=RAISED,borderwidth=1,variable=clo_bg_ping,bg=text,font=('Verdana bold',10),indicatoron=0,activebackground='#f0f0f0',selectcolor='#f0f0f0',bd=0).pack(side=LEFT,anchor='w',pady=3)ping_but=Frame(self.pingpu_toplevel)ping_but.pack(side=TOP,anchor='sw')but_sure=Button(ping_but,text="确定",width=10,font=('Verdana bold',10),command=command_pingpu)but_sure.pack(side=LEFT,padx=50,pady=10)but_quit=Button(ping_but,text="退出",width=10,font=('Verdana bold',10),command=command_quit)but_quit.pack(side=RIGHT,padx=100,pady=10)

6.主界面显示

    def gui_(self):#----------------------主界面显示----------------def close_():   #关闭程序self.root.quit()os._exit(0)def now_time_config():#实时时间信息的显示now = datetime.datetime.now()date=now.strftime('%Y-%m-%d ')time=now.strftime('%H:%M:%S ')self.shijian1=date+timeself.men_riglab.config(text=self.shijian1)self.men_riglab.after(1000,now_time_config)self.menuBar=Pmw.MenuBar(self.root,hull_relief=RAISED,hull_borderwidth=1)self.menuBar.grid(row=0,column=0,columnspan=3,sticky=NSEW)self.menuBar.addmenu('选项',' Option',font=('Verdana bold',10))self.menuBar.addmenuitem('选项','command',label="刷新",font=('Verdana bold',10),activebackground='blue')self.menuBar.addmenuitem('选项','command',label="关闭",font=('Verdana bold',10),activebackground='blue',command=close_)self.menuBar.addmenu('设置',' Option',font=('Verdana bold',10))self.menuBar.addmenuitem('设置','command',label="频谱",font=('Verdana bold',10),activebackground='blue',command=self.pingpu_command)self.menuBar.addmenuitem('设置','command',label="歌词",font=('Verdana bold',10),activebackground='blue',command=self.lrcset_command)self.menuBar.addmenu('帮助',' Option',font=('Verdana bold',10))self.menuBar.addmenuitem('帮助','command',label="关于",font=('Verdana bold',10),activebackground='blue',command=self.help_command)self.fm=Frame(self.root,relief=GROOVE)self.fm.grid(row=1,column=0,columnspan=2)self.fm1=Frame(self.root,relief=GROOVE)self.fm1.grid(row=2,column=0,columnspan=2,sticky=NSEW)self.frm2=Frame(self.root,relief=GROOVE)self.frm2.grid(row=1,column=2,rowspan=2,sticky=NSEW,pady=4)self.men=Frame(self.root,relief=RAISED,borderwidth=1)self.men.grid(row=3,column=0,columnspan=3,sticky=NSEW)self.men_lab=Label(self.men,text='网络连接状态:',font=('Verdana bold',10))self.men_lab.pack(side=LEFT,pady=2,padx=2)self.men_lab=Label(self.men,text='未知',font=('Verdana bold',10))self.men_lab.pack(side=LEFT,pady=2)now = datetime.datetime.now()date=now.strftime('%Y-%m-%d ')time=now.strftime('%H:%M:%S ')now_time_asd=date+timeself.men_riglab=Label(self.men,text='时间',font=('Verdana bold',10))self.men_riglab.pack(side=RIGHT,padx=2,pady=2)now_time_config()list_tag=Label(self.frm2,text="歌曲列表:",font=('Verdana bold',10),width=10)list_tag.pack(side=TOP,anchor='w')frm5_list=Frame(self.frm2,height=20,width=15)frm5_list.pack(side=TOP)self.list_=Listbox(frm5_list,height=15,width=20,font=('Verdana bold',10),bg='white',selectbackground='blue',selectborderwidth=0)self.list_.pack(side=LEFT)self.list_.bind('<Double-Button-1>',self.list_command)scroll1=Scrollbar(frm5_list,width=20,jump=1)scroll1.pack(side=LEFT,fill=Y)self.list_.configure(yscrollcommand=scroll1.set)scroll1.configure(command= self.list_.yview)but_play=Button(self.frm2,text="播放",width=15,font=('Verdana bold',10),command=self.thread_wav)but_play.pack(side=TOP,pady=5)but_add=Button(self.frm2,text="添加文件",width=15,font=('Verdana bold',10),command=self.add_thread)but_add.pack(side=TOP)self.song_infor=Frame(self.fm)self.song_infor.pack(side=TOP,fill=X)self.var_songname=StringVar()self.entry_name=Pmw.EntryField(self.song_infor,labelpos='w',label_text="歌曲名称:",entry_width=15,entry_font=('Verdana bold',10),label_font=('Verdana bold',10),entry_state='readonly',entry_textvariable=self.var_songname)self.entry_name.pack(side=LEFT)self.entry_auther=Pmw.EntryField(self.song_infor,labelpos='w',label_text="歌曲作者:",entry_width=15,entry_font=('Verdana bold',10),label_font=('Verdana bold',10),entry_state='readonly')self.entry_auther.pack(side=LEFT)self.time_song_lab=Label(self.song_infor,text='播放时间:',font=('Verdana bold',10))self.time_song_lab.pack(side=LEFT,padx=2)self.time_song=Label(self.song_infor,text='00:00:00',font=('Verdana bold',10))self.time_song.pack(side=LEFT,pady=2,padx=2)self.canvas=Canvas(self.fm,width=660,height=210,bg="white",relief=GROOVE)self.canvas.pack(side=TOP,fill=BOTH,anchor='w')self.lrc_song=Frame(self.fm1,bg='white',relief=SUNKEN,width=200)self.lrc_song.pack(side=TOP,fill=BOTH,expand=True,anchor='w')self.message_up=Label(self.lrc_song,relief="flat",textvariable=self.var_up,\width=53,height=2,font=('Verdana bold',13),bg='white',wraplength=480)self.message_up.pack(side=TOP,anchor='center',padx=10)self.message=Label(self.lrc_song,relief="flat",font=('Verdana bold',13),\fg='red',textvariable=self.var,bg='white',height=2,width=53,\wraplength=480)self.message.pack(side=TOP,anchor='center')self.var.set('<歌词显示>')self.mes_down=Label(self.lrc_song,relief="flat",textvariable=self.var_down,font=('Verdana bold',13),bg='white',height=2,width=53,wraplength=480)self.mes_down.pack(side=TOP,anchor='center')self.root.mainloop()

7.频谱动态显示

    def play(self,wave_data_can,col_,pinlv):#频谱显示_#注意:#这里需要注意pinlv这参数,因为频谱的采样频率是按照32位,64位,128位来采样,因为采样的数 #据大小是固定的,所以根据采样频率的不同,频谱的长度也是不一样的,32位采样的频谱最长,128 #位的采样频谱最短,由此带来一个问题就是,因为PY关于运行效率处理的不是很好(因为py对于 #CPU资源的使用颗粒比较大),当数据密集型的操作和任务密集型的操作相遇到一块的某些场景时, #就会出现软件卡顿的情况,很不巧,此处就遇到这个问题,当采样频率为32位,软件的播放声音就会 #出现断断续续的情况,并且软件大概率会卡掉,这部分代码已经更改了很多次,但都解决不了这个问 #题(py3.5以上版本应该是优化的,但是没试过),所以最好的办法是cython层面使用线程通信, #cython更贴近底层,运行效率更高,可以绕过 GIL,但是并不知道cython对tcl/tkInter的支持如 #何,也没有查阅到相关资料,不过读者们可以尝试尝试!ii=256for i in xrange(32,1024,pinlv):self.canvas.update()test_zhi=wave_data_can[i]/300if test_zhi>0:test_zhi=-(test_zhi)self.canvas.create_line(ii,200,ii,200+int(test_zhi),\width=15,fill=col_)self.canvas.update()ii+=20else:self.canvas.create_line(ii,200,ii,200-3,\width=15,fill=col_)self.canvas.update()ii+=20

8.音乐启动模块

    def thread_wav(self):#----------------------------启动音乐播放功能函数---------------------file_shuzu=[]lrc_shuzu=[]print(self.song_shuzu)geming1=self.var_songname.get()for i in self.song_shuzu:if i[0]==geming1:play_song_path=i[1]print(play_song_path)print(play_song_path)dirname=os.path.dirname(play_song_path)list_file= os.listdir(dirname)for line in list_file:#加载需要播放文件的所有filepath = os.path.join(dirname,line)if os.path.isdir(filepath):passelif os.path:file_shuzu.append(os.path.normpath(filepath))for files in file_shuzu:#加载歌词文件(从默认的文件夹中)if files[-4:]=='.lrc' or files[-4:]=='.LRC':lrc_shuzu.append(files)for lrc_file in lrc_shuzu:#根据歌词文件读取出歌词文件路径if os.path.splitext(os.path.basename(lrc_file))[0].strip(' ').upper()==\os.path.splitext(geming1)[0].upper():lrc_song_name=lrc_filebreakelse:lrc_song_name=Noneif lrc_song_name==None:tag_lrc=Falseif lrc_song_name!=None:tag_lrc=Truefile_=open(lrc_song_name,'rb')self.file_shuzu=[' ']self.file_time=[('00','00','00')]for eachLine in file_:#将歌词文件的内容读取出来if str(eachLine[1:3]).isdigit()==True and\str(eachLine[4:6]).isdigit()==True and str(eachLine[7:9]).isdigit()==True:self.file_shuzu.append(eachLine[10:].strip('\r\n')  )self.file_time.append((eachLine[1:3],eachLine[4:6],eachLine [7:9]))else:passfile_.close()if play_song_path!=None:self.root.update()s_path=os.path.normpath(play_song_path)self.var_up.set(' ')self.var.set(' ')self.var_down.set(' ')if tag_lrc==False:self.var.set('<无歌词>')self.root.update()col=self.col_ping_colpinlv=self.pinlv_shezhithread.start_new_thread(self.wav_play,(s_path,tag_lrc,col,pinlv))#启动音乐播放

9.WAV文件播放模块

    def wav_play(self,song_path,tag_lrc,col,pinlv):#---------------------------音乐播放----------------------chunk=1024wf = wave.open(song_path, 'rb')p = pyaudio.PyAudio()# 打开声音输出流stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)# 写声音输出流进行播放i=1time_00=time.clock()while True:self.canvas.delete(ALL)#清空频谱data = wf.readframes(chunk)#读取播放1024数据wave_data = np.fromstring(data, dtype=np.short)#将读取的1024数据转化为pyaudio刻意识别的文件格式wave_data.shape = -1, 2#数据格式参数配置wave_data = wave_data.T#读取频谱数据self.play(wave_data[1],col,128)#写入频谱数据if tag_lrc==True:#显示歌词time1=int(self.file_time[0][0])*60+int(self.file_time[0][1])+\float(int(self.file_time[0][2]))/100.0if i<len(self.file_time)-1:time2=int(self.file_time[i][0])*60+int(self.file_time[i][1])+\float(int(self.file_time[i][2]))/100.0cha=int((time2-time1)*10)if cha==int((time.clock()-time_00)*10):try:#歌词写入self.var_up.set(self.file_shuzu[i-1].decode('cp936'))self.var.set(self.file_shuzu[i].decode('cp936'))self.var_down.set(self.file_shuzu[i+1].decode('cp936'))self.root.update()except:#将输出歌词内容格式改为"utf-8"self.var_up.set(self.file_shuzu[i-1].decode('utf-8'))self.var.set(self.file_shuzu[i].decode('utf-8'))self.var_down.set(self.file_shuzu[i+1].decode('utf-8'))self.root.update()i+=1if data == "":self.time_song_tag=Falsebreakstream.write(data)#self.canvas.update()self.time_song.after_cancel()self.time_song.after_idle()self.time_song_tag=Falseself.var_up.set(' ')self.var.set('<完>')self.var_down.set(' ')self.root.update()self.file_shuzu=Noneself.file_time=Nonestream.close()p.terminate()wf.close()thread.exit()

<完>

感谢阅读,欢迎指正!

基于Python/Tkinter的wav格式音乐播放器相关推荐

  1. 基于python网络爬虫的个性化音乐播放器

    前言 当前很多人在闲暇时喜欢听音乐,那么基于这种现象,我也是肝了几个小时完成了基于python的个性化音乐播放器,现在分享给你们. 开发组件 python3.5 以上版本就行 tkinter (pyt ...

  2. python基于yolov3实现的手势控制音乐播放器

    python基于yolov3实现的手势控制音乐播放器 效果演示 总体框架 手势识别模块 音乐播放器模块 一个小总结吧 效果演示 话不多说,先上最后的成品展示. python基于yolov3实现的手势控 ...

  3. 基于Arduino Uno开发板制作音乐播放器

    基于Arduino Uno开发板制作音乐播放器 本文将基于Arduino开发板实现一个音乐播放器. 利用Arduino Uno读取sd卡模块中内存卡的音乐,传输信号到扬声器进行播放. 一.项目软硬件简 ...

  4. 一个基于Android开发的简单的音乐播放器

    一个基于Android开发的简单的音乐播放器 记得当时老师让我们写因为播放器时,脑子一头雾水,网上杂七杂八的资料也很少有用,因此索性就自己写一篇,希望对有缘人有用. 因为有好多人问我要源码,所以附上g ...

  5. 基于MSP430G2553官方开发板的音乐播放器

    基于MSP430G2553官方开发板的音乐播放器 实现目标 硬件资源 芯片资源使用情况 外接硬件 程序实现 开发环境配置 各部分硬件驱动 主循环功能实现 实现目标 实现以蜂鸣器为播放设备,能够对简谱乐 ...

  6. 基于Qt的仿酷狗音乐播放器设计(二)

    简述 在上一文"基于Qt的仿酷狗音乐播放器设计(一)"中,博主给出了仿酷狗界面的部分内容,在本文中将继续分析酷狗界面,并作出相应的分析. 下面我们来看一下酷狗界面中的左侧滑动页控制 ...

  7. 自己动手,打造一款适合 Python 程序员的 Html5 音乐播放器

    近期断断续续读了一些 Web Audio API 和 WebRTC API 的文档,发现了很多好玩的东西,有一种"忽入桃花源"的感觉.这一款 Html5 音乐播放器,就是基于 We ...

  8. Python制作一个多功能音乐播放器

    文章目录 一.制作播放器的思路 二.制作播放器知识点和所需模块 三.播放器的代码展示 一.制作播放器的思路 制作一个多功能音乐播放器的思路 确定播放器的需求和功能,例如支持哪些音频格式.播放列表管理. ...

  9. 基于Qt的仿酷狗音乐播放器设计(一)

    简述 其实在很早以前博主就有想用Qt写一个比较好的音乐播放器的想法,但由于平时上课的压力和以前对设计模式和代码规范做的不太好,一直没有进行.所以在这个寒假准备好好的设计一下.下面先简单的说明一下设计的 ...

最新文章

  1. html设置 header,http设置header
  2. Hadoop学习之Hadoop集群的定制配置(二)
  3. RH413-测试文件的a属性
  4. CVPR 2022|重新思考对齐Prototype的域自适应:基于Graph Matching的新范式
  5. 二叉树小球下落问题c语言,#C++初学记录(树和二叉树)
  6. js生成随机密码,密码位数自定
  7. zedboard实现流水灯
  8. 整理数组去重与数组排序等方法
  9. 软件是计算机程序的总和 主要分为,2014年造价师考试安装工程专业讲义:计算机控制...
  10. 网络TCP/IP基础(IP地址网络汇总与规划)
  11. orcale :SQL语句小测试select * from emp order by hiredate asc;
  12. javascript基础常识问答(三)
  13. K8s - 札记 - 脑裂
  14. 力扣 167. 两数之和 II - 输入有序数组
  15. 国开本科计算机应用基础操作题,新版国家开放大学中央电大本科计算机应用基础操作题题库...
  16. 从业4-证券投资基金的监管
  17. 2022谷歌浏览器插件FOFA Pro View失效更新方法
  18. 微服务网关之一 介绍
  19. cas:174899-82-2|1-乙基-3-甲基咪唑双(三氟甲磺酰)亚胺|EMIMTFSI
  20. JDK8使用G1 垃圾回收器能解决大问题吗?

热门文章

  1. t460p加固态硬盘 thinkpad_电脑小白的Thinkpad T460P升级之路
  2. JavaScript中的toString()方法
  3. 飞思卡尔S12XE系列---基础GPIO操作
  4. GJB 5000B简介
  5. 使用java解析当前ip地址等信息
  6. Python-----有关判断语句练习题以及题目解析(2)
  7. pytorch版本问题RuntimeError: params/unet.pth is a zip archive (did you mean to use torch.jit.load()?)
  8. 概率——联合概率,边缘概率,条件概率
  9. vc6sp6官方下载地址
  10. Ubuntu终端常用的快捷键