pygam第5课——自制音乐播放器

news2024/12/28 21:47:56

前言:前几节课我们已经学会了很多知识点,欢迎大家可以去考古一下

在这里插入图片描述

今天我们将学习加载音乐,并且自制一个音乐播放器,界面功能包括:

  • 加载背景封面
  • 上一首
  • 开始\暂停
  • 下一首
  • 重播
  • 随机播放
  • 快进

效果展示(GIF所以你们听不到声音)

请添加图片描述

分析

  • 加载音乐

pygame.mixer.music.load(song) # 加载音乐
pygame.mixer.music.set_volume(0.5) # 设置播放器音量,参数:0-1,切记写小一点,以免声音过大
  • 播放

'''
第一个参数1指播放一次,0指循环播放
time:指从第几毫秒开始播放
 pygame.mixer.music.play(1, time)
'''
pygame.mixer.music.play() # 播放
  • 暂停

pygame.mixer.music.pause()
  • 恢复播放

pygame.mixer.music.unpause()
  • 快进

'''
第一个参数1指播放一次,0指循环播放
time:指从第几毫秒开始播放
 pygame.mixer.music.play(1, time)
'''
 pygame.mixer.music.play(1, time)
  • 随机播放

    • randon.randint(音乐数量)

注意事项及解决

素材获取(功能图标、音乐封面,音乐只能自己下载啦):点我

目录结构

文件\文件夹名作用
image2播放器界面的功能图标图片存放
music存放音乐
封面存放音乐封面

在这里插入图片描述

完整版代码:

import os

import pygame, random, sys, time

pygame.init()
# 创建窗口
sc = pygame.display.set_mode((300, 250))
# 载入图片
bg = pygame.image.load("image2/bg.png")  # 背景
pre_song = pygame.image.load("image2/上一首.png")  # 上一曲
start = pygame.image.load("image2/播放.png")  # 播放
pause = pygame.image.load("image2/暂停.png")  # 暂停
next_song = pygame.image.load("image2/下一首.png")  # 下一曲
ff = pygame.image.load("image2/快进.png")  # 快进
res = pygame.image.load("image2/重播.png")  # 重播
rand = pygame.image.load("image2/随机播放.png")  # 随机
# 加载音乐播放图片
bg_list = os.listdir("./封面/")

bg_list1 = []
for bg in bg_list:
    bg_list1.append(pygame.image.load("./封面/"+bg))

# 初始按钮为“开始”状态
btn = start
# 设置btn_flag,控制暂停/开始按钮的形态
btn_flag = 0
# 9把歌曲名字保存在列表,客户端加密后的名字很长,最好把每首歌名换行并对齐,方便查阅
song_list = ['./music/'+i for i in os.listdir('./music/')]

# 载入音乐
index = 0
song = song_list[index]
pygame.mixer.music.load(song)
# 控制音量,取值范围为0-1.0的浮点数。0为最小值,1为最大值。
pygame.mixer.music.set_volume(0.5)
# 播放第一首音乐,此处提醒学生,调小电脑音量,防止声音突然太大伤害听力
pygame.mixer.music.play()
time = 0
print(time)
length = len(song_list)
while True:  # 加上循环,引出事件

    # 如果是偶数,按钮切换为“start”,如果时奇数,切换为“stop”。
    if btn_flag % 2 == 0:
        btn = start
        # 音乐的暂停
        pygame.mixer.music.pause()
    else:
        btn = pause
        # 音乐的开始
        pygame.mixer.music.unpause()
    # 绘制背景,按钮
    sc.blit(bg_list1[index],(0,0)) # 绘制当前播放音乐的背景图片
    sc.blit(pre_song, (20, 90))
    sc.blit(next_song, (210, 90))
    sc.blit(rand, (115, 170))
    sc.blit(btn, (115, 90))
    sc.blit(ff, (210, 170))
    sc.blit(res, (20, 170))
    pygame.display.update()
    # 获取事件列表
    for event in pygame.event.get():
        mouse_x, mouse_y = pygame.mouse.get_pos()
        if event.type == pygame.QUIT:
            pygame.quit()  # 退出窗口
            sys.exit()  # 退出程序
        if event.type == pygame.MOUSEBUTTONDOWN:
            # 点击了暂停按键后的效果
            if 115 < mouse_x < 185 and 90 < mouse_y < 160:
                btn_flag += 1
            # 1. 点击下一曲按钮,切换为下一首音乐
            if 210 < mouse_x < 280 and 90 < mouse_y < 160:
                # index+=1 #简单尝试,多点几次下一曲,发现列表索引超限。
                index = (index + 1) % len(song_list)  # 实现音乐的轮播
                song = song_list[index]
                pygame.mixer.music.load(song)
                pygame.mixer.music.play(1, 0)
            # 1. 点击上一曲按钮,切换为上一首音乐
            if 20 < mouse_x < 90 and 90 < mouse_y < 160:
                # index+=1 #简单尝试,多点几次下一曲,发现列表索引超限。

                index = (index + length - 1) % length  # 实现音乐的轮播
                song = song_list[index]
                pygame.mixer.music.load(song)
                pygame.mixer.music.play(1, 0)
            # 2. 点击了快进后的效果
            elif 210 < mouse_x < 280 and 170 < mouse_y < 240:
                # 获取播放时间并转换成秒为单位
                # 时间自加
                time += 10
                print(time)
                pygame.mixer.music.play(1, time)
                print(time)
                # 知识进阶
                if pygame.mixer.music.get_busy() == False:
                    # 获取新的下标
                    index = (index + 1) % length
                    # 播放新的音乐
                    song = song_list[index]
                    pygame.mixer.music.load(song)
                    pygame.mixer.music.play()

            # 3. 点击了重新播放后的效果
            elif 20 < mouse_x < 90 and 170 < mouse_y < 240:
                time = 0
                pygame.mixer.music.play(1, time)

            # 4. 点击了随机后的效果
            elif 115 < mouse_x < 185 and 170 < mouse_y < 240:
                # 获取新的下标
                index = random.randint(0, 3)
                # 播放新的音乐
                song = song_list[index]
                pygame.mixer.music.load(song)
                pygame.mixer.music.play()


希望对大家有帮助

致力于办公自动化的小小程序员一枚#

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day6 广播及实现

什么是广播 数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&#xff0c;称为广播 只有用户数据报(使用UDP协议)套接字才能广播 广播地址&#xff1a; 一个网络内主机号全为1的IP地址为广播地址 发到该地址的数据包被所有的主机接收 255…

MT6833(天玑 700)处理器参数_芯片规格_性能介绍

MT6833&#xff08;天玑700&#xff09;是一款出色的基带处理器&#xff0c;具有许多优秀的功能&#xff0c;并且采用了强大的八核CPU&#xff0c;其中包括两个主频高达2.2GHz的Arm Cortex-A76核心。此外&#xff0c;他还配备了LPDDR4X内存和UFS 2.2存储&#xff0c;大大提高了…

MyBatis中的#{}和${}有什么区别?

首先#{} 和 ${} 都是参数占位符&#xff0c;其中#{}是预编译处理&#xff0c;${}是字符直接进行替换。预编译处理是指&#xff1a;MyBatis 在处理#{}时&#xff0c;会将 SQL 中的 #{} 替换为?号&#xff0c;使⽤ PreparedStatement 的 set ⽅法来赋值。直接替换是指MyBatis 在…

【谷粒商城笔记】2. 创建项目与运行

1. 创建微服务项目 共分为下面五个 商品服务product 存储服务ware 订单服务order 优惠券服务coupon 用户服务member 1.1 新建github/gitee项目 首先去github新建项目 在IDEA中导入项目 从版本控制(Version Control)新建Project 选择路径和git链接 1.2 创建微服务 新建…

modscan模拟数据,nodred通过modbus协议向emqx创建规则引擎写入TDengine库

nodred通过modbus协议向emqx创建规则引擎写入TDengine库过程 一、emqx存储数据到TDEngine数据库1.1 进入emqx界面1.2 新建资源1.3 新建规则引擎1.4 测试 二、modscan模拟设备数据三、在Node-RED上模拟Modbus通讯3.1 nodeRed环境搭建3.2 nodeRed使用3.3 nodered读取modbus发送的…

Firewalld

目录 firewalld概述 firewalld 与 iptables 的区别 firewalld 区域的概念 firewalld防火墙预定义了9个区域 firewalld数据处理流程 firewalld检查数据包的源地址的规则 firewalld防火墙的配置方法 常用的firewall-cmd 命令选项 区域管理 服务管理 ​编辑端口管理 设…

创建项目执行计划的5个简单步骤

项目执行计划是定义项目将如何执行的文件。执行计划解释项目中涉及的战略目标和步骤&#xff0c;定义项目完成时间表&#xff0c;并列出成功项目所需的资源&#xff08;包括团队成员&#xff09;。 使用项目计划是多种项目管理最佳实践之一。这个过程并不像看起来那么复杂。按…

读财报丨产品收入增长近70%,百济神州已成功切换成长驱动模式?

5月12日&#xff0c;百济神州&#xff08;北京&#xff09;生物科技有限公司&#xff08;下称“百济神州”&#xff09;公布2023年第一季度业绩报告。从数据来看&#xff0c;延续了2022年的良好增长态势&#xff0c;实现营业收入30.66亿元&#xff0c;同比增长57%&#xff0c;而…

unity实现小球poke不穿膜

引言 在oculus quest2官方实现了手部指尖poke按键不穿膜&#xff0c;具体采用代码的方式进行限制&#xff0c;具体看oculus quest包中的HandPokeLimiterVisual.cs&#xff0c;下面则实现其他物体&#xff08;小球&#xff09;作为pokeInteractor来poke按键&#xff0c;当按下的…

Linux网络——shell编程之SNAT与DNAT的应用

Linux网络——shell编程之SNAT与DNAT的应用 一、SNAT的介绍1.SNAT概述2.SNAT源地址转换过程 二、SNAT转换三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT的转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT的介绍 SNAT&#xff08;SNAT&#xff09;一…

蓝桥杯数论总结:最大公约数和最小公倍数(原理+性质证明+python板子)

目录 最大公约数 手写GCD 最小公倍数 推导LCM函数表达式 GCD基本性质 性质的证明 取模运算基本性质 证明 最大公约数 gcd是最大公约数的意思。Python的math库里有gcd函数。 在Python命令行运行gcd&#xff0c;可发现其可传入0、不会返回负数、可对多个数进行判断的性质…

利用 DynamoDB 和 S3 结合 gzip 压缩,最大化存储玩家数据

前言 一些传统游戏架构中&#xff0c;采用 MySQL 存储玩家存档数据&#xff0c;利用分库分表分散单库单表的存储和性能压力&#xff0c;从而达到支持更多玩家的目的。随着数据量增长&#xff0c;数据表中 varchar 类型已经无法满足游戏中单字段的存储需求&#xff0c;而 blob …

数据结构 -最短路径dijkstra(迪杰斯特拉)算法讲解及代码实现

迪杰斯特拉算法是一种广义的贪心算法&#xff0c;求出局部最优解&#xff0c;再去求全局最优解 图文讲解&#xff1a; 举例图&#xff1a;&#xff08;起始点为1&#xff09; 辅助数组&#xff1a; s&#xff1a;记录了目标顶点到其他顶点的最短路径是否求得&#xff08;求得…

代码调试技巧

目录 1.为什么要进行调试&#xff1f; 2.调试的基本步骤 3.关于Debug版本和Release版本 4.调试技巧 5.调试总结 我还是喜欢真实的世界&#xff0c;因为在那里&#xff0c;我可以通过自己的努力来改变残酷的现实 本专栏适用于有一定C语言基础并且还要继续学习的人 往期…

CryoEM - 冷冻电镜 CryoSPARC 软件的安装与环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/130809095 CryoSPARC 软件是一种用于冷冻电镜数据处理的创新工具&#xff0c;可以快速、准确地重建生物分子的三维结构。CryoSPARC 软件…

【使用ChatGPT制作PPT】

内容目录 一、利用ChatGPT生成PPT内容1. 打开ChatGPT&#xff1a;2. 输入需求&#xff1a;3. 复制&#xff1a; 二、制作生成PPT1. 打开PPT制作网站&#xff1a;2. 左侧网页版-导入创建-粘贴Markdown内容-导入创建3. 自行更改副标题、演讲者、选择模板、演示及下载 一、利用Cha…

Linux网络——shell编程之iptables防火墙

Linux网络——shell编程之iptables防火墙 一、概述1.iptables2.netfilter 和 iptables的关系 二、iptables中的四表五链1.四表五链的关系2.四表3.五链 三、匹配顺序1.数据包到达防火墙的匹配流程2.规则链之间的匹配顺序3.规则链内的匹配顺序 四、iptables 防火墙的配置方法1.ip…

python tesseract-ocr + jTessBoxEditorFX 训练自定义字库

在使用tesseract-ocr进行字符识别时&#xff0c;我们使用了官方提供的字库&#xff0c;例如英文字库、中文字库&#xff0c;但这些字库并不一定能满足我们所有的需求。所以有些时候&#xff0c;我们就需要训练属于自己的自定义字库。废话少说&#xff0c;直接开干。 第一步&am…

联想首次展示全栈算力方案服务,品牌换新亮相

1、联想算力&#xff0c;第一次真正被所有人感知。 2、基于软硬服一体化的优势&#xff0c;联想打造了丰富多样的四维算力服务&#xff0c;即融合化、场景化、订阅化、绿色化&#xff0c;可以满足不同企业、不同行业的定制化需求。 5月20日&#xff0c;主题为“联想方案服务&am…

2023中兴软件类笔试

1.下列Python代码&#xff1a;将近似输出什么&#xff1f; import numpy as np print np.sqrt(6*np.sum(1/np.arange(1,1000000, dtypenp.float)**2))这段代码是用来计算圆周率的巴塞尔问题&#xff08;Basel problem&#xff09;的近似值&#xff0c;输出结果将近似为3.14159…