python实现媒体播放器功能
本文实例为大家分享了python实现媒体播放器功能的具体代码,供大家参考,具体内容如下
playMP3.py
#-*-coding:utf-8-*- importwx; importwx.media; importos; importSPrint; importmediaStateBar; importmediaList; importSaveLog; importMediaItem; woldcart="mediafiles|*.*|avi|*.avi|rmvb|*.rmvb|rm|*.rm|wma|*.wma|mp3|*.mp3"; classMediaFrame(wx.Frame): def__init__(self): wx.Frame.__init__(self,None,wx.NewId(),u"媒体播放器",pos=wx.DefaultPosition,size=(500,500)); self.media=''; try: self.media=wx.media.MediaCtrl(self,style=wx.SIMPLE_BORDER, #szBackend=wx.media.MEDIABACKEND_DIRECTSHOW #szBackend=wx.media.MEDIABACKEND_QUICKTIME #szBackend=wx.media.MEDIABACKEND_WMP10 ); self.media.Bind(wx.media.EVT_MEDIA_LOADED,self.mediaLoaded); self.media.Bind(wx.media.EVT_MEDIA_STATECHANGED,self.mediaStateChange) exceptNotImplementedError: self.Destroy() raise; self.listView=''; self.item=MediaItem.MediaItem(); self.sb=mediaStateBar.MediaStateBar(self); self.SetStatusBar(self.sb); self.log=SaveLog.SaveLog(); #self.log.test(); self.menu=wx.Menu() self.openMenu=self.menu.Append(wx.NewId(),u"打开文件"); self.Bind(wx.EVT_MENU,self._openFile,self.openMenu); self.quitMenu=self.menu.Append(wx.NewId(),u"退出"); self.Bind(wx.EVT_MENU,self.quit,self.quitMenu); self.viewMenu=wx.Menu(); self.listMenu=self.viewMenu.Append(wx.NewId(),u"打开播放列表"); self.Bind(wx.EVT_MENU,self.openList,self.listMenu); self.loadListMenu=self.viewMenu.Append(wx.NewId(),u"加载播放列表"); self.Bind(wx.EVT_MENU,self.loadMediaList,self.loadListMenu); self.saveListMenu=self.viewMenu.Append(wx.NewId(),u"保存播放列表") self.Bind(wx.EVT_MENU,self.saveMediaList,self.saveListMenu); menuBar=wx.MenuBar(); menuBar.Append(self.menu,u"文件") menuBar.Append(self.viewMenu,u"播放列表") self.SetMenuBar(menuBar); self.slider=wx.Slider(self,wx.NewId(),0,0,100); self.Bind(wx.EVT_SLIDER,self.onSeek,self.slider); self.btnGroupSizer=wx.BoxSizer(wx.HORIZONTAL); self.btnGroupSizer.Add((5,5),0) self.playBtn=self.createButton("./pic/play.png",self.playMp3,u"播放"); self.playBtn.Disable() self.btnGroupSizer.Add(self.playBtn); self.btnGroupSizer.Add((5,5),0) self.pauseBtn=self.createButton("./pic/pause.png",self.pauseMp3,u"暂停"); self.pauseBtn.Disable() self.btnGroupSizer.Add(self.pauseBtn); self.btnGroupSizer.Add((5,5),0) self.stopBtn=self.createButton("./pic/stop.png",self.stopMp3,u"停止"); self.stopBtn.Disable() self.btnGroupSizer.Add(self.stopBtn); self.btnGroupSizer.Add((5,5),0) self.preBtn=self.createButton("./pic/pre.png",self.preMp3,u"前一个"); self.preBtn.Disable() self.btnGroupSizer.Add(self.preBtn); self.btnGroupSizer.Add((5,5),0) self.nextBtn=self.createButton("./pic/next.png",self.nextMp3,u"下一个"); self.nextBtn.Disable() self.btnGroupSizer.Add(self.nextBtn); self.btnGroupSizer.Add((5,5),0) self.openBtn=self.createButton("./pic/media.png",self._openFile,u"打开文件"); #self.openBtn.Disable() self.btnGroupSizer.Add(self.openBtn); self.btnGroupSizer.Add((5,5),0) self.listBtn=self.createButton("./pic/list.png",self.openList,u"打开列表"); #self.listBtn.Disable() self.btnGroupSizer.Add(self.listBtn) self.btnGroupSizer.Add((5,5),0) self.volSlider=wx.Slider(self,wx.NewId(),0,0,100); self.Bind(wx.EVT_SLIDER,self.volumeSeek,self.volSlider); self.btnGroupSizer.Add(self.volSlider) self.btnGroupSizer.Add((5,5),0) self.volTxt=wx.StaticText(self,wx.NewId(),"") self.btnGroupSizer.Add(self.volTxt) self.btnGroupSizer.Add((5,5),0) mainSizer=wx.BoxSizer(wx.VERTICAL); mainSizer.Add(self.media,1,wx.EXPAND|wx.ALL,5); #mainSizer.Add((5,5),0) mainSizer.Add(self.slider,0,wx.EXPAND|wx.ALL,5); #mainSizer.Add((2,2),0) mainSizer.Add(self.btnGroupSizer,0,wx.EXPAND|wx.ALL,5); #mainSizer.Add((2,2),0) self.SetSizer(mainSizer); self.Layout(); self.timer=wx.Timer(self) self.Bind(wx.EVT_TIMER,self.onTimer); self.timer.Start(200); defcreateButton(self,img,clickFun,tip=""): bmp=wx.Bitmap(img,wx.BITMAP_TYPE_PNG); btn=wx.BitmapButton(self,wx.NewId(),bmp); iftip!='':btn.SetToolTipString(tip); btn.Bind(wx.EVT_BUTTON,clickFun); returnbtn; defquit(self,event): self.Destroy(); defplayMp3(self,e): ifself.item!='': self.media.Play() #self.media.SetInitialSize() defpauseMp3(self,e=''): self.media.Pause() defstopMp3(self,e=''): self.media.Stop() defpreMp3(self,e): ifself.item!='': self.item=self.log.getPreItem(self.item.index) ifself.item!='': self.playMedia(self.item.url,self.item.fileName); defnextMp3(self,e): ifself.item!='': self.item=self.log.getNextItem(self.item.index) ifself.item!='': self.playMedia(self.item.url,self.item.fileName); defonSeek(self,event): self.media.Seek(self.slider.GetValue()) defcallAfterPlayMedia(self,url): #self.media.SetInitialSize(); self.media.Play(); defplayMedia(self,url,filename): #printSPrint.encodeFromSystem(u"播放文件:"),SPrint.encodeFromSystem(url); ifself.media.Load(url)!=True: return; self.item=MediaItem.MediaItem(); self.item.fileName=filename; self.item.url=url; self.SetTitle(filename) self.SetStatusText(filename,1) #wx.FutureCall(2000,self.callAfterPlayMedia,url); def_openFile(self,event): dialog=wx.FileDialog(self,u"打开文件",'F://movie//',"",woldcart,style=wx.OPEN|wx.CHANGE_DIR) ifdialog.ShowModal()==wx.ID_OK: self.playMedia(dialog.GetPath(),dialog.GetFilename()) dialog.Destroy(); defcellRemove(self,url,all=False): ifall==True: self.stopMp3() self.item=''; return; ifself.item.url==url: self.stopMp3(); self.item=''; defvolumeSeek(self,evt): #printfloat(self.volSlider.GetValue()/100); self.media.SetVolume(self.volSlider.GetValue()/100.0) self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%') defmediaLoaded(self,e): print"medialoaded!" self.media.Play(); self.slider.SetRange(0,self.media.Length()); self.item.length=self.getAccurateTime(self.media.Length()/1000); ifself.log.addItem(self.item): ifself.listView!='': self.listView.reflash(self.log); ifself.log.haveNextItem(self.item.index): self.nextBtn.Enable(); else: self.nextBtn.Disable() ifself.log.havePreItem(self.item.index): self.preBtn.Enable() else: self.preBtn.Disable(); self.volSlider.SetValue(self.media.GetVolume()*100); self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%') defmediaStateChange(self,evt): ifself.media.GetState()==wx.media.MEDIASTATE_PAUSED: self.playBtn.Enable() self.pauseBtn.Disable() self.stopBtn.Enable(); self.SetStatusText(u"暂停") elifself.media.GetState()==wx.media.MEDIASTATE_PLAYING: self.playBtn.Disable() self.pauseBtn.Enable() self.stopBtn.Enable(); self.SetStatusText(u"播放") elifself.media.GetState()==wx.media.MEDIASTATE_STOPPED: self.playBtn.Enable() self.pauseBtn.Enable() self.stopBtn.Disable(); self.SetStatusText(u"停止") defonTimer(self,evt): self.slider.SetValue(self.media.Tell()); self.SetStatusText(self.creatTimeStatusTEXT(),1) defcreatTimeStatusTEXT(self): current=self.getAccurateTime(self.media.Tell()/1000); total=self.getAccurateTime(self.media.Length()/1000); return''+current+'/'+total; defopenList(self,evt): ifself.listView=='': self.listView=mediaList.MediaListView(self,self.log); self.listView.CenterOnParent(wx.BOTH); self.listView.Show(); self.listView.Bind(wx.EVT_CLOSE,self.closeOpenList); else: self.closeOpenList(evt); defcloseOpenList(self,evt): self.listView.Destroy(); self.listView=''; defloadMediaList(self,evt): woldcart1="txt|*.txt"; dialog=wx.FileDialog(self,u"加载播放列表",'C:',"",woldcart1,style=wx.OPEN|wx.CHANGE_DIR) ifdialog.ShowModal()==wx.ID_OK: self._loadMediaList(dialog.GetPath()) dialog.Destroy(); def_loadMediaList(self,url): f=file(url) lines=f.readlines() forlineinlines: ifline: self.log.loadLog(line); defsaveMediaList(self,evt): woldcart1="txt|*.txt"; dialog=wx.FileDialog(self,u"保存播放列表",'C:',"",woldcart1,style=wx.SAVE|wx.CHANGE_DIR) ifdialog.ShowModal()==wx.ID_OK: self._saveMediaList(dialog.GetPath()) dialog.Destroy(); def_saveMediaList(self,url): f=file(url,"w+") f.writelines(self.log.createLog()); f.close(); self.showMessage(u"保存成功!"); defshowMessage(self,str): dlg=wx.MessageDialog(self,str,u"消息",wx.OK|wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() defgetAccurateTime(self,s): h=0 m=0 ifs/60!=0: m=s/60 s=s%60 ifm/60!=0: h=m/60 m=m%60 returnstr(h)+':'+str(m)+':'+str(s) if__name__=="__main__": app=wx.PySimpleApp() frame=MediaFrame(); bmp=wx.Icon("./pic/media.png",wx.BITMAP_TYPE_PNG) frame.SetIcon(bmp) frame.Show(); app.MainLoop();
mediaList.py
#-*-coding:utf-8-*- importwx; importsys; importos; importSaveLog; importsubprocess; classMediaListView(wx.MiniFrame): def__init__(self,parent,log): wx.MiniFrame.__init__(self,parent,wx.NewId(),u"文件列表",style=wx.DEFAULT_FRAME_STYLE); self.SetAutoLayout(True) self.mediaMain=parent; self.menu=''; self.selectIndex=-1 self.listDataLog=SaveLog.SaveLog(); self.listDataLog=log; self.listct=wx.ListCtrl(self,wx.NewId(),style=wx.LC_REPORT| wx.LC_VRULES| wx.LC_SORT_ASCENDING); self.listct.InsertColumn(0,u"编号") self.listct.SetColumnWidth(0,38) self.listct.InsertColumn(1,u"名字") self.listct.SetColumnWidth(1,235) self.listct.InsertColumn(2,u"时间"); self.listct.SetColumnWidth(2,105) frSizer=wx.BoxSizer(wx.VERTICAL) frSizer.Add(self.listct,1,wx.EXPAND|wx.ALL,5) self.listct.Bind(wx.EVT_CONTEXT_MENU,self.onRightClick) self.listct.Bind(wx.EVT_LEFT_DCLICK,self.doubleClick) self.listct.Bind(wx.EVT_LIST_ITEM_SELECTED,self.itemSelected) self.SetSizer(frSizer) self.Layout(); wx.CallAfter(self.reflash,self.listDataLog) defreflash(self,log=''): self.listct.DeleteAllItems(); iflog!='': self.listDataLog=log; i=0; ls=log.getList(); foritinls: ifit: index=self.listct.InsertStringItem(i,str(it.index)); self.listct.SetStringItem(index,0,str(it.index)) self.listct.SetStringItem(index,1,it.fileName) self.listct.SetStringItem(index,2,it.length) i=i+1; defonRightClick(self,evt): self.menu=wx.Menu(); self.playMenu=self.menu.Append(wx.NewId(),u"播放") self.Bind(wx.EVT_MENU,self.cellPlay,self.playMenu) self.delMenu=self.menu.Append(wx.NewId(),u"删除") self.Bind(wx.EVT_MENU,self.cellRomve,self.delMenu); self.dirMenu=self.menu.Append(wx.NewId(),u"打开文件目录") self.Bind(wx.EVT_MENU,self.openDir,self.dirMenu); self.delAllMenu=self.menu.Append(wx.NewId(),u"清除播放列表") self.Bind(wx.EVT_MENU,self.clearAll,self.delAllMenu); self.PopupMenu(self.menu); self.menu.Destroy(); defcellPlay(self,evt): self.selectIndex=self.listct.GetFirstSelected(); item=self.listDataLog.getItemByIndex(self.selectIndex); self.mediaMain.playMedia(item.url,item.fileName); defcellRomve(self,evt): #self.selectIndex=self.listct.GetFirstSelected(); url=self.listDataLog.delItemByIndex(self.listct.GetFirstSelected()); self.listDataLog.reflashDataByIndex(); self.reflash(self.listDataLog); self.mediaMain.cellRemove(url) defdoubleClick(self,evt): item=self.listDataLog.getItemByIndex(self.selectIndex); self.mediaMain.playMedia(item.url,item.fileName); evt.Skip(); defitemSelected(self,evt): self.selectIndex=evt.GetIndex(); evt.Skip(); defopenDir(self,evt): self.selectIndex=self.listct.GetFirstSelected(); item=self.listDataLog.getItemByIndex(self.selectIndex); subprocess.Popen("explorer"+os.path.split(item.url)[0]); defclearAll(self,evt): self.listDataLog.clearAll(); self.reflash(self.listDataLog); self.mediaMain.cellRemove('',True)
SaveLog.py
importMediaItem; classSaveLog(): list=[]; defaddItem(self,it=MediaItem.MediaItem): ifself.getItemByURL(it.url)=='': it.index=len(self.list)+1; self.list.append(it); returnTrue; returnFalse; defclearAll(self): self.list=[]; defgetItemByURL(self,url): foritinself.list: ifitandit.url==url: returnit; return''; defgetItemByIndex(self,ind): returnself.list[ind]; defdelItemByIndex(self,ind): it=self.getItemByIndex(ind); ifit: url=it.url; self.list.remove(it); returnurl; return''; defreflashDataByIndex(self): i=1; foritinself.list: ifit: it.index=i; i=i+1; defhavePreItem(self,ind): ifind-1>0: returnTrue; returnFalse; defhaveNextItem(self,ind): ifind0: ind=ind-1; returnself.list[ind]; return''; defgetNextItem(self,ind): ifind 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。