python本地音乐播放器+附源文件地址

python本地音乐播放器

因为现在听歌都要版权,所以我喜欢把音乐下载下来听。但一直没找到喜欢的本地音乐播放器,我也只会一些python皮毛,所以有了自己写一个python本地音乐播放器的想法,经过摸索也总算是能正常的放音乐了,特此记录!

但是歌词还是没有找到好的办法来处理,希望有大神能指点一二,感激不尽!

播放器图示
界面就这样,比较简洁,目前进度无法快进,歌词只有当前的一行,下图才是我想要的。
另外,歌单那一框要添加歌单后才显示出来。

在这里插入图片描述

准备工作

  • 首先要有一个文件夹放好.mp3.lrc文件,
    各mp3与lrc文件名相同(如:1.mp3,1.lrc,2.mp3,2.lrc)
  • pip install 库名 安装好需要的库
  • 需要的库:tkinter、threading

代码介绍

先把界面各元素位置确定并固定。

from tkinter import *

win = Tk()
win.title("音乐播放器")
win.geometry('700x610+400+100')
win.resizable(False, False)
# 歌名+播放进度
progress_lab = LabelFrame(win,text = "播放进度")
progress_lab.grid(row =1,column =0,sticky = "we",rowspan = 2)
musicName = StringVar(progress_lab, value='没有播放音乐...')
# 获取播放进度
var_scale = DoubleVar()
progress_scal = Scale(progress_lab,orient = HORIZONTAL,showvalue = 0,length =280)
progress_scal.grid(row =2,column =0)
# 添加歌单
buttonAdd = Button(win, text='添加歌单', font='20', activeforeground='green', bg='sky blue')
buttonAdd.place(x=1, y=101, width=140, height=80)
# 播放
pause_resume = StringVar(win, value="播放")
buttonPlay = Button(win, textvariable=pause_resume, font='20', activeforeground='green', bg='sky blue')
buttonPlay.place(x=150, y=101, width=140, height=80)
buttonPlay['state'] = 'disabled'
# 上一首
buttonPrev = Button(win, text='上一首', font='20', activeforeground='green', bg='sky blue')
buttonPrev.place(x=1, y=191, width=140, height=80)
buttonPrev['state'] = 'disabled'
# 下一首
buttonNext = Button(win, text='下一首', font='20', activeforeground='green', bg='sky blue')
buttonNext.place(x=150, y=191, width=140, height=80)
buttonNext['state'] = 'disabled'
# 音量
var_volume = IntVar()
vioce_lab = Label(win,text = "")
vioce_lab.place(x=1,y=275, width=400, height=100)
# 歌词
lrc_lab = LabelFrame(win, text="歌词")
lrc_lab.place(x=310, y=1, width=380, height=600)
lrc_Name = StringVar(lrc_lab, value='没有歌词文件')

win.mainloop()

添加歌单。
调用tkinter库中的filedialog方法选择存放音乐的文件夹,
提取文件夹中的.mp3文件生成列表,
这里调用了win32com模块。

def add_click():
    global folder
    folder = filedialog.askdirectory()
    musics = [folder + '\\' + music for music in os.listdir(folder) if music.endswith(('.mp3'))]
    ret = [] # 存放歌曲文件
    # 歌曲处理
    for i in musics:
        ret.append(i.split('\\')[1:])
        #设置播放文件
        name = wmp.newMedia(i)
        # 建立播放列表
        wmp.currentPlaylist.appendItem(name)

绑定按钮,将列表打印出来,启用播放按钮

var2 = StringVar()
var2.set(ret)
list0 = Listbox(win, listvariable=var2)
list0.place(x=1, y=365, width=290, height=240)
buttonPlay['state'] = 'normal' # 启用按钮
pause_resume.set('播放')

buttonAdd = Button(win, text='添加歌单', font='20', activeforeground='green', bg='sky blue', command=add_click)
buttonAdd.place(x=1, y=101, width=140, height=80)
  1. 这里参考一位猿友的方法
def play_click():
    if pause_resume.get() == '播放':
        wmp.controls.play()
        pause_resume.set('暂停')
    elif pause_resume.get() == '暂停':
        wmp.controls.pause()
        pause_resume.set('继续')
    elif pause_resume.get() == '继续':
        wmp.controls.play()
        pause_resume.set('暂停')

源代码文件

下载链接

from tkinter import *
from tkinter import filedialog
from win32com.client import Dispatch
import os
import threading

win = Tk()

win.title("音乐播放器")
win.geometry('700x610+400+100')
win.resizable(False, False)
wmp = Dispatch("WMPlayer.OCX")

#添加歌单
def add_click():
    global folder
    folder = filedialog.askdirectory()
    musics = [folder + '\\' + music for music in os.listdir(folder) if music.endswith(('.mp3'))]
    ret = [] # 存放歌曲文件
    # 歌曲处理
    for i in musics:
        ret.append(i.split('\\')[1:])
        #设置播放文件
        name = wmp.newMedia(i)
        # 建立播放列表
        wmp.currentPlaylist.appendItem(name)
    var2 = StringVar()
    var2.set(ret)
    list0 = Listbox(win, listvariable=var2)
    list0.place(x=1, y=365, width=290, height=240)
    buttonPlay['state'] = 'normal' # 启用按钮
    pause_resume.set('播放')

def lrc_name():
    global jndu
    # 建立字典存放歌词和时间,key表示时间,value表示歌词
    lrc_dict = {}
    # 获取正在播放的音乐名
    lrcname = folder + '/' + wmp.currentMedia.name + '.lrc'
    lrc_file = open(lrcname, 'r', encoding='utf-8')
    for i in lrc_file.readlines():
        lrc_word = i.replace("[", "]").strip().split("]")
        for j in range(len(lrc_word) - 1):
            if lrc_word[j]:
                lrc_dict[lrc_word[j]] = lrc_word[-1]
    # 遍历字典,对字典的key进行排序,
    for key in lrc_dict.keys():
        keys = key.split('.')[0]
        if jndu == keys:
            lrc_Name.set(lrc_dict[key])
        else:
            continue
    lrc_file.close()
# 获取正在播放的MP3
def music_name():
    global jndu
    while wmp.playState != 1:
        # 正在播放的文件名
        musicName.set("%s" % wmp.currentMedia.name)
        # 播放进度
        progress_scal.set(int(wmp.controls.currentPosition))
        jndu = wmp.controls.currentPositionString
        progress_scal.config(label = jndu)
        progress_scal.config(to = wmp.currentMedia.duration)
        # 歌词
        lrc_name()
        
# 点击播放
def play_click():
    buttonNext['state'] = 'normal'
    buttonPrev['state'] = 'normal'

    if pause_resume.get() == '播放':
        wmp.controls.play()
        # 添加线程用以显示当前播放MP3名称
        t = threading.Thread(target=music_name)
        # 解决子线程无法关闭问题
        t.daemon = True
        t.start()
        # 循环播放
        wmp.settings.setMode("loop", True)
        pause_resume.set('暂停')
    elif pause_resume.get() == '暂停':
        wmp.controls.pause()
        pause_resume.set('继续')
    elif pause_resume.get() == '继续':
        wmp.controls.play()
        pause_resume.set('暂停')

# 下一首
def next_click():
    wmp.controls.next()
#上一首
def prev_click():
    wmp.controls.previous()

# 音量
def Volume_ctr(none):
    wmp.settings.Volume = vio_scale.get()
def Volume_add(i=[0]):
    wmp.settings.Volume =wmp.settings.Volume+5
    i.append(wmp.settings.Volume)
    vio_scale.set(wmp.settings.Volume)
def Volume_minus(i=[0]):
    wmp.settings.Volume = wmp.settings.Volume -5
    i.append(wmp.settings.Volume)
    vio_scale.set(wmp.settings.Volume)

# 关闭窗口
def close_window():
    win.destroy()

# 歌名+播放进度
progress_lab = LabelFrame(win,text = "播放进度")
progress_lab.grid(row =1,column =0,sticky = "we",rowspan = 2)
musicName = StringVar(progress_lab, value='没有播放音乐...')
labelName = Label(win, textvariable=musicName, font='12', fg="green")
labelName.grid(row=0,column=0)
# 获取播放进度
var_scale = DoubleVar()
progress_scal = Scale(progress_lab,orient = HORIZONTAL,showvalue = 0,length =280,variable = var_scale)
progress_scal.grid(row =2,column =0)
# 添加歌单
buttonAdd = Button(win, text='添加歌单', font='20', activeforeground='green', bg='sky blue', command=add_click)
buttonAdd.place(x=1, y=101, width=140, height=80)
# 播放
pause_resume = StringVar(win, value="播放")
buttonPlay = Button(win, textvariable=pause_resume, font='20', activeforeground='green', bg='sky blue', command=play_click)
buttonPlay.place(x=150, y=101, width=140, height=80)
buttonPlay['state'] = 'disabled'
# 上一首
buttonPrev = Button(win, text='上一首', font='20', activeforeground='green', bg='sky blue', command=prev_click)
buttonPrev.place(x=1, y=191, width=140, height=80)
buttonPrev['state'] = 'disabled'
# 下一首
buttonNext = Button(win, text='下一首', font='20', activeforeground='green', bg='sky blue', command=next_click)
buttonNext.place(x=150, y=191, width=140, height=80)
buttonNext['state'] = 'disabled'
# 音量
var_volume = IntVar()
vioce_lab = Label(win,text = "")
vioce_lab.place(x=1,y=275, width=400, height=100)
vio_scale = Scale(vioce_lab,orient = HORIZONTAL,length =280,variable = var_volume,command =Volume_ctr)
vio_scale.set(100)
vio_scale.grid(row =0,column =0)
vio_plus = Button(vioce_lab,width =8,text = "音量+",command =Volume_add)
vio_plus.grid(row =9,column =0,sticky = "e")
vio_minus = Button(vioce_lab,width =8,text ="音量-",command = Volume_minus)
vio_minus.grid(row =9,column =0,sticky ="w")
# 歌词
lrc_lab = LabelFrame(win, text="歌词")
lrc_lab.place(x=310, y=1, width=380, height=600)
lrc_Name = StringVar(lrc_lab, value='没有歌词文件')
lrc_label = Label(lrc_lab, textvariable=lrc_Name, font='10', fg="red")
lrc_label.pack(fill="both", ipady=20)


win.mainloop()

其它

此播放器默认 顺序播放
需要其他功能如 随机播放 请自行搜索Windows Media player

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值