經過在圖書館的努力,把之前的音樂播放器用wxpython子產品寫了下,圖如下:

這次加入了一些圖檔,實作了輕按兩下播放功能,完整代碼如下:
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import wx
from win32com.client import Dispatch
ID_OPEN =
ID_EXIT =
ID_VERSION =
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,-,"音樂播放器",size=(,),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(,wx.DEFAULT,wx.NORMAL,wx.NORMAL,False)
self.listDatas = []
self.listbox = wx.ListBox(self.panel,-,pos=(,),size=(,),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, , self.previous, style=,pos = (, ),size=(,))#-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, -, play, style=,pos = (, ),size=(,))
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, -, pause, style=,pos = (, ),size=(,))
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, -, next, style=,pos = (, ),size=(,))
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, -, stop, style=,pos = (, ),size=(,))
self.panel.Bind(wx.EVT_BUTTON, self.OnStop, self.stop_button)
self.stop_button.SetDefault()
#-----------------------------------繪滑塊-------------------------------------------------------------
self.slider = wx.Slider(self.panel,-,,,,pos=(,),size=(,),style=wx.SL_HORIZONTAL|wx.SL_VALUE_LABEL|wx.SL_TOP,validator=wx.DefaultValidator,name='slider')
self.slider.SetRange(,)
self.slider.SetValue()
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,,)
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[-])
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()[]
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