python实现音乐播放器

python是一个比较活泼的语言,它可以很快速、很方便地实现很多有意思的东西。

最近,学习了一下如何使用python制作一个简单的音乐播放器,整体的效果如下图所示。

参考博客:https://blog.csdn.net/qq_37521566/article/details/112393898?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242

参考博客:https://blog.csdn.net/qq_40851744/article/details/106987255

参考博客:https://blog.csdn.net/du_du1/article/details/91398076

参考博客:https://www.zhihu.com/question/28717146

参考博客:https://zhuanlan.zhihu.com/p/40379098

参考博客:https://blog.csdn.net/zcc1229936385/article/details/103269765

所需要的导入的库

  • tkinter
  • os
  • time
  • threading
  • pygame

如果没有安装这个库,简单粗暴的

pip install + 库

例如,我没有安装过pygame这个库,

 准备工作

下载音乐,喜欢的歌曲,选择mp3格式

这里,给大家提供一个mp3格式下载的网址,如果大家有其他合适的网址也可以的。

http://www.gequdaquan.net/gqss/

源码

import tkinter
import os
from tkinter import *
import tkinter.filedialog
import time
import threading
import pygame
from PIL import Image,ImageTk
 
#新建一个GUI界面
Frame = Tk()
Frame.title("属于自己的音乐播放器")

#设置长和款
width = 600
height = 400

screenwidth = Frame.winfo_screenwidth()
screenheight = Frame.winfo_screenheight()

alignstr = "%dx%d+%d+%d" % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
Frame.geometry(alignstr)

Frame.resizable(False,False)
file = Image.open('./music player/picture/image.jpg')
img = ImageTk.PhotoImage(file)
background = tkinter.Label(Frame, image=img)
background.image = img
background.pack()


#设置一个图标
#Frame.iconbitmap("")
 
#设置全局变量
folder = ""  #文件路径
music_dir = []   #音乐文件路径
music_name = []  #音乐文件名称
num = 0  #当前所播放的音乐序号
playing = False  #音乐是否在播放
flag= 0  #单曲循环 or 顺序播放
skip= 0 #上一首下一首的标记
 
#选择播放音乐所在文件夹
def buttonAddClick():
    
    #global限定全局变量
    global folder
    global music_dir
    global music_name
    global playing
    #选择一个文件夹并其返回路径
    folder = tkinter.filedialog.askdirectory()
    if not folder:
        return 
    music_name.clear()
    music_dir.clear()
    #读取文件夹里的音乐文件
    for each in os.listdir(folder):
        if each.endswith((".mp3",".wav",".ogg")):
               music_name.append(each)
               music_dir.append(folder + "\\" + each)
    if(len(music_dir) == 0):
        return 
    #将文件名列出到GUI上
    var = StringVar()
    var.set(music_name)
    music_list = Listbox(Frame,listvariable=var)
    music_list.place(x=200,y=240,width=260,height=150)
   
    playing = True
    buttonPlay["state"] = "normal"
    start_stop.set("播放")
    buttonAdd["state"]="disabled"
    pygame.mixer.init()
    
#播放音乐函数
def play():
    global num
    global playing
    global flag
    global skip
    if len(music_dir):
        pre=0 #上一首
        while playing:
            if not pygame.mixer.music.get_busy(): #没有音乐播放
                if flag:
                    if not skip:
                        num=pre
                skip = 0
                next_music = music_dir[num]
                pygame.mixer.music.load(next_music.encode())
                pygame.mixer.music.play(1)
                musicName.set("正在播放:"+music_name[num])
                pre = num
                if len(music_dir)-1 == num:
                    num = 0
                else:
                    num = num + 1
            else:
                time.sleep(0.1)
 
#播放暂停切换
def buttonPlayClick():
    buttonNext["state"] = "normal"
    buttonPrev['state'] = 'normal'
    buttonCircle['state'] = 'normal'
    if start_stop.get() == "播放":
        start_stop.set("暂停")
        #新建一个线程来后台播放音乐
        t=threading.Thread(target=play)
        t.start() 
    elif start_stop.get() =="暂停":
       pygame.mixer.music.pause()
       start_stop.set("继续")
    elif start_stop.get() =="继续":
       pygame.mixer.music.unpause()
       start_stop.set("暂停")
       
#回到上一首
def buttonPrevClick():
    global skip
    skip = 1
    pygame.mixer.music.stop()
    global num
    if num == 0:
        num=len(music_dir)-2
    elif num ==1:
        num = len(music_dir)-1
    else:
        num -= 2 
        
#切换下一首
def buttonNextClick():
    global skip
    skip = 1
    pygame.mixer.music.stop()   
 
#播放模式的切换
def buttonCircClick():
    global flag
    if mode_change.get()=="单曲循环":
        flag=1
        mode_change.set("顺序播放")
    else:
        flag=0
        mode_change.set("单曲循环")      
 
#调整音量
def controlVoice(value):
    global playing
    if playing:
        pygame.mixer.music.set_volume(float(value))
        
def closeWindow():
    #playing 变 False,从而结束循环,t线程退出
    global playing
    playing = False
    time.sleep(0.3)
    if len(music_name) > 0:
        pygame.mixer.music.stop() 
        pygame.mixer.quit()   
    Frame.destroy()
 
 
#设置关闭窗口协议    
Frame.protocol("WM_DELETE_WINDOW", closeWindow)
 

#添加音乐按钮            
buttonAdd = Button(Frame,text="添加音乐",command=buttonAddClick)
buttonAdd.place(x = 30,y = 210,width = 60,height = 30)
 
#播放/暂停按钮
start_stop = StringVar(Frame, value="播放")
buttonPlay = Button(Frame,textvariable = start_stop,command = buttonPlayClick)
buttonPlay.place(x = 100,y = 210,width = 60,height = 30)
buttonPlay["state"] = "disabled"
 
 
#下一首按钮
buttonNext = tkinter.Button(Frame,text = "下一首", command = buttonNextClick)
buttonNext.place(x  =100,y = 250,width = 60,height = 30)
buttonNext["state"] = "disabled"
 
#上一首按钮
buttonPrev = tkinter.Button(Frame,text = "上一首", command = buttonPrevClick)
buttonPrev.place(x = 30,y = 250, width = 60, height = 30)
buttonPrev["state"] = "disabled"
 
#单曲循环/循序播放按钮
mode_change = StringVar(Frame, value = "单曲循环")
buttonCircle = tkinter.Button(Frame, textvariable = mode_change, command = buttonCircClick)
buttonCircle.place(x = 30, y = 290, width = 60, height = 30)
buttonCircle["state"]="disabled"
 
#当前播放音乐
musicName = StringVar(Frame,value = "暂时没有播放音乐")
labelName = Label(Frame,textvariable = musicName, justify = LEFT, fg = "red")
labelName.place(x = 200, y = 210, width = 260, height = 20)
 
#调节音量
labelvoice = Label(Frame, text = "音量", justify = LEFT)
labelvoice.place(x = 20, y = 350, width = 30, height = 20)
s = tkinter.Scale(Frame,from_ = 0, to = 1, orient = tkinter.HORIZONTAL, length = 200, resolution = 0.1, command = controlVoice)
s.set(1)
s.place(x = 50, y = 330, width = 100)
 
#循环刷新
Frame.mainloop()

最终效果

运行程序之后,可以选择“添加音乐”,然后选择本地的文件夹,用于选择需要播放的音乐。

在音乐列表中选择需要播放的音乐,然后就是出现正在播放的音乐。

大概效果就是这样的,之后还可以继续学习,将它改进成为

  • 展示正在播放歌曲的歌词
  • 首页的图片可以自动轮番播放
  • 播放音乐mv
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页