Python实现音乐播放器 -----------内附源码

Python做一个简易的音乐播放器
简易音乐播放器

import time
import pygame

file = r'歌曲路径'
pygame.mixer.init()
print('正在播放',file)
track = pygame.mixer.music.load(file)
pygame.mixer.music.play()
time.sleep(130)
pygame.mixer.music.stop()

运行效果:

开始搭建音乐播放器
首先了解项目知识点和所需模块
1.python基础知识
2.requests库
3.time
4.pygame
5.tkinter
6.线程

环境
windows
pycharm 2021.2
python 3.7

先看一下运行效果:

代码讲解:

导入模块

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

一、界面

root = tkinter.Tk()
root.title('音乐播放器')
root.geometry('460x500+500+100')
root.resizable(False,False) # 不能拉伸

# 创建一个 ttk 样式
style = ttk.Style()

# 设置框架的背景颜色
# style.configure("TFrame", background="#98F5F9")

# 设置前景颜色和边框颜色
style.configure("TFrame", background="#98F5F9", foreground="#000000", bordercolor="#000000")


frame = ttk.Frame(root, width=460, height=500)
frame.pack()

# 显示
root.mainloop()

按钮


# 添加按钮
buttonChoose = tkinter.Button(root,text='添加',command=buttonChooseClick,fg="#000000",bg="#EFCDF8")
# 布局
buttonChoose.place(x=50,y=10,width=50,height=20)



# 播放按钮
pause_resume = tkinter.StringVar(root,value='播放')
buttonPlay = tkinter.Button(root,textvariable=pause_resume,command=buttonPlayClick,fg="#000000",bg="#B2F199")
buttonPlay.place(x=120,y=10,width=50,height=20)
buttonPlay['state'] = 'disabled'


# 停止按钮
buttonStop = tkinter.Button(root, text='停止',command=buttonStopClick,fg="#000000",bg="#F8B6B6")
buttonStop.place(x=190, y=10, width=50, height=20)
buttonStop['state'] = 'disabled'

# 下一首
buttonNext = tkinter.Button(root, text='下一首',command=buttonNextClick,fg="#000000",bg="#F6E3C4")
buttonNext.place(x=260, y=10, width=50, height=20)
buttonNext['state'] = 'disabled'
# 上一首
buttonPrev = tkinter.Button(root, text='上一首',command=buttonPrevClick,fg="#000000",bg="#F6E3C4")
buttonPrev.place(x=330, y=10, width=50, height=20)
buttonPrev['state'] = 'disabled'


# 标签
musicName = tkinter.StringVar(root, value='暂时没有播放音乐...')
labelName = tkinter.Label(root, textvariable=musicName)
labelName.place(x=50, y=30, width=330, height=20)

# 音量控制
# HORIZONTAL表示为水平放置,默认为竖直,竖直为vertical
s = tkinter.Scale(root, label='音量', from_=0, to=1, orient=tkinter.HORIZONTAL,
                  length=240, showvalue=0, tickinterval=2, resolution=0.1,command=control_voice)
s.place(x=50, y=50, width=330)

 

二、功能
创建一个文件目录

folder =''
res = []
num = 0
now_music = ''

音乐读取功能

def buttonChooseClick():
    global folder
    global res
    if not folder:
        folder = tkinter.filedialog.askdirectory()
        musics = [folder + '\\' + music
                  for music in os.listdir(folder) \
\
                  if music.endswith(('.mp3','.wav','.ogg'))]
        ret = []
        for i in musics:
            ret.append(i.split('\\')[1:])
            res.append(i.replace('\\','/'))

    if not folder:
        return

    global playing
    playing = True
    # 根据情况禁用和启用相应的按钮
    buttonPlay['state'] = 'normal'
    buttonStop['state'] = 'normal'
    # buttonPause['state'] = 'normal'
    pause_resume.set('播放')

显示已加载的音乐

var2 = tkinter.StringVar()
var2.set(ret)
lb = tkinter.Listbox(root,listvariable=var2)
lb.place(x=50,y=100,width=260,height=300)

播放音乐

def play():
    if len(res):
        pygame.mixer.init()
        global num
        while playing:
            if not pygame.mixer.music.get_busy():
                netxMusic = res[num]
                print(netxMusic)
                print(num)
                pygame.mixer.music.load(netxMusic.encode())
                # 播放
                pygame.mixer.music.play(1)
                if len(res) -1 == num:
                    num = 0
                else:
                    num = num + 1
                netxMusic = netxMusic.split('\\')[1:]
                musicName.set('playing......' + ''.join(netxMusic))
            else:
                time.sleep(0.1)

# 点击播放
def buttonPlayClick():
    buttonNext['state'] = 'normal'

    buttonPrev['state'] = 'normal'
    # 选择要播放的音乐文件夹
    if pause_resume.get() == '播放':
        pause_resume.set('暂停')
        global folder

        if not folder:
            folder = tkinter.filedialog.askdirectory()

        if not folder:
            return

        global playing

        playing = True

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

    elif pause_resume.get() == '暂停':
        # pygame.mixer.init()
        pygame.mixer.music.pause()

        pause_resume.set('继续')

    elif pause_resume.get() == '继续':
        # pygame.mixer.init()
        pygame.mixer.music.unpause()

        pause_resume.set('暂停')

停止播放

def buttonStopClick():
    global playing
    playing = False
    pygame.mixer.music.stop()

下一首

def buttonNextClick():
    global playing
    playing = False
    pygame.mixer.music.stop()
    global num
    if len(res) == num:
        num = 0

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

上一首

def buttonPrevClick():
    global playing
    playing = False
    pygame.mixer.music.stop()
    #
    # pygame.mixer.quit()
    global num
    # num += 1
    # num -= 1
    if num == 0:
        num = len(res) - 2
        # num -= 1
    elif num == len(res) - 1:
        num -= 2
    else:
        num -= 2
        # num -= 1
    print(num)
    playing = True
    # 创建一个线程来播放音乐,当前主线程用来接收用户操作
    t = threading.Thread(target=play)
    t.start()

音量控制

def control_voice(value=0.5):
    pygame.mixer.music.set_volume(float(value))

关闭窗口

def closeWindow():
    # 修改变量,结束线程中的循环
    global playing
    playing = False
    time.sleep(0.3)

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

    except:
        pass
    root.destroy()

完整代码已经上传到CSDN,0积分下载,有需要的朋友自行下载。

音乐播放器源码

感谢大家的阅读,觉得有所帮助的朋友点点关注点点赞!

最近更新

  1. 10月,2024北京养老展,北京老年生活用品展览会

    2024-06-12 00:18:04       0 阅读
  2. python之面向对象编程

    2024-06-12 00:18:04       0 阅读
  3. Python2.7中os.path模块常用函数记录

    2024-06-12 00:18:04       0 阅读

热门阅读

  1. 大模型日报2024-06-11

    2024-06-12 00:18:04       4 阅读
  2. React@16.x(26)useContext

    2024-06-12 00:18:04       4 阅读
  3. 新视野大学英语2 词组 6.11

    2024-06-12 00:18:04       3 阅读
  4. 419.甲板上的战舰

    2024-06-12 00:18:04       3 阅读
  5. 比亚迪算法岗面试,问的贼细

    2024-06-12 00:18:04       2 阅读
  6. Python中的可变参数

    2024-06-12 00:18:04       2 阅读
  7. 问题 B: 2.左右(lr.cpp/pas)

    2024-06-12 00:18:04       2 阅读
  8. Vue小细节

    2024-06-12 00:18:04       5 阅读
  9. VPN简介

    2024-06-12 00:18:04       3 阅读