基于Python/Tkinter的wav格式音乐播放器
好久没写文章了,最近因为工作繁忙的缘故,将博文发表的进度落下来了,今天周末便从之前的写的小项目中搜寻了个WAV格式的音乐播放器(本来想将德州扑克的代码贴出来,但德州扑克的算法有些问题,汗&^…^^),这是很早之前,为了了解PY写的音乐播放器,代码本身并没有多少难度,使用pyaudio这个模块播放WAV格式文件,并且加了频谱显示(wav模块可以读取频率数据是当时查阅模块资料才知道的)以及歌词的动态显示,废话不多说,直接上代码!
注:该程序只是为了练手,因此只完成了基本的功能,所以有很多不足之处,还请各位读者多多包涵!
基于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格式音乐播放器相关推荐
- 基于python网络爬虫的个性化音乐播放器
前言 当前很多人在闲暇时喜欢听音乐,那么基于这种现象,我也是肝了几个小时完成了基于python的个性化音乐播放器,现在分享给你们. 开发组件 python3.5 以上版本就行 tkinter (pyt ...
- python基于yolov3实现的手势控制音乐播放器
python基于yolov3实现的手势控制音乐播放器 效果演示 总体框架 手势识别模块 音乐播放器模块 一个小总结吧 效果演示 话不多说,先上最后的成品展示. python基于yolov3实现的手势控 ...
- 基于Arduino Uno开发板制作音乐播放器
基于Arduino Uno开发板制作音乐播放器 本文将基于Arduino开发板实现一个音乐播放器. 利用Arduino Uno读取sd卡模块中内存卡的音乐,传输信号到扬声器进行播放. 一.项目软硬件简 ...
- 一个基于Android开发的简单的音乐播放器
一个基于Android开发的简单的音乐播放器 记得当时老师让我们写因为播放器时,脑子一头雾水,网上杂七杂八的资料也很少有用,因此索性就自己写一篇,希望对有缘人有用. 因为有好多人问我要源码,所以附上g ...
- 基于MSP430G2553官方开发板的音乐播放器
基于MSP430G2553官方开发板的音乐播放器 实现目标 硬件资源 芯片资源使用情况 外接硬件 程序实现 开发环境配置 各部分硬件驱动 主循环功能实现 实现目标 实现以蜂鸣器为播放设备,能够对简谱乐 ...
- 基于Qt的仿酷狗音乐播放器设计(二)
简述 在上一文"基于Qt的仿酷狗音乐播放器设计(一)"中,博主给出了仿酷狗界面的部分内容,在本文中将继续分析酷狗界面,并作出相应的分析. 下面我们来看一下酷狗界面中的左侧滑动页控制 ...
- 自己动手,打造一款适合 Python 程序员的 Html5 音乐播放器
近期断断续续读了一些 Web Audio API 和 WebRTC API 的文档,发现了很多好玩的东西,有一种"忽入桃花源"的感觉.这一款 Html5 音乐播放器,就是基于 We ...
- Python制作一个多功能音乐播放器
文章目录 一.制作播放器的思路 二.制作播放器知识点和所需模块 三.播放器的代码展示 一.制作播放器的思路 制作一个多功能音乐播放器的思路 确定播放器的需求和功能,例如支持哪些音频格式.播放列表管理. ...
- 基于Qt的仿酷狗音乐播放器设计(一)
简述 其实在很早以前博主就有想用Qt写一个比较好的音乐播放器的想法,但由于平时上课的压力和以前对设计模式和代码规范做的不太好,一直没有进行.所以在这个寒假准备好好的设计一下.下面先简单的说明一下设计的 ...
最新文章
- html设置 header,http设置header
- Hadoop学习之Hadoop集群的定制配置(二)
- RH413-测试文件的a属性
- CVPR 2022|重新思考对齐Prototype的域自适应:基于Graph Matching的新范式
- 二叉树小球下落问题c语言,#C++初学记录(树和二叉树)
- js生成随机密码,密码位数自定
- zedboard实现流水灯
- 整理数组去重与数组排序等方法
- 软件是计算机程序的总和 主要分为,2014年造价师考试安装工程专业讲义:计算机控制...
- 网络TCP/IP基础(IP地址网络汇总与规划)
- orcale :SQL语句小测试select * from emp order by hiredate asc;
- javascript基础常识问答(三)
- K8s - 札记 - 脑裂
- 力扣 167. 两数之和 II - 输入有序数组
- 国开本科计算机应用基础操作题,新版国家开放大学中央电大本科计算机应用基础操作题题库...
- 从业4-证券投资基金的监管
- 2022谷歌浏览器插件FOFA Pro View失效更新方法
- 微服务网关之一 介绍
- cas:174899-82-2|1-乙基-3-甲基咪唑双(三氟甲磺酰)亚胺|EMIMTFSI
- JDK8使用G1 垃圾回收器能解决大问题吗?
热门文章
- t460p加固态硬盘 thinkpad_电脑小白的Thinkpad T460P升级之路
- JavaScript中的toString()方法
- 飞思卡尔S12XE系列---基础GPIO操作
- GJB 5000B简介
- 使用java解析当前ip地址等信息
- Python-----有关判断语句练习题以及题目解析(2)
- pytorch版本问题RuntimeError: params/unet.pth is a zip archive (did you mean to use torch.jit.load()?)
- 概率——联合概率,边缘概率,条件概率
- vc6sp6官方下载地址
- Ubuntu终端常用的快捷键