python實(shí)現(xiàn)媒體播放器功能
本文實(shí)例為大家分享了python實(shí)現(xiàn)媒體播放器功能的具體代碼,供大家參考,具體內(nèi)容如下
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"打開(kāi)文件");
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"打開(kāi)播放列表");
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"前一個(gè)");
self.preBtn.Disable()
self.btnGroupSizer.Add(self.preBtn);
self.btnGroupSizer.Add((5,5),0)
self.nextBtn = self.createButton("./pic/next.png",self.nextMp3,u"下一個(gè)");
self.nextBtn.Disable()
self.btnGroupSizer.Add(self.nextBtn);
self.btnGroupSizer.Add((5,5),0)
self.openBtn = self.createButton("./pic/media.png",self._openFile,u"打開(kāi)文件");
#self.openBtn.Disable()
self.btnGroupSizer.Add(self.openBtn);
self.btnGroupSizer.Add((5,5),0)
self.listBtn = self.createButton("./pic/list.png",self.openList,u"打開(kāi)列表");
#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"打開(kāi)文件",'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"編號(hào)")
self.listct.SetColumnWidth(0,38)
self.listct.InsertColumn(1,u"名字")
self.listct.SetColumnWidth(1,235)
self.listct.InsertColumn(2,u"時(shí)間");
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"打開(kāi)文件目錄")
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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)音樂(lè)播放器 python實(shí)現(xiàn)花框音樂(lè)盒子
- python3 寫一個(gè)WAV音頻文件播放器的代碼
- Python實(shí)現(xiàn)的視頻播放器功能完整示例
- python使用Tkinter實(shí)現(xiàn)在線音樂(lè)播放器
- python實(shí)現(xiàn)簡(jiǎn)易云音樂(lè)播放器
- Python實(shí)現(xiàn)在線音樂(lè)播放器
- python開(kāi)發(fā)簡(jiǎn)易版在線音樂(lè)播放器
- Python應(yīng)用03 使用PyQT制作視頻播放器實(shí)例
- python3音樂(lè)播放器簡(jiǎn)單實(shí)現(xiàn)代碼
- python實(shí)現(xiàn)可下載音樂(lè)的音樂(lè)播放器
相關(guān)文章
python 實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)到txt和pdf文檔及亂碼問(wèn)題的解決
這篇文章主要介紹了python 實(shí)現(xiàn)存儲(chǔ)數(shù)據(jù)到txt和pdf文檔及亂碼問(wèn)題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解
這篇文章主要介紹了Python實(shí)現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解,zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象,這樣做的好處是節(jié)約了不少的內(nèi)存,需要的朋友可以參考下2023-08-08
Python3.5面向?qū)ο笈c繼承圖文實(shí)例詳解
這篇文章主要介紹了Python3.5面向?qū)ο笈c繼承,結(jié)合圖文與實(shí)例形式詳細(xì)分析了Python3.5面向?qū)ο笈c繼承的相關(guān)概念、原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-04-04
pytorch如何對(duì)image和label同時(shí)進(jìn)行隨機(jī)翻轉(zhuǎn)
這篇文章主要介紹了pytorch如何對(duì)image和label同時(shí)進(jìn)行隨機(jī)翻轉(zhuǎn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Matplotlib實(shí)戰(zhàn)之堆疊面積圖繪制詳解
堆疊面積圖和面積圖都是用于展示數(shù)據(jù)隨時(shí)間變化趨勢(shì)的統(tǒng)計(jì)圖表,但它們的特點(diǎn)有所不同,堆疊面積圖既能看到各數(shù)據(jù)系列的走勢(shì),又能看到整體的規(guī)模,下面我們就來(lái)看看如何繪制堆疊面積圖吧2023-08-08
Python scrapy增量爬取實(shí)例及實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python scrapy增量爬取實(shí)例及實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
pandas中iloc函數(shù)的具體實(shí)現(xiàn)
iloc是Pandas中用于基于整數(shù)位置進(jìn)行索引和切片的方法,本文主要介紹了pandas中iloc函數(shù)的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
pytorch模型保存到本地后,如何實(shí)現(xiàn)繼續(xù)訓(xùn)練
在PyTorch中,保存和加載模型對(duì)于實(shí)現(xiàn)模型訓(xùn)練的中斷和恢復(fù)非常有用,保存模型主要有兩種方式:一是保存整個(gè)模型包括結(jié)構(gòu)與參數(shù);二是僅保存模型的state_dict,加載模型時(shí),若保存了整個(gè)模型則直接加載,若僅保存了state_dict,則需先實(shí)例化模型結(jié)構(gòu)后加載2024-09-09
Python安裝后測(cè)試連接MySQL數(shù)據(jù)庫(kù)方式
這篇文章主要介紹了Python安裝后測(cè)試連接MySQL數(shù)據(jù)庫(kù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

