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积分下载,有需要的朋友自行下载。

音乐播放器源码

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:网络层 - IPv4地址

计算机网络:网络层 - IPv4地址 分类编址划分子网子网掩码 无分类编址 CIDRCIDR 地址块构造超网 在酒店中,每个房间都有门牌号码,服务员送餐时,就可以根据门牌号码来判断一份餐要送到那个房间。 在网络中也是如此,一份…

万万没想到,一个不起眼的小功能,差点把我们项目搞崩溃!

大家好,我是程序员鱼皮。今天分享一个真实项目开发的小故事。 故事 最近我们团队一直在持续更新编程导航网站,优化了界面,也新增了不少功能。现在网站长下面这样,是不是看着比以前舒服多了? 编程导航:htt…

2024泰迪智能科技大数据实训室方案

大数据实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。实训室旨在培养德智体全面发展、遵纪守法、掌握大数据平台运维基本技能、具备大数据应用、分析和系统管理与运维能力的高素质大数据技术人才。 大数据实训室建设的…

理解科研中的空间域和时域和频域

文章目录 空间域时域频域频域中的高低概念 读了很多的论文后,才感知到论文中常说的什么空间域怎么怎么样,时域怎么怎么样,频域怎么怎么样。 本文其实主要写的是频域。 空间域 spatial domain ; 时域 temporal domain &#xff1b…

【Modelground】个人AI产品MVP迭代平台(4)——Mediapipe视频处理网站介绍

文章目录 介绍模型配置输入输出核心实现(源码)总结 介绍 这篇文章我将硬核介绍Modelground的第一个产品——Mediapipe视频处理!网站入口为https://tryiscool.space/ml-video/,如图所示,欢迎体验。 tip: 由于服务器带宽…

Query传递的参数需不需要加注解?加什么?为什么有的时候要加有的时候不加?

Query传递过来的参数可以加,也可以不加注解。如果要加,是在传递的参数名和后端的变量名不一致的情况下,要加RequestParam如果传递过来的参数名和后端的变量名一致,则可以不加RequestParam。 传递过来的数据如果是通过 Query 方式…

Java操作数据库 —— JDBC ① 基础篇

我走我的路,有人拦也走,没人陪也走 —— 24.6.7 JDBC JDBC就是使用Java语言操作关系型数据库的一套API 一、JDBC简介 JDBC 概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称:(Java DataBase Connectivity)意为Java 数据库连接 JDBC 本质: ①…

7种常用数据分析方法,建议收藏学习(下)

在上一篇内容里,我们提到了常用的数据分析放法,比如:漏斗分析法、留存分析法、分组分析法、矩阵分析法。没有看到的上篇推送的小伙伴可以回过头去查看我们之前的推送。 今天,我们继续讲后面的内容:关联分析法、指标分…

图钉AI导航

1、图钉AI导航 https://www.tudingai.com/

MySQL复习题(期末考试)

MySQL复习题(期末考试) 1.MySQL支持的日期类型? DATE,DATETIME,TIMESTAMP,TIME,TEAR 2.为表添加列的语法? alter table 表名 add column 列名 数据类型; 3.修改表数据类型的语法是? alter table 表名 modify 列名 新…

【机器学习】让计算机变得更加智能

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 目录 机器学习:让计算机…

springmvc 全局异常处理器配置的三种方式深入底层源码分析原理

文章目录 springmvc 全局异常处理器配置的三种方式&深入底层源码分析原理配置全局异常处理器的三种方式实现接口HandlerExceptionResolver并配置到WebMvcConfigurer注解式配置ExceptionHandlercontroller里方法上定义ExceptionHandler 深入源码分析进入DispatcherServlet执…

Jmeter07:函数

1 Jmeter组件:函数 1.1 是什么? 是程序中的封装单元(最小的),封装一些功能实现 1.2 为什么? 优点1:易读 易维护 优点2:实现功能复用 1.3 怎么用? 流程: 1&…

HCIE认证,这些误区要避开

追求HCIE认证是许多网络工程师提升职业水平的选择之一。 然而,在这条备考之路上,存在不少误解可能会误导你的学习方向或影响你的备考效率。 了解并避开这些常见误区,将帮助你更有效地准备HCIE认证考试。 01 误区一:过分依赖题库 …

【Three.js】知识梳理二:Three.js引用和环境搭建

1.文件包下载和目录简介 1.1 文件包下载 a. 官方网站下载: 访问 Three.js 的官方网站(threejs.org/)并点击 "Download" 按钮,下载最新版本的文件包。 b. GitHub仓库下载: 访问 Three.js 的 GitHub 仓库&a…

面向对象设计原则概述

面向对象设计原则概述 面向对象设计原则概述 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 内容来自《设计模式与艺术》一文。后续会陆续分享书中值得深思观点。 面向对象设计的目标之一在于支持可维护性复用&#xf…

Django UpdateView视图

UpdateView是Django中的一个通用视图,用于处理对象的更新操作。它允许用户更新一个已经存在的对象。UpdateView通常与一个模型表单一起使用,这样用户就可以看到当前对象的值,并可以修改它们。 1,添加视图 Test/app3/views.py fr…

第十九节:暴力递归到动态规划

一 动画规划的概念 优化出现重复解的递归 一旦写出递归来,改动态规划就很快 尝试策略和状态转移方程是一码事 学会尝试是攻克动态规划最本质的能力 如果你发现你有重复调用的过程,动态规划在算过一次之后把答案记下来,下回在越到重复调用过程…

2-1基于matlab的拉普拉斯金字塔图像融合算法

基于matlab的拉普拉斯金字塔图像融合算法,可以使部分图像模糊的图片清楚,也可以使图像增强。程序已调通,可直接运行。 2-1 图像融合 拉普拉斯金字塔图像融合 - 小红书 (xiaohongshu.com)

Camtasia Studio2024破解神器下载,轻松上手视频剪辑

嘿!今天我要和大家分享一个神奇的软件——Camtasia Studio2024最新版的破解安装包!🎬 作为一个视频制作爱好者,我一直在寻找一款功能强大、易于操作的视频编辑软件。而Camtasia Studio2024就是我心目中的完美选择!它不…