python实现媒体播放器功能


Posted in Python onFebruary 11, 2018

本文实例为大家分享了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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Tkinter GUI编程入门介绍
Mar 10 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
python机器学习之神经网络(二)
Dec 20 Python
python批量修改文件编码格式的方法
May 31 Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
python time.strptime格式化实例详解
Feb 03 Python
解决python3安装pandas出错的问题
May 20 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
python使用pycharm环境调用opencv库
Feb 11 #Python
Python元组及文件核心对象类型详解
Feb 11 #Python
详解Python核心对象类型字符串
Feb 11 #Python
python使用json序列化datetime类型实例解析
Feb 11 #Python
Python中pow()和math.pow()函数用法示例
Feb 11 #Python
Python反射的用法实例分析
Feb 11 #Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 #Python
You might like
第十四节--命名空间
2006/11/16 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
python添加模块搜索路径方法
2017/09/11 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
python实现滑雪者小游戏
2020/02/22 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
python3 logging日志封装实例
2020/04/08 Python
python3中编码获取网页的实例方法
2020/11/16 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
临床医学大学生求职信
2013/09/28 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
体育教学随笔感言
2014/02/24 职场文书
小学数学国培感言
2014/03/10 职场文书
一体化教学实施方案
2014/05/10 职场文书
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电
MySql数据库 查询时间序列间隔
2022/05/11 MySQL