python--音乐播放小程序

(本篇部分代码综合整理自B站,B站有手把手说明的教程)

简易音乐播放器:
这个控件在界面上仍然使用Tkinter,只不过没有通过编程,而是利用pygame库中的音频模块,在逻辑上增加了上一曲、下一曲(读取上一个文件、下一个文件)、音量控制、简单的线程控制等。

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

#第一步 搭建界面
root = tkinter.Tk()
root.title('音乐播放器')
#窗口大小和位置
root.geometry('460x600+500+100')
#不能拉伸
root.resizable(False,False)

folder = ''#文件路径
res = []
num = 0
now_music = ''
#第二步 功能实现
def buttonChooseClik():
    '''添加文件函数'''
    global folder
    global res
    if not folder:
        folder = tkinter.filedialog.askdirectory()#选择目录
        musics = [folder + '\\' + music
                  for music in os.listdir(folder) if music.endswith(('.mp3','ogg'))]
        ret = []
        for i in musics:
            ret.append(i.split('\\')[1:])
            res.append(i.replace('\\','/'))
        var2 = tkinter.StringVar()
        var2.set(ret)
        #放入列表框
        lb = tkinter.Listbox(root,listvariable =var2)
        lb.place(x=50,y=100,width=260,height=300)
    if not folder:
        return
    global playing
    playing = True

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


def play():
    '''播放音乐的函数'''
    #初始化混音器设备
    if len(res):
        pygame.mixer.init()
        global num
        while playing:
            if not pygame.mixer.music.get_busy():
                #随机播放一首歌曲
                nextMusic =res[num]
                print(nextMusic)
                print(num)
                pygame.mixer.music.load(nextMusic.encode())
                #播放一次
                pygame.mixer.music.play(1)
                #print(len(res)-1)
                if len(res) -1==num:
                    num=0
                else:
                    num = num+1
                nextMusic = nextMusic.split('\\')[1:]
                musicName.set('playing....'+''.join(nextMusic))
            else:
                time.sleep(0.1)

def bottonPlayClik():
    '''点击播放'''
    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.music.pause()
        pause_resume.set('继续')
    elif pause_resume.get() == '继续':
        pygame.mixer.music.unpause()
        pause_resume.set('暂停')


def bottonStopClik():
    '''停止播放'''
    global playing
    playing = False
    pygame.mixer.music.stop()
def bottonNextClik():
    '''播放下一首'''
    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 bottonPrevClik():
    '''播放上一首'''
    global playing
    playing = True
    pygame.mixer.music.stop()
    global num
    if num == 0:
        num = len(res)-2
    elif num == len(res) - 1:
        num -= 2
    else:
        num -=2
    print(num)

    playing = True

    t = threading.Thread(target = play)

    t.start()

def closeWindow():
    '''关闭窗口'''
    global playing
    playing = False
    time.sleep(0.3)
    try:
        pygame.mixer.music.stop()
        pygame.mixer.quit()
    except:
        pass
    root.destroy()

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

#关闭窗口
root.protocol('WM_DELETE_WINDOW',closeWindow)
#添加按钮
buttonChoose = tkinter.Button(root,text='添加',command=buttonChooseClik)
#布局
buttonChoose.place(x=50,y=10,width=50,height=20)
#播放按钮  跟踪变量值的变化
pause_resume = tkinter.StringVar(root,value='播放')
buttonPlay= tkinter.Button(root,textvariable=pause_resume,command=bottonPlayClik)
buttonPlay.place(x=190,y=10,width=50,height=20)
buttonPlay['state'] = 'disabled'
#停止播放
buttonStop = tkinter.Button(root,text = '停止',command=bottonStopClik)
#布局
buttonStop.place(x=120,y=10,width=50,height=20)
#状态
buttonStop['state'] = 'disabled'
# 下一首
buttonNext = tkinter.Button(root,text='下一首',command =bottonNextClik)

buttonNext.place(x=260,y=10,width=50,height=20)

buttonNext['state'] = 'disabled'

#上一首
buttonPrev = tkinter.Button(root,text='上一首',command =bottonPrevClik)
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=10,y=30,width=260,height=20)

#添加控件
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=200)

#启动消息循环
root.mainloop()

运行效果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值