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 open()文件处理使用介绍
Nov 30 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
Python实现一个简单的验证码程序
Nov 03 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python 获取当天每个准点时间戳的实例
May 22 Python
Python当中的array数组对象实例详解
Jun 12 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
Python实战之OpenCV实现猫脸检测
Jun 26 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数组交集的优化代码分析
2011/03/06 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
asp批量修改记录的代码
2008/06/25 Javascript
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
Python算法应用实战之栈详解
2017/02/04 Python
Python 操作MySQL详解及实例
2017/04/30 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
Java servlet面试题
2012/03/04 面试题
公司门卫岗位职责
2014/03/15 职场文书
法制宣传标语集锦
2014/06/25 职场文书
三峡大坝导游词
2015/01/31 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
银行求职信怎么写
2019/06/20 职场文书
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
python开发人人对战的五子棋小游戏
2022/05/02 Python
Tomcat弱口令复现及利用
2022/05/06 Servers
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android