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


Posted in Python onFebruary 07, 2020

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

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

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

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

一、创建UI界面

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

  1. 左上角的程序关闭按钮;
  2. 左侧的播放状态标签;
  3. 顶部的slogan;
  4. 播放/暂停按钮;
  5. 下一首按钮;
  6. 播放进度条;

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

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()方法设置各个控件的样式,最终得到下面的界面:

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

顶部的边框有点丑丑的,我们通过setWindowFlag()将其隐藏起来:

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

这样,完整且好看的界面就完成了,如下图所示:

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

二、获取网络歌曲

既然是音乐播放器,当然要能够播放音乐。我们创建的这个音乐播放器不能添加本地的音乐,那就只能播放网络的音乐了。州的先生(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包装起来,作为一个异步的子线程调用:

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

有了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:

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

这个方法,接受一个MP3音乐的网络地址参数,然后通过配置,对其进行播放。

我们之前创建了一个继承于QThread的网络歌曲获取类GetMusicThread,通过创建另一个方法对其进行调用,并将完成信号(finished_signal)连接到init_player()方法即可实现网络歌曲的获取和播放:

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

在这里,next_music()方法调用GetMusicThread随机获取一首歌曲,然后将歌曲的URL地址返回给init_player()方法,以实现播放。

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

播放音乐按钮需要控制和判断音乐的状态,可通过QMediaPlayer的mediaStatus()方法获取,并以此来进行判断:

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

为了能够在播放完一首歌曲后自动获取和播放下一首歌曲,我们需要创建一个计时器,每隔一秒获取当前播放器的状态,判断其是否已经播放完了音乐,如果播放完了,就调用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()

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

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

完整的代码可以前往州的先生在Gitee上的仓库(https://gitee.com/zmister/yunyan_music )

总结

以上所述是小编给大家介绍的使用PyQt5/PySide2编写一个极简的音乐播放器功能,希望对大家有所帮助!

Python 相关文章推荐
Python批量重命名同一文件夹下文件的方法
May 25 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 Python
Python中的sort()方法使用基础教程
Jan 08 Python
python虚拟环境virtualenv的安装与使用
Sep 21 Python
Python3实现的画图及加载图片动画效果示例
Jan 19 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Python爬虫使用脚本登录Github并查看信息
Jul 16 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
python 爬虫如何正确的使用cookie
Oct 27 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 #Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 #Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 #Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 #Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 #Python
详解python itertools功能
Feb 07 #Python
Python中itertools的用法详解
Feb 07 #Python
You might like
php输出全球各个时区列表的方法
2015/03/31 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
2016/07/26 NodeJs
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
vue结合axios与后端进行ajax交互的方法
2018/07/06 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python 文件和路径操作函数小结
2009/11/23 Python
django 常用orm操作详解
2017/09/13 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
keras多显卡训练方式
2020/06/10 Python
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
个人查摆问题及整改措施
2014/10/16 职场文书
运动与健康自我评价
2015/03/09 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers