Python基于wx实现音乐播放完整攻略
前言
本文将介绍如何使用Python和wxPython库实现音乐播放器。在这个项目中,我们将探讨如何使用wxPython库来创建GUI,并使用Pygame库来实现音乐播放功能。 我们将实现一个非常基本的音乐播放器,其中包括播放、停止、暂停等基本功能。
准备工作
在开始项目之前,需要安装以下库:
- wxPython:
pip install wxpython
- pygame:
pip install pygame
步骤1: 创建GUI
首先,我们需要创建一个GUI界面,用于显示音乐播放器的外观。如下是一个简单的MusicPlayer类,它将定义所有的GUI元素,包括播放/停止/暂停按钮和音乐播放列表。
import wx
class MusicPlayer(wx.Frame):
def __init__(self, parent, title):
super(MusicPlayer, self).__init__(parent, title=title, size=(350, 300))
# 创建菜单栏和菜单项
menubar = wx.MenuBar()
fileMenu = wx.Menu()
openFile = fileMenu.Append(wx.ID_ANY, '打开', '打开音乐文件')
menubar.Append(fileMenu, '&文件')
self.SetMenuBar(menubar)
# 创建GUI元素
self.playBtn = wx.Button(self, wx.ID_ANY, '播放')
self.stopBtn = wx.Button(self, wx.ID_ANY, '停止')
self.pauseBtn = wx.Button(self, wx.ID_ANY, '暂停')
self.fileList = wx.ListBox(self, wx.ID_ANY)
# 创建窗口布局
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(self.playBtn, 1, wx.LEFT, 10)
hbox1.Add(self.stopBtn, 1, wx.LEFT, 10)
hbox1.Add(self.pauseBtn, 1, wx.LEFT, 10)
hbox2.Add(self.fileList, 1, wx.EXPAND | wx.TOP | wx.BOTTOM, 10)
vbox.Add(hbox1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 10)
vbox.Add(hbox2, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
self.SetSizer(vbox)
self.Centre()
self.Show()
在MusicPlayer类的构造函数中,我们创建了一个菜单栏和菜单项,并定义了所有的GUI元素。我们使用wxPython的BoxSizer来创建一个窗口布局,并将所有GUI元素添加到布局中。 最后,我们将布局设置为窗口的Sizer,并将窗口对象显示。
步骤2: 实现音乐播放器的逻辑
接下来,我们需要实现音乐播放器的行为。我们想让播放器能够播放、停止和暂停音乐。我们将使用Pygame库作为我们的音乐播放器,因为它是一个功能强大、易于使用的库。
import pygame
class MusicPlayer(wx.Frame):
def __init__(self, parent, title):
super(MusicPlayer, self).__init__(parent, title=title, size=(350, 300))
self.InitUI()
# 初始化Pygame
pygame.init()
# 获取当前可播放的音频格式
self.musicFormats = pygame.mixer.get_init()[1]
# 设置播放状态和音乐文件
self.playing = False
self.currentMusic = None
# 绑定事件
self.Bind(wx.EVT_BUTTON, self.onPlay, self.playBtn)
self.Bind(wx.EVT_BUTTON, self.onStop, self.stopBtn)
self.Bind(wx.EVT_BUTTON, self.onPause, self.pauseBtn)
self.Bind(wx.EVT_MENU, self.onOpen, openFile)
def onPlay(self, event):
# 检查是否有可播放的音乐文件
if self.fileList.GetSelection() == -1:
return
# 获取当前选择的音乐文件
music = self.fileList.GetString(self.fileList.GetSelection())
# 检查是否已经在播放音乐
if self.playing:
# 如果正在播放,则暂停播放
pygame.mixer.music.pause()
self.playing = False
self.playBtn.SetLabel('继续')
elif not self.currentMusic or self.currentMusic != music:
# 如果没有播放音乐或者播放的音乐和当前选择不同,则开始播放音乐
pygame.mixer.music.load(music)
pygame.mixer.music.play()
self.playing = True
self.currentMusic = music
self.playBtn.SetLabel('暂停')
else:
# 如果正在暂停,则继续播放
pygame.mixer.music.unpause()
self.playing = True
self.playBtn.SetLabel('暂停')
def onStop(self, event):
if self.playing:
pygame.mixer.music.stop()
self.playing = False
self.playBtn.SetLabel('播放')
def onPause(self, event):
if self.playing:
pygame.mixer.music.pause()
self.playing = False
self.playBtn.SetLabel('继续')
# 打开音乐文件
def onOpen(self, event):
wildcard = "音乐文件 (*.mp3,*.wav)|*.mp3;*.wav"
dialog = wx.FileDialog(None, "选择音乐文件", wildcard=wildcard, style=wx.FD_OPEN)
if dialog.ShowModal() == wx.ID_OK:
self.fileList.Append(dialog.GetPath())
dialog.Destroy()
在MusicPlayer类的构造函数中,我们初始化了Pygame,并获取了当前可播放的音频格式。我们还定义了播放状态和当前播放的音乐文件。我们绑定了三个按钮的事件,一个用于播放,一个用于停止,一个用于暂停,此外还绑定了一个打开音乐文件的事件。
在onPlay函数中,我们检查了是否存在正确的音乐文件。然后,我们检查播放器是否正在播放音乐。如果是,则暂停播放。如果不是,则启动播放器并开始播放。最后,如果轮到下一首歌曲,我们暂停当前的歌曲并开始播放新的歌曲,并更新当前歌曲的状态。
在onStop函数中,我们停止当前的播放,如果播放是活跃的状态,那么进行播放。
在onPause函数中,我们暂时停止当前的播放,如果播放没有处于停止状态,那么进行暂定。
最后,在onOpen函数中,我们打开文件对话框,并将选择的音乐文件添加到列表框中。我们使用GetPath
方法来获取所选文件的路径,并将其添加到播放列表中。
示例1:使用play方法播放音乐
我们可以使用Pygame的play
方法来播放音乐。示例代码如下:
import pygame
pygame.init()
pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play()
在上面的代码中,我们加载了名为“music.mp3”的音乐文件,并使用play
方法来播放它。如果你想停止或暂停播放,可以使用stop
和pause
方法。
示例2:使用ListCtrl显示播放列表
我们还可以使用wxPython的ListCtrl
来显示播放列表。下面是一个简单的MusicPlayer类,其中包括ListCtrl控件来显示播放列表。
import wx
class MusicPlayer(wx.Frame):
def __init__(self, parent, title):
super(MusicPlayer, self).__init__(parent, title=title, size=(350, 300))
self.InitUI()
# 初始化Pygame
pygame.init()
# 获取当前可播放的音频格式
self.musicFormats = pygame.mixer.get_init()[1]
# 设置播放状态和音乐文件
self.playing = False
self.currentMusic = None
# 绑定事件
self.Bind(wx.EVT_BUTTON, self.onPlay, self.playBtn)
self.Bind(wx.EVT_BUTTON, self.onStop, self.stopBtn)
self.Bind(wx.EVT_BUTTON, self.onPause, self.pauseBtn)
self.Bind(wx.EVT_MENU, self.onOpen, openFile)
def InitUI(self):
# 创建菜单栏和菜单项
menubar = wx.MenuBar()
fileMenu = wx.Menu()
openFile = fileMenu.Append(wx.ID_ANY, '打开', '打开音乐文件')
menubar.Append(fileMenu, '&文件')
self.SetMenuBar(menubar)
# 创建GUI元素
self.playBtn = wx.Button(self, wx.ID_ANY, '播放')
self.stopBtn = wx.Button(self, wx.ID_ANY, '停止')
self.pauseBtn = wx.Button(self, wx.ID_ANY, '暂停')
self.fileList = wx.ListCtrl(self, wx.ID_ANY, style=wx.LC_REPORT | wx.SUNKEN_BORDER)
self.fileList.InsertColumn(0, '文件名称', width=200)
# 创建窗口布局
vbox = wx.BoxSizer(wx.VERTICAL)
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
hbox2 = wx.BoxSizer(wx.HORIZONTAL)
hbox1.Add(self.playBtn, 1, wx.LEFT, 10)
hbox1.Add(self.stopBtn, 1, wx.LEFT, 10)
hbox1.Add(self.pauseBtn, 1, wx.LEFT, 10)
hbox2.Add(self.fileList, 1, wx.EXPAND | wx.TOP | wx.BOTTOM, 10)
vbox.Add(hbox1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 10)
vbox.Add(hbox2, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10)
self.SetSizer(vbox)
self.Centre()
self.Show()
def onPlay(self, event):
...
def onStop(self, event):
...
def onPause(self, event):
...
# 打开音乐文件
def onOpen(self, event):
...
在InitUI函数中,我们用wxPython的ListCtrl控件替换了ListBox控件,并插入了文件名子列。在onOpen函数中,我们使用InsertItem
和SetItem
方法来添加新行到列表中。
def onOpen(self, event):
wildcard = "音乐文件 (*.mp3,*.wav)|*.mp3;*.wav"
dialog = wx.FileDialog(None, "选择音乐文件", wildcard=wildcard, style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE)
if dialog.ShowModal() == wx.ID_OK:
paths = dialog.GetPaths()
for path in paths:
filename = os.path.basename(path)
pos = self.fileList.InsertItem(self.fileList.GetItemCount(), filename)
self.fileList.SetItem(pos, 1, path)
dialog.Destroy()
在onOpen函数中,我们添加了一个选项来允许选择多个文件,并在for循环中将每个文件名添加到ListCtrl中。
结束语
这就是使用Python和wxPython库实现基本的音乐播放器的完整攻略。我们使用了wxPython库来创建GUI,并使用Pygame库来实现音乐播放器。这个例子只是一个基本的音乐播放器,你可以按照自己的需要进行扩展和修改。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 基于wx实现音乐播放 - Python技术站