使用PyQt5/PySide2编写一个极简的音乐播放器

2023-05-16

文章目录

    • 一、创建UI界面
    • 二、获取网络歌曲
    • 三、创建和链接信号槽

疫情肆虐,憋在家实在无聊,索性写点东西,于是就有了这个极极极极极简的音乐播放器。

在这里插入图片描述
这个极极极简的音乐播放器类似于“阅后即焚”的软件,播放器可以随机播放歌曲,获取下一首歌曲,不能重新播放上一首歌曲,不能获取歌曲的名称和演唱者。听过的歌曲,就像过眼云烟,放完即散。

下面来看看如何用Python实现这个音乐播放器软件吧!

一、创建UI界面

首先,我们来创建这个播放器的UI界面。这个播放器一共有6个控件:

  • 左上角的程序关闭按钮;
  • 左侧的播放状态标签;
  • 顶部的slogan;
  • 播放/暂停按钮;
  • 下一首按钮;
  • 播放进度条;

基于以上控件,我们用一个网格布局来排列:

class Music(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setFixedSize(400,200)
        self.setWindowTitle("州的先生")
        self.init_ui()
        self.custom_style()
        self.playing = False # 播放状态初始化为否
        self.player = QMediaPlayer(self)

    # 设置样式
    def custom_style(self):
        self.setStyleSheet('''
            #main_widget{
                border-radius:5px;
            }
            #play_btn,#pervious_btn,#next_btn{
                border:none;
            }
            #play_btn:hover,#pervious_btn:hover,#next_btn:hover{
                background:gray;
                border-radius:5px;
                cursor:pointer;
            }
        ''')
        self.close_btn.setStyleSheet('''
            QPushButton{
                background:#F76677;
                border-radius:5px;
                }
            QPushButton:hover{
                background:red;
                }''')
        self.status_label.setStyleSheet('''
            QLabel{
                background:#F7D674;
                border-radius:5px;
                }
        ''')

    # 初始化UI界面
    def init_ui(self):
        # 窗口布局
        self.main_widget = QtWidgets.QWidget()
        self.main_widget.setObjectName("main_widget")
        self.main_layout = QtWidgets.QGridLayout()
        self.main_widget.setLayout(self.main_layout)

        # 标题
        self.title_lable = QtWidgets.QLabel("听者,如过眼云烟……")

        # 关闭按钮
        self.close_btn = QtWidgets.QPushButton("")  # 关闭按钮
        self.close_btn.setFixedSize(15,15)

        # 音乐状态按钮
        self.status_label = QtWidgets.QLabel("")
        self.status_label.setFixedSize(15,15)

        # 播放按钮
        play_icon = qta.icon("fa.play-circle",)
        self.play_btn = QtWidgets.QPushButton(play_icon,"")
        self.play_btn.setIconSize(QtCore.QSize(80, 80))
        self.play_btn.setFixedSize(82,82)
        self.play_btn.setObjectName("play_btn")

        # 下一首按钮
        next_icon = qta.icon("fa.play-circle-o")
        self.next_btn = QtWidgets.QPushButton(next_icon,"")
        self.next_btn.setIconSize(QtCore.QSize(80,80))
        self.next_btn.setFixedSize(82,82)
        self.next_btn.setObjectName("next_btn")

        # 进度条
        self.process_bar = QtWidgets.QProgressBar()
        self.process_value = 0
        self.process_bar.setValue(self.process_value)
        self.process_bar.setFixedHeight(5)
        self.process_bar.setTextVisible(False)

        self.main_layout.addWidget(self.close_btn,0,0,1,1)
        self.main_layout.addWidget(self.title_lable,0,1,1,1)
        self.main_layout.addWidget(self.status_label,1,0,1,1)
        self.main_layout.addWidget(self.play_btn, 1, 1, 1, 1)
        self.main_layout.addWidget(self.next_btn, 1, 2, 1, 1)
        self.main_layout.addWidget(self.process_bar,2,0,1,3)

        self.setCentralWidget(self.main_widget)

在上面的代码中,我们通过Qt内置的按钮控件QPushButton、标签控件QLabel、进度条控件QProgressBar等把播放器的基础界面构建好了,然后通过setStyleSheet()方法设置各个控件的样式,最终得到下面的界面:
在这里插入图片描述
顶部的边框有点丑丑的,我们通过setWindowFlag()将其隐藏起来:

self.setWindowFlag(QtCore.Qt.FramelessWindowHint)  # 隐藏边框

这样,完整且好看的界面就完成了,如下图所示:
在这里插入图片描述

二、获取网络歌曲

既然是音乐播放器,当然要能够播放音乐。我们创建的这个音乐播放器不能添加本地的音乐,那就只能播放网络的音乐了。州的先生(https://zmister.com)在网上找了很久,终于找到了一个免费稳定的音乐接口。请求这个接口会随机返回一个音乐的播放地址。正好符合我们的播放器的设定,就它了:

def run(self):
    reps = requests.post("https://api.uomg.com/api/rand.music?format=json")
    # print(reps.json())
    file_url = reps.json()['data']['url']
    self.finished_signal.emit(file_url)

我们将其用Qt的线程模块QThread包装起来,作为一个异步的子线程调用:
在这里插入图片描述
有了UI界面和网络音乐,下面我们UI界面上的控件与音乐的播放通过信号槽(事件响应)连接起来。

三、创建和链接信号槽

因为我们隐藏的UI界面自带的边框,所以没有了关闭按钮。我们之前创建了左侧小红点作为播放器关闭的按钮,接着还需要一个响应函数来关闭播放器:

# 关闭程序
def close_btn_event(self):
    self.close()
self.close_btn.clicked.connect(self.close_btn_event)

这样,点击小红点,播放器就可以关闭退出了。下面来处理音乐的播放。

在这里,我们借助Qt提供的QtMultimedia子模块中的QMediaPlayer来实现MP3音乐的播放,QtMultimedia的详细使用可见Qt的官方文档:https://doc.qt.io/qtforpython/PySide2/QtMultimedia/index.html#module-PySide2.QtMultimedia:

在这里插入图片描述
这个方法,接受一个MP3音乐的网络地址参数,然后通过配置,对其进行播放。

我们之前创建了一个继承于QThread的网络歌曲获取类GetMusicThread,通过创建另一个方法对其进行调用,并将完成信号(finished_signal)连接到init_player()方法即可实现网络歌曲的获取和播放:
在这里插入图片描述
在这里,next_music()方法调用GetMusicThread随机获取一首歌曲,然后将歌曲的URL地址返回给init_player()方法,以实现播放。

next_music()方法是播放歌曲的主要方法,播放按钮、下一首按钮、一首歌曲播放完之后自动播放下一首歌曲都可以调用它。

播放音乐按钮需要控制和判断音乐的状态,可通过QMediaPlayer的mediaStatus()方法获取,并以此来进行判断:
在这里插入图片描述
为了能够在播放完一首歌曲后自动获取和播放下一首歌曲,我们需要创建一个计时器,每隔一秒获取当前播放器的状态,判断其是否已经播放完了音乐,如果播放完了,就调用next_music()方法:

self.timer = QtCore.QTimer()
self.timer.setInterval(1000)
self.timer.start()
self.timer.timeout.connect(self.check_music_status)
def check_music_status(self):
    player_status = self.player.mediaStatus()
    player_duration = self.player.duration()
    # print("音乐时间:",player_duration)
    # print("当前播放器状态",player_status)
    if player_status == 7:
        self.next_music()

再经过一些细节调整,我们就完成了这个“听后即焚”的网络音乐播放器:

在这里插入图片描述
完整的代码可以前往州的先生在Gitee上的仓库(https://gitee.com/zmister/yunyan_music)查看。

本文首发于州的先生博客https://zmister.com,链接为:《使用PyQt5/PySide2编写一个极简的音乐播放器》,更多原创编程实战应用文章,欢迎前往阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用PyQt5/PySide2编写一个极简的音乐播放器 的相关文章

  • 装饰模式C++实现

    简介 动态地给一个对象添加一些额外的职责 就增加功能来说 xff0c 装饰模式比生成子类更为灵活 动机 有时我们希望给某个对象而不是整个类添加一些功能 使用继承机制是添加功能的一种有效途径 xff0c 但不够灵活 xff0c 用户不能控制对
  • 软件测试——测试计划

    完整版 xff08 包括表格和图片 xff09 请访问 xff1a http www omegaxyz com 2019 08 02 software testing 本文共6034个字 xff0c 预计阅读时间需要16分钟 文章目录 1简
  • 享元模式C++实现(flyweight)

    简介 动机 假设成立一个外包公司 xff0c 主要给一些私营业主建网站 商家客户都类似 xff0c 要求也就是信息发布 产品展示 博客留言 论坛等功能 各个客户要求差别不大 xff0c 但客户数量多 内部状态和外部状态 在享元对象内部并且不
  • mat格式数据集转换为arff与txt格式

    本文共239个字 xff0c 预计阅读时间需要1分钟 下面的代码给出了将mat格式数据集转换为arff与txt格式的matlab代码 注意 xff0c 每个 mat文件中只有一个数据集 xff0c 其中共有m 43 1列 xff0c 最后一
  • 给linux 增加软件图标

    文章目录 其实如果是自己用的软件 xff0c 没必要像wps 安装之后 图标的复杂性 xff0c 我这里更加简单1 复制一个稍微简单的 desktop 文件并重命名你安装的软件的名称2 改动里面的东西 xff0c 下面 是Typora 软件
  • 计算机组成原理--I/O系统

    大学峡谷秀 xff0c 机组未学溜 xff0c 如今涕泪流 xff0c 共勉之 近来学习netty零拷贝 xff0c 复习并笔记之 1 概念 以主机为中心 xff0c 将信息从外部设备读入或输出的操作称为IO xff0c 外部设备包括输入输
  • ae怎样设置gpu渲染

    1 方法 xff1a 在 编辑 首选项 常规 中 选择 预览 xff0c 旁边有个 GPU信息 光线追踪 选择GPU即可 2 对于 GPU 显示灰色 xff08 既不可选 xff09 的朋友 在AE插件目录下 xff08 Support F
  • conio.h头文件

    conio h conio h不是C标准库中的头文件 conio是Console Input Output xff08 控制台输入输出 xff09 的简写 xff0c 其中定义了通过控制台进行数据输入和数据输出的函数 xff0c 主要是一些
  • 企业微信如何关联小程序?

    我们在日常使用微信时 xff0c 经常会用到小程序功能 xff0c 直接从微信中打开第三方页面 xff0c 很是方便 xff0c 那么自从企业微信与微信打通之后 xff0c 我们该如何将小程序与企业微信联系起来使用呢 xff1f 其实 xf
  • 在 Mac OS X 上安装 TensorFlow

    在 Mac OS X 上安装 TensorFlow 原文地址 xff1a https www cnblogs com tensorflownews p 7298646 html 这个文档说明了如何在 Mac OS X 上安装 TensorF
  • linux /centos 中OpenSSL升级方法详解

    OpenSSL升级前段时间出现天大bug了 xff0c 这样导致大家都急着去升级OpenSSL来初安全了 xff0c 但是很多的朋友在家linux并不知道如何去升级OpenSSL了 xff0c 下面我整理了一文章大家一起参考一下 相关软件下
  • 【字符验证】java el正则表达式使用

    支持 xff1a 中文 英文 下划线 xff0c 单独或三者合一 xff1a String regex 61 34 u4E00 u9FA5A Za z0 9 43 34 if 34 Adsf 最大的 34 matches regex Sys
  • synchronized原理

    一 synchronized简介 1 java中的关键字 xff0c 在JVM层面上围绕着内部锁 intrinsic lock 或者监管锁 xff08 Monitor Lock xff09 的实体建立的 xff0c Java利用锁机制实现线
  • 11-JUC中的Condition对象

    文章目录 ConditionCondition常用方法总结参考 Condition 任何一个java对象都天然继承于Object类 xff0c 在线程间实现通信的往往会应用到Object的几个方法 xff0c 比如wait wait lon
  • 使用微软New Bing Chat GPT-4生成AI图像的技巧

    在聊天的创意模式中 xff0c 你现在可以要求Bing为你创建一个全新的图像 xff0c 只用你的话语 只需说 34 为我创建一个图像 34 或 34 为我绘制一个图像 34 xff0c 最后准确地说出你要找的东西 当你的描述性更强时 xf
  • 空间权重矩阵

    空间权重矩阵 前言一 空间权重矩阵是什么 xff1f 二 构建模型1 方法1 基于邻接关系构建2 基于距离构建3 复合型 三 总结 前言 随着学习的深入 xff0c 特别是在做空间统计分析的时候 xff0c 空间权重矩阵越来越频繁的出现在我
  • 时间序列模型——AR、MA、ARMA、ARIMA

    这里写目录标题 时间序列模型自回归模型差分与非平稳序列差分检验不平稳 移动平均模型移动平均法MA模型 ARMA模型ARIMA建模方法 时间序列模型 常用的时间序列模型有四种 xff1a 自回归模型 AR p 移动平均模型 MA q 自回归移
  • spring ioc容器中某个Class的bean对象是否只有一个,是否就是单例的[spring总结]

    package com xxx product web 64 program product 64 description 64 create 2021 05 12 17 28 public interface OrderService b
  • 记ftpClient.storeFile(name,inputStream)被挂起,一直没有回复226 transfer complete造成阻塞

    最近现场一个问题折磨了我好久 xff0c 问题是这样的 程序使用异步线程从装置上取文件 xff0c 通过http连接从设备上读取流之后保存到ftp服务器上 xff0c 开始都是正常的 xff0c 过了半个多小时线程会堵塞 xff0c 导致所
  • FtpClient.storeFile()函数总是返回false

    今天我在使用FTP上传图片到服务器时 xff0c 使用函数FtpClient storeFile filename inputFile 函数上传 我发现返回值总是false 但是明明图片已经上传成功 后来查阅资料在这之前加上一句话就好了 x

随机推荐

  • Mac 上实现便捷 Python 多版本共存和轻松切换

    1 安装Homebrew span class hljs operator style margin 0px padding 0px span span class hljs string style margin 0px padding
  • RHEL下修改VNC的分辨率

    在使用LINUX下的CAE设计软件时 xff0c 由于系统自带的VNC默认分辨绿为1024 768 xff0c 导致部分地区无法显示 经试验 xff0c 修改如下内容可以调整分辨率 xff1a 1 which vncserver 得到VNC
  • Docker与虚拟机的简介以及比较

    Docker与虚拟机 注意 本人的博客都迁移到本人自己搭建的博客地址 xff0c 通过此处可查看 Docker 什么是Docker Docker是一个集开发 打包 运行应用于一体的开放式平台 Docker可以用来快速交付应用 使用Docke
  • 教你如何拥有好看的CMD界面 如何美化Windows Terminal

    安装Windows Terminal 在Mircosoft Store可以安装 只有6M PowerShell 必备条件 使用 PowerShell xff0c 安装 Posh Git 和 Oh My Posh xff1a Install
  • CentOS 中 VNCServer 安装使用

    xfeff xfeff 参考 xff1a 1 http wiki centos org HowTos VNC Server 2 http www2 starcat ne jp kanocl shumi vnc htm 分割线 在centos
  • 程序员之歌:我是一个程序员

    工作一天 xff0c 来一起唱首歌缓解疲劳吧猿媛们
  • 如何准备校招技术面试+一只小菜鸟的面试之路

    校 招一路走来很幸运 xff0c 从最初的迷茫 xff0c 到偶尔的被否认 xff0c 然后慢慢调整心态 xff0c 有缺憾才能有进步 xff0c 正视的自己不足 xff0c 静下心努力提高 xff0c 勇敢尝试各种面试机会 xff0c 因
  • 9 个很酷的 CMD 命令

    开发者 xff08 KaiFaX xff09 面向全栈工程师的开发者 专注于前端 Java Python Go PHP的技术社区 大家好 xff0c 我是若飞 今天给大家推荐几个很酷的CMD命令 使用得当 xff0c 可以让你事半功倍 ip
  • MariaDB INSERT INTO SELECT 报错

    文章目录 1 错误描述2 原因3 例子参考文献 1 错误描述 MariaDB 10 5 9 在使用 INSERT INTO SELECT 时会报错 xff0c 错误如下 xff1a ERROR 1064 42000 You have an
  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • XD基础操作演示

    基础操作演示 1 启动页面 xff0c 页面上展示了几种画板类型 xff0c 根据项目类型选择相应的画板 xff0c 或者自定义画板大小 在XD中是使用一倍图进行设计 xff0c 由于XD是矢量设计软件 xff0c 所以导出 64 2x 6
  • SQL中的注释语句(三种注释)

    一 单行注释 采用 34 34 双减号 进行单行注释 xff0c 注意 xff1a 34 34 与注释内容要用空格隔开才会生效 二 多行注释 采用 进行多行注释 三 xff0c xff08 单行 xff09 注释 在mysql数据库中就可使
  • Python内置库——http.client源码刨析

    看过了http client的文档 xff0c 趁热打铁 xff0c 今天继续研究一下http client的源码 xff08 一 xff09 你会怎么实现 开始之前先让我们回忆一下一个HTTP调用的完整流程 xff1a 看到这张图 xff
  • 端到端 个人理解

    什么是端到端 端到端是根据客户端提出的需求端 xff0c 到满足客户需求端的一个过程 xff0c 这个过程叫做端到端服务 举个栗子 xff1a 客户可以看做市场 xff0c 客户提出的需求可以看做输入端 xff0c 而我们满足客户需求的结果
  • @PathVariable注解的作用

    1 64 PathVariable注解的作用 在SpringMVC中可以使用占位符进行参数绑定 xff0c 地址 list 1 3可以写成 list page limit xff0c 占位符 page 和 limit 对应的值就是1和3 在
  • ssm配置

    web xml lt context param gt lt param name gt log4jConfigLocation lt param name gt lt param value gt classpath log4j prop
  • Ubuntu16.04安装hexo

    在Ubuntu16 04中安装hexo出现一系列的问题 xff0c 总结一下安装hexo的步骤 首先安装noejs xff0c Ubuntu源中的nodejs时旧版本 xff0c 所以需要在安装后更新nodejs span class hl
  • Power Manager之DisplayPowerState.PhotonicModulator

    Android4 4 DisplayPowerState java PhotonicModulator PhotonicModulator是DisplayPowerState的内部类 xff0c private final class xf
  • AB升级之odex文件首次开机处理

    开启AB升级方案的项目 xff0c 因为很多需要升级的镜像都有两份 xff0c 所以存储空间比较浪费 为缓解此问题 xff0c 有个针对odex的优化方案 编译版本会生成两个system镜像 xff1a system img和system
  • 使用PyQt5/PySide2编写一个极简的音乐播放器

    文章目录 一 创建UI界面二 获取网络歌曲三 创建和链接信号槽 疫情肆虐 xff0c 憋在家实在无聊 xff0c 索性写点东西 xff0c 于是就有了这个极极极极极简的音乐播放器 这个极极极简的音乐播放器类似于 阅后即焚 的软件 xff0c