基于Python实现音乐播放器的实现示例代码

作者:Livingbody 时间:2023-11-26 23:58:50 

一、环境设置

第一步引入必须的各类包

import os
import tkinter
import tkinter.filedialog
import random
import time
import threading
import pygame

特别是pygame需要手动安装

pip install pygame

二、播放功能

首先选择音乐目录,然后创建播放现成,播放音乐。

# 播放按钮
def buttonPlayClick():
   # 选择要播放的音乐文件夹
   global folder
   if not folder:
       folder = tkinter.filedialog.askdirectory()
   if not folder:
       return

global playing
   playing = True
   # 创建一个线程来播放音乐,当前主线程用来接收用户操作
   t = threading.Thread(target=play)
   t.start()

# 根据情况禁用和启用相应的按钮
   buttonPlay['state'] = 'disabled'
   buttonStop['state'] = 'normal'
   buttonPause['state'] = 'normal'
   buttonNext['state'] = 'normal'

pause_resume.set('Pause')

buttonPlay = tkinter.Button(root,
                           text='Play',
                           command=buttonPlayClick)
buttonPlay.place(x=20, y=10, width=50, height=20)

三、停止功能

很直接,直接停止播放,当然更改按钮状态也属常规操作。

def buttonStopClick():
   global playing
   playing = False

pygame.mixer.music.stop()
   musicName.set('暂时没有播放音乐')

buttonPlay['state'] = 'normal'
   buttonStop['state'] = 'disabled'
   buttonPause['state'] = 'disabled'
   buttonNext['state'] = 'disabled'
   global folder
   folder = ''

buttonStop = tkinter.Button(root,
                           text='Stop',
                           command=buttonStopClick)
buttonStop.place(x=80, y=10, width=50, height=20)
buttonStop['state'] = 'disabled'

四、暂停与恢复

这个好理解,也是直接现成操作,加个判断,状态更改。

# 暂停与恢复,两个功能共用一个按钮
def buttonPauseClick():
   # global playing
   if pause_resume.get() == 'Pause':
       pygame.mixer.music.pause()
       pause_resume.set('Resume')
   elif pause_resume.get() == 'Resume':
       pygame.mixer.music.unpause()
       pause_resume.set('Pause')

五、关闭

先结束现成,然后关闭窗体。

# 关闭程序时执行的代码
def closeWindow():
   # 修改变量,结束线程中的循环
   global playing
   playing = False
   time.sleep(0.3)

try:
       # 停止播放,如果已停止,
       # 再次停止时会抛出异常,所以放在异常处理结构中
       pygame.mixer.music.stop()
       pygame.mixer.quit()
   except:
       pass
   root.destroy()

六、完整代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:livingbody
@file:music_play.py
@time:2022/04/19
"""

import os
import tkinter
import tkinter.filedialog
import random
import time
import threading
import pygame

folder = ''

def play():
   # folder用来表示存放MP3音乐文件的文件夹
   global folder

musics = [folder + '\' + music
             for music in os.listdir(folder) \
             if music.endswith(('.mp3', '.wav', '.ogg'))]

# 初始化混音器设备
   pygame.mixer.init()
   while playing:
       if not pygame.mixer.music.get_busy():
           # 随机播放一首歌曲
           nextMusic = random.choice(musics)
           musicName.set('playing....' + nextMusic)
           pygame.mixer.music.load(nextMusic.encode())
           # 播放一次
           pygame.mixer.music.play(1)
       else:
           time.sleep(0.3)

root = tkinter.Tk()
root.title('音乐播放器v1.0')
root.geometry('280x70+400+300')
root.resizable(False, False)

# 关闭程序时执行的代码
def closeWindow():
   # 修改变量,结束线程中的循环
   global playing
   playing = False
   time.sleep(0.3)

try:
       # 停止播放,如果已停止,
       # 再次停止时会抛出异常,所以放在异常处理结构中
       pygame.mixer.music.stop()
       pygame.mixer.quit()
   except:
       pass
   root.destroy()

root.protocol('WM_DELETE_WINDOW', closeWindow)

pause_resume = tkinter.StringVar(root, value='NotSet')
playing = False

# 播放按钮
def buttonPlayClick():
   # 选择要播放的音乐文件夹
   global folder
   if not folder:
       folder = tkinter.filedialog.askdirectory()
   if not folder:
       return

global playing
   playing = True
   # 创建一个线程来播放音乐,当前主线程用来接收用户操作
   t = threading.Thread(target=play)
   t.start()

# 根据情况禁用和启用相应的按钮
   buttonPlay['state'] = 'disabled'
   buttonStop['state'] = 'normal'
   buttonPause['state'] = 'normal'
   buttonNext['state'] = 'normal'

pause_resume.set('Pause')

buttonPlay = tkinter.Button(root,
                           text='Play',
                           command=buttonPlayClick)
buttonPlay.place(x=20, y=10, width=50, height=20)

# 停止按钮
def buttonStopClick():
   global playing
   playing = False

pygame.mixer.music.stop()
   musicName.set('暂时没有播放音乐')

buttonPlay['state'] = 'normal'
   buttonStop['state'] = 'disabled'
   buttonPause['state'] = 'disabled'
   buttonNext['state'] = 'disabled'
   global folder
   folder = ''

buttonStop = tkinter.Button(root,
                           text='Stop',
                           command=buttonStopClick)
buttonStop.place(x=80, y=10, width=50, height=20)
buttonStop['state'] = 'disabled'

# 暂停与恢复,两个功能共用一个按钮
def buttonPauseClick():
   # global playing
   if pause_resume.get() == 'Pause':
       pygame.mixer.music.pause()
       pause_resume.set('Resume')
   elif pause_resume.get() == 'Resume':
       pygame.mixer.music.unpause()
       pause_resume.set('Pause')

buttonPause = tkinter.Button(root,
                            textvariable=pause_resume,
                            command=buttonPauseClick)
buttonPause.place(x=140, y=10, width=50, height=20)
buttonPause['state'] = 'disabled'

# 下一首音乐
def buttonNextClick():
   global playing
   playing = False
   pygame.mixer.music.stop()
   pygame.mixer.quit()
   buttonPlayClick()

buttonNext = tkinter.Button(root,
                           text='Next',
                           command=buttonNextClick)
buttonNext.place(x=200, y=10, width=50, height=20)
buttonNext['state'] = 'disabled'

musicName = tkinter.StringVar(root,
                             value='暂时没有播放音乐...')
labelName = tkinter.Label(root,
                         textvariable=musicName)
labelName.place(x=0, y=40, width=270, height=20)

if __name__ == '__main__':
   # 启动消息循环
   root.mainloop()

七、改进

下一步,可加入播放列表,点选播放音乐,也可以拖动进度播放。

来源:https://juejin.cn/post/7088276815000813605

标签:Python,音乐播放器
0
投稿

猜你喜欢

  • 利用Python内置库实现创建命令行应用程序

    2022-04-26 03:39:19
  • ASP.Net Core MVC基础系列之中间件

    2024-05-09 09:04:47
  • 一个较新的ASP后门服务端实现代码

    2011-02-16 10:41:00
  • 网站开发防止中文乱码需要了解的codepage的重要性小结

    2011-03-03 11:24:00
  • Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题

    2021-05-15 23:31:46
  • pycharm实现print输出保存到txt文件

    2023-05-09 22:14:20
  • 你的like语句为什么没索引详解

    2024-01-13 14:16:18
  • 基于pip install django失败时的解决方法

    2021-06-19 06:01:27
  • Python爬取豆瓣视频信息代码实例

    2021-10-28 06:41:46
  • mysql数据库备份命令分享(mysql压缩数据库备份)

    2024-01-22 10:36:57
  • opencv 傅里叶变换的实现

    2022-03-21 09:59:51
  • 检测python爬虫时是否代理ip伪装成功的方法

    2021-07-31 20:23:44
  • Python常见库matplotlib学习笔记之多个子图绘图

    2023-02-17 19:40:14
  • python输入错误后删除的方法

    2023-07-25 11:55:09
  • Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签

    2022-12-10 13:55:18
  • pytorch学习教程之自定义数据集

    2021-06-09 03:13:16
  • python抓取京东小米8手机配置信息

    2021-10-12 15:55:32
  • JavaScript打开客户端exe文件的代码

    2024-04-17 09:49:27
  • Python使用selenium + headless chrome获取网页内容的方法示例

    2023-05-02 05:27:37
  • 用JavaScript实现PHP的urlencode与urldecode函数

    2023-11-23 08:18:14
  • asp之家 网络编程 m.aspxhome.com