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多线程经典问题之乘客做公交车算法实例
Mar 22 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
Nov 07 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
信号生成及DFT的python实现方式
Feb 25 Python
python 安装移动复制第三方库操作
Jul 13 Python
Python configparser模块封装及构造配置文件
Aug 07 Python
virtualenv隔离Python环境的问题解析
Jun 21 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 empty() 检查一个变量是否为空
2011/11/10 PHP
php随机输出名人名言的代码
2012/10/07 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
javascript iframe编程相关代码
2009/12/28 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python 文本文件内容批量抽取实例
2018/12/10 Python
python命令行参数用法实例分析
2019/06/25 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
python 字典的打印实现
2019/09/26 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Omio俄罗斯:一次搜索公共汽车、火车和飞机的机票
2018/11/17 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
诚信考试倡议书
2014/04/15 职场文书
驾驶员培训方案
2014/05/01 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
黄山导游词
2015/01/31 职场文书
前台岗位职责
2015/02/13 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
Java版 简易五子棋小游戏
2022/05/04 Java/Android