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 enumerate遍历数组示例应用
Sep 06 Python
python动态监控日志内容的示例
Feb 16 Python
在python中的socket模块使用代理实例
May 29 Python
python套接字流重定向实例汇总
Mar 03 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
python对象转字典的两种实现方式示例
Nov 07 Python
解决Numpy中sum函数求和结果维度的问题
Dec 06 Python
python烟花效果的代码实例
Feb 25 Python
Python基于traceback模块获取异常信息
Jul 23 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
解析crontab php自动运行的方法
2013/06/24 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
vue拖拽组件使用方法详解
2018/12/01 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
利用python 读写csv文件
2020/09/10 Python
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
大学生求职自荐信
2013/12/12 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
捐助感谢信
2015/01/22 职场文书
兵马俑导游词
2015/02/02 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
教你使用TensorFlow2识别验证码
2021/06/11 Python
python not运算符的实例用法
2021/06/30 Python
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技