天天看点

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