系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 脚本中心 > 其它 > 详细页面

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

时间:2020-02-07来源:系统城作者:电脑系统城

这篇文章主要介绍了Python中使用PyQt5/PySide2编写一个极简的音乐播放器功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

 

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

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

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

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

一、创建UI界面

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

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

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


 
  1. class Music(QtWidgets.QMainWindow):
  2. def __init__(self):
  3. super().__init__()
  4. self.setFixedSize(400,200)
  5. self.setWindowTitle("州的先生")
  6. self.init_ui()
  7. self.custom_style()
  8. self.playing = False # 播放状态初始化为否
  9. self.player = QMediaPlayer(self)
  10.  
  11. # 设置样式
  12. def custom_style(self):
  13. self.setStyleSheet('''
  14. #main_widget{
  15. border-radius:5px;
  16. }
  17. #play_btn,#pervious_btn,#next_btn{
  18. border:none;
  19. }
  20. #play_btn:hover,#pervious_btn:hover,#next_btn:hover{
  21. background:gray;
  22. border-radius:5px;
  23. cursor:pointer;
  24. }
  25. ''')
  26. self.close_btn.setStyleSheet('''
  27. QPushButton{
  28. background:#F76677;
  29. border-radius:5px;
  30. }
  31. QPushButton:hover{
  32. background:red;
  33. }''')
  34. self.status_label.setStyleSheet('''
  35. QLabel{
  36. background:#F7D674;
  37. border-radius:5px;
  38. }
  39. ''')
  40.  
  41. # 初始化UI界面
  42. def init_ui(self):
  43. # 窗口布局
  44. self.main_widget = QtWidgets.QWidget()
  45. self.main_widget.setObjectName("main_widget")
  46. self.main_layout = QtWidgets.QGridLayout()
  47. self.main_widget.setLayout(self.main_layout)
  48.  
  49. # 标题
  50. self.title_lable = QtWidgets.QLabel("听者,如过眼云烟……")
  51.  
  52. # 关闭按钮
  53. self.close_btn = QtWidgets.QPushButton("") # 关闭按钮
  54. self.close_btn.setFixedSize(15,15)
  55.  
  56. # 音乐状态按钮
  57. self.status_label = QtWidgets.QLabel("")
  58. self.status_label.setFixedSize(15,15)
  59.  
  60. # 播放按钮
  61. play_icon = qta.icon("fa.play-circle",)
  62. self.play_btn = QtWidgets.QPushButton(play_icon,"")
  63. self.play_btn.setIconSize(QtCore.QSize(80, 80))
  64. self.play_btn.setFixedSize(82,82)
  65. self.play_btn.setObjectName("play_btn")
  66.  
  67. # 下一首按钮
  68. next_icon = qta.icon("fa.play-circle-o")
  69. self.next_btn = QtWidgets.QPushButton(next_icon,"")
  70. self.next_btn.setIconSize(QtCore.QSize(80,80))
  71. self.next_btn.setFixedSize(82,82)
  72. self.next_btn.setObjectName("next_btn")
  73.  
  74. # 进度条
  75. self.process_bar = QtWidgets.QProgressBar()
  76. self.process_value = 0
  77. self.process_bar.setValue(self.process_value)
  78. self.process_bar.setFixedHeight(5)
  79. self.process_bar.setTextVisible(False)
  80.  
  81. self.main_layout.addWidget(self.close_btn,0,0,1,1)
  82. self.main_layout.addWidget(self.title_lable,0,1,1,1)
  83. self.main_layout.addWidget(self.status_label,1,0,1,1)
  84. self.main_layout.addWidget(self.play_btn, 1, 1, 1, 1)
  85. self.main_layout.addWidget(self.next_btn, 1, 2, 1, 1)
  86. self.main_layout.addWidget(self.process_bar,2,0,1,3)
  87.  
  88. self.setCentralWidget(self.main_widget)

在上面的代码中,我们通过Qt内置的按钮控件QPushButton、标签控件QLabel、进度条控件QProgressBar等把播放器的基础界面构建好了,然后通过setStyleSheet()方法设置各个控件的样式,最终得到下面的界面:

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

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


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

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

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

二、获取网络歌曲

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


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

我们将其用Qt的线程模块QThread包装起来,作为一个异步的子线程调用:

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

有了UI界面和网络音乐,下面我们UI界面上的控件与音乐的播放通过信号槽(事件响应)连接起来。

三、创建和链接信号槽

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


 
  1. # 关闭程序
  2. def close_btn_event(self):
  3. self.close()
  4. 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()方法:


 
  1. self.timer = QtCore.QTimer()
  2. self.timer.setInterval(1000)
  3. self.timer.start()
  4. self.timer.timeout.connect(self.check_music_status)
  5. def check_music_status(self):
  6. player_status = self.player.mediaStatus()
  7. player_duration = self.player.duration()
  8. # print("音乐时间:",player_duration)
  9. # print("当前播放器状态",player_status)
  10. if player_status == 7:
  11. self.next_music()

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

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

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

总结

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

分享到:

相关信息

  • Go json反序列化“null“的问题解决

    有这么一段代码,可以先看一下有没有什么问题,作用是输入一段json字符串,反序列化成map,然后将另一个inputMap的内容,merge进这个map 1 2 3 4 5 6 7 8 9 10 11 12 13 14...

    2023-03-15

  • Golang 字符串转time类型实现

    由于数据库的类型为Data 类型,所以插入数据库的时候我先把前端传入的string类型的时间转为Time 再插入。 Go 提供了两种插入的方式,即time.Parse 和 time.ParseInLocation 。两种方式,他们的差异比较大。...

    2023-03-09

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载