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 3中实现类型检查器的简单方法
Jul 03 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
Python使用gensim计算文档相似性
Apr 10 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
python 获取url中的参数列表实例
Dec 18 Python
python自动化之Ansible的安装教程
Jun 13 Python
浅谈Pytorch中的torch.gather函数的含义
Aug 18 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
python的Jenkins接口调用方式
May 12 Python
Python可视化神器pyecharts绘制水球图
Jul 07 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
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
javascript中onmouse事件在div中失效问题的解决方法
2012/01/09 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
Python itertools模块详解
2015/05/09 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
python yield关键词案例测试
2019/10/15 Python
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
Oracle性能调优原则
2012/05/03 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
如何写毕业求职自荐信
2013/11/06 职场文书
制作部班长职位说明书
2014/02/26 职场文书
同学会主持词
2014/03/18 职场文书
2014年技术部工作总结
2014/12/12 职场文书
云台山导游词
2015/02/03 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书