本文实例为大家分享了python实现媒体播放器功能的具体代码,供大家参考,具体内容如下
playMP3.py
# -*- coding: utf-8 -*- import wx; import wx.media; import os; import SPrint; import mediaStateBar; import mediaList; import SaveLog; import MediaItem; woldcart = "media files|*.*|avi|*.avi|rmvb|*.rmvb|rm|*.rm|wma|*.wma|mp3|*.mp3"; class MediaFrame(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) except NotImplementedError: 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); def createButton(self,img,clickFun,tip=""): bmp = wx.Bitmap(img, wx.BITMAP_TYPE_PNG); btn = wx.BitmapButton(self,wx.NewId(),bmp); if tip != '' : btn.SetToolTipString(tip); btn.Bind(wx.EVT_BUTTON,clickFun); return btn; def quit(self,event): self.Destroy(); def playMp3(self,e): if self.item != '': self.media.Play() # self.media.SetInitialSize() def pauseMp3(self,e=''): self.media.Pause() def stopMp3(self,e=''): self.media.Stop() def preMp3(self,e): if self.item!='': self.item = self.log.getPreItem(self.item.index) if self.item != '': self.playMedia(self.item.url,self.item.fileName); def nextMp3(self,e): if self.item!='': self.item = self.log.getNextItem(self.item.index) if self.item != '': self.playMedia(self.item.url,self.item.fileName); def onSeek(self,event): self.media.Seek(self.slider.GetValue()) def callAfterPlayMedia(self,url): #self.media.SetInitialSize(); self.media.Play(); def playMedia(self,url,filename): #print SPrint.encodeFromSystem( u"播放文件: " ) , SPrint.encodeFromSystem(url) ; if self.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) if dialog.ShowModal() == wx.ID_OK: self.playMedia(dialog.GetPath(),dialog.GetFilename()) dialog.Destroy(); def cellRemove(self,url,all=False): if all == True: self.stopMp3() self.item = ''; return ; if self.item.url == url: self.stopMp3(); self.item = ''; def volumeSeek(self,evt): #print float(self.volSlider.GetValue()/100); self.media.SetVolume(self.volSlider.GetValue()/100.0) self.volTxt.SetLabel(str(self.volSlider.GetValue())+'%') def mediaLoaded(self,e): print "media loaded!" self.media.Play(); self.slider.SetRange(0,self.media.Length()); self.item.length = self.getAccurateTime(self.media.Length()/1000); if self.log.addItem(self.item): if self.listView != '': self.listView.reflash(self.log); if self.log.haveNextItem(self.item.index): self.nextBtn.Enable(); else: self.nextBtn.Disable() if self.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())+'%') def mediaStateChange(self,evt): if self.media.GetState() == wx.media.MEDIASTATE_PAUSED: self.playBtn.Enable() self.pauseBtn.Disable() self.stopBtn.Enable(); self.SetStatusText(u"暂停") elif self.media.GetState() == wx.media.MEDIASTATE_PLAYING: self.playBtn.Disable() self.pauseBtn.Enable() self.stopBtn.Enable(); self.SetStatusText(u"播放") elif self.media.GetState() == wx.media.MEDIASTATE_STOPPED: self.playBtn.Enable() self.pauseBtn.Enable() self.stopBtn.Disable(); self.SetStatusText(u"停止") def onTimer(self,evt): self.slider.SetValue(self.media.Tell()); self.SetStatusText(self.creatTimeStatusTEXT(),1) def creatTimeStatusTEXT(self): current = self.getAccurateTime(self.media.Tell()/1000); total = self.getAccurateTime(self.media.Length()/1000); return ' ' + current + '/' + total; def openList(self,evt): if self.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); def closeOpenList(self,evt): self.listView.Destroy(); self.listView = ''; def loadMediaList(self,evt): woldcart1 = "txt|*.txt"; dialog = wx.FileDialog(self,u"加载播放列表",'C:',"",woldcart1,style=wx.OPEN|wx.CHANGE_DIR) if dialog.ShowModal() == wx.ID_OK: self._loadMediaList(dialog.GetPath()) dialog.Destroy(); def _loadMediaList(self,url): f = file(url) lines = f.readlines() for line in lines: if line: self.log.loadLog(line); def saveMediaList(self,evt): woldcart1 = "txt|*.txt"; dialog = wx.FileDialog(self,u"保存播放列表",'C:',"",woldcart1,style=wx.SAVE|wx.CHANGE_DIR) if dialog.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"保存成功!"); def showMessage(self,str): dlg = wx.MessageDialog(self, str,u"消息", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() def getAccurateTime(self,s): h = 0 m = 0 if s/60 !=0: m = s/60 s = s%60 if m/60 !=0: h = m/60 m = m%60 return str(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 -*- import wx; import sys; import os; import SaveLog; import subprocess; class MediaListView(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) def reflash(self,log=''): self.listct.DeleteAllItems(); if log != '': self.listDataLog = log; i = 0; ls = log.getList(); for it in ls: if it: 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; def onRightClick(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(); def cellPlay(self,evt): self.selectIndex = self.listct.GetFirstSelected(); item = self.listDataLog.getItemByIndex(self.selectIndex); self.mediaMain.playMedia(item.url,item.fileName); def cellRomve(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) def doubleClick(self,evt): item = self.listDataLog.getItemByIndex(self.selectIndex); self.mediaMain.playMedia(item.url,item.fileName); evt.Skip(); def itemSelected(self,evt): self.selectIndex = evt.GetIndex(); evt.Skip(); def openDir(self,evt): self.selectIndex = self.listct.GetFirstSelected(); item = self.listDataLog.getItemByIndex(self.selectIndex); subprocess.Popen("explorer " + os.path.split(item.url)[0]); def clearAll(self,evt): self.listDataLog.clearAll(); self.reflash(self.listDataLog); self.mediaMain.cellRemove('',True)
SaveLog.py
import MediaItem; class SaveLog(): list = []; def addItem(self,it=MediaItem.MediaItem): if self.getItemByURL(it.url) == '' : it.index = len(self.list) + 1; self.list.append(it); return True; return False; def clearAll(self): self.list = []; def getItemByURL(self,url): for it in self.list: if it and it.url == url: return it; return ''; def getItemByIndex(self,ind): return self.list[ind]; def delItemByIndex(self,ind): it = self.getItemByIndex(ind); if it : url = it.url; self.list.remove(it); return url; return ''; def reflashDataByIndex(self): i = 1; for it in self.list: if it: it.index = i; i = i+ 1; def havePreItem(self,ind): if ind-1>0: return True; return False; def haveNextItem(self,ind): if ind < len(self.list)-1: return True; return False; def getPreItem(self,ind): if ind>0: ind = ind -1; return self.list[ind]; return ''; def getNextItem(self,ind): if ind < len(self.list)-1: ind = ind + 1; return self.list[ind]; return ''; def getList(self): return self.list; def createLog(self): out = []; for it in self.list: if it: out.append(it.createLog()) return out; def loadLog(self,s=''): ls = s.split("|"); item = MediaItem.MediaItem(); item.index = ls[0] item.fileName = ls[1] item.url = ls[2] item.length = ls[3]; self.addItem(item); def test(self): item = MediaItem.MediaItem(); item.index = 0; item.fileName = '123' item.length = '123' item.url = '123' self.list.append(item) item2 = MediaItem.MediaItem(); item2.index = 1; item2.fileName = '1234' item2.length = '1234' item2.url = '1234' self.list.append(item2) item3 = MediaItem.MediaItem(); item3.index = 2; item3.fileName = '12345' item3.length = '12345' item3.url = '12345' self.list.append(item3)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]