天天看點

python音樂播放器1.1

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

python音樂播放器1.1

這次加入了一些圖檔,實作了輕按兩下播放功能,完整代碼如下:

#!/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這個檔案

python音樂播放器1.1

我的路徑是我重新下載下傳的裝的,你們的可能不是。打開後如圖,

python音樂播放器1.1

輕按兩下後如圖

python音樂播放器1.1

另外我在這裡(https://msdn.microsoft.com/en-us/library/windows/desktop/dd562659(v=vs.85).aspx)也找到了listbox輕按兩下切換音樂的方法

python音樂播放器1.1

**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