经过在图书馆的努力,把之前的音乐播放器用wxpython模块写了下,图如下:
这次加入了一些图片,实现了双击播放功能,完整代码如下:
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import wx
from win32com.client import Dispatch
ID_OPEN = 10
ID_EXIT = 11
ID_VERSION = 20
class Music(wx.Frame):
def img(self):
self.background_image_filename = wx.Bitmap("back.jpg")
self.next_image_filename = 'next.bmp'
self.previous_image_filename = 'previous.bmp'
self.play_image_filename = 'play.bmp'
self.stop_image_filename = 'stop.bmp'
self.pause_image_filename = 'pause.bmp'
self.icon_image_filename = 'icon.bmp'
def __init__(self):
self.img()
frame=wx.Frame.__init__(self,None,-1,"音乐播放器",size=(700,500),style=wx.CAPTION|wx.CLOSE_BOX|wx.CLIP_CHILDREN|wx.MINIMIZE_BOX)#外容器
# 默认样式 DEFAULT_FRAME_STYLE 是下面这些值的复合:
# wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER |
# wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN
# 它包括最小化按钮、最大化按钮、系统菜单、标题栏、关闭按钮、可变大小
self.panel = wx.Panel(self)#内容器
self.icon = wx.Icon(self.icon_image_filename,wx.BITMAP_TYPE_ICO)
self.SetIcon(self.icon)
#--------------------这里设置哪个控件需要设置背景----------------------------
self.panel.Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBack)#在内容器设置背景控件及方法
#----------------------------设置dispatch--------------------------------------------------
self.mm = Dispatch('WMPlayer.OCX')
#绘制菜单
# ---------------------create a status bar ---------------------
self.CreateStatusBar()
# ---------------------create a menu bar -----------------------
menuBar = wx.MenuBar()
# ---------------------create a menu ---------------------------
menuFile = wx.Menu()
menuAbout = wx.Menu()
# ------------- Changed: use our own id instead wx.ID_ANY -----------------
op_file = menuFile.Append(ID_OPEN,'打开')
exit_ = menuFile.Append(ID_EXIT,'关闭')
about = menuAbout.Append(ID_VERSION,'版本')
#----------------------------------------------------
menuBar.Append(menuFile,'文件')
menuBar.Append(menuAbout,'关于')
self.SetMenuBar(menuBar)
#------------menu event--------------------------------
self.Bind(wx.EVT_MENU,self.openFile,op_file)
self.Bind(wx.EVT_MENU,self.exi,exit_)
self.Bind(wx.EVT_MENU,self.lookver,about)
#使用wx.EVT_MENU(self,ID_OPEN,self.openFile)会报警告wxPyDeprecationWarning: Call to deprecated item __call__. Use :meth:`EvtHandler.Bind` instead. wx.EVT_MENU(self,ID_EXIT,self.exi)
#-----------------------------绘制listbox--------------------------------------------------------
self.textFont = wx.Font(10,wx.DEFAULT,wx.NORMAL,wx.NORMAL,False)
self.listDatas = []
self.listbox = wx.ListBox(self.panel,-1,pos=(20,10),size=(350,400),style=wx.LB_SINGLE)
self.listbox.SetFont(self.textFont)
self.Bind(wx.EVT_LISTBOX,self.listSelectFunc,self.listbox)
#----------------------------------------绘previous-----------------------------------------------
self.previous = wx.Image(self.previous_image_filename, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.previous_button = wx.BitmapButton(self.panel, 1, self.previous, style=0,pos = (420, 170),size=(32,32))#-1代表随机一个编号
self.panel.Bind(wx.EVT_BUTTON, self.OnPrevious, self.previous_button)
self.previous_button.SetDefault()
#----------------------------------------绘图play-----------------------------------------------
play = wx.Image(self.play_image_filename, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.play_button = wx.BitmapButton(self.panel, -1, play, style=0,pos = (470, 170),size=(32,32))
self.panel.Bind(wx.EVT_BUTTON, self.OnPlay_Pause, self.play_button)
self.play_button.SetDefault()
#----------------------------------------绘pause-----------------------------------------------
pause = wx.Image(self.pause_image_filename, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.pause_button = wx.BitmapButton(self.panel, -1, pause, style=0,pos = (520, 170),size=(32,32))
self.panel.Bind(wx.EVT_BUTTON, self.OnPause, self.pause_button)
self.pause_button.SetDefault()
#----------------------------------------绘next-----------------------------------------------
next = wx.Image(self.next_image_filename, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.next_button = wx.BitmapButton(self.panel, -1, next, style=0,pos = (570, 170),size=(32,32))
self.panel.Bind(wx.EVT_BUTTON, self.OnNext, self.next_button)
self.next_button.SetDefault()
#----------------------------------------绘stop-----------------------------------------------
stop = wx.Image(self.stop_image_filename, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
self.stop_button = wx.BitmapButton(self.panel, -1, stop, style=0,pos = (620, 170),size=(32,32))
self.panel.Bind(wx.EVT_BUTTON, self.OnStop, self.stop_button)
self.stop_button.SetDefault()
#-----------------------------------绘滑块-------------------------------------------------------------
self.slider = wx.Slider(self.panel,-1,100,0,300,pos=(420,260),size=(250,20),style=wx.SL_HORIZONTAL|wx.SL_VALUE_LABEL|wx.SL_TOP,validator=wx.DefaultValidator,name='slider')
self.slider.SetRange(0,100)
self.slider.SetValue(50)
self.panel.Bind(wx.EVT_SLIDER,self.volume,self.slider)
def OnEraseBack(self,event):
"""
设置背景的方法
"""
dc = event.GetDC()
if not dc:
dc = wx.ClientDC(self)
rect = self.GetUpdateRegion().GetBox()
dc.SetClippingRect(rect)
dc.Clear()
dc.DrawBitmap(self.background_image_filename,0,0)
def openFile(self,event):
"""
打开文件的方法
"""
filiter = "FLAC File(*.flac)|*.flac|MP3 File(*.mp3)|*.mp3|WAV File(*.wav)|*.wav"
dlag = wx.FileDialog(self,u'选择音乐',defaultDir='./',style=wx.DD_DEFAULT_STYLE,wildcard=filiter )
if dlag.ShowModal() == wx.ID_OK:
m = dlag.GetPath() #文件夹路径
if m:
media = self.mm.newMedia(m)
self.mm.currentPlaylist.appendItem(media)
i = m.split('\\')
self.listbox.Append(i[-1])
self.listDatas.append(m)
def exi(self,event):
"""
关闭的方法
:param event:
:return:
"""
exit()
def lookver(self,event):
wx.MessageBox("音乐播放器 version 1. 1","版本")
def listSelectFunc(self,event):
#self.mm.controls.stop()
c = self.listbox.GetSelections()[0]
mc = self.listDatas[c]
#print c,mc
#print self.mm.currentMedia.name
medi = self.mm.currentPlaylist.Item(c)
#print type(medi)
print self.mm.currentPlaylist.count
print self.mm.controls.currentPositionString#播放时间
self.mm.controls.playItem(medi)
def OnPrevious(self,event):
self.mm.controls.previous()
def OnPlay_Pause(self,event):
self.mm.controls.play()
def OnPause(self,event):
self.mm.controls.pause()
def OnNext(self,event):
self.mm.controls.next()
def OnStop(self,event):
self.mm.controls.stop()
def volume(self,event):
self.mm.settings.Volume=self.slider.GetValue()
if __name__ == '__main__':
app = wx.App()
frame = Music()
frame.Show()
app.MainLoop()
1.这里说下win32com.client 里的Dispatch(),为了这个我百度了半下午,终于找到了currentPlaylist的来历,首先需要打开oleview.exe这个文件
我的路径是我重新下载的装的,你们的可能不是。打开后如图,
双击后如图
另外我在这里(https://msdn.microsoft.com/en-us/library/windows/desktop/dd562659(v=vs.85).aspx)也找到了listbox双击切换音乐的方法
**2.**wxpython frame样式
默认样式 DEFAULT_FRAME_STYLE 是下面这些值的复合:
# wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER |
# wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN
# 它包括最小化按钮、最大化按钮、系统菜单、标题栏、关闭按钮、可变大小
相关链接:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd562659(v=vs.85).aspx
https://my.oschina.net/zxcholmes/blog/484789