这篇文章将为大家详细讲解有关Python如何使用PyQt5/PySide2编写一个极简的音乐播放器功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
首先,我们来创建这个播放器的UI界面。这个播放器一共有6个控件:
左上角的程序关闭按钮;
左侧的播放状态标签;
顶部的slogan;
播放/暂停按钮;
下一首按钮;
播放进度条;
基于以上控件,我们用一个网格布局来排列;
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()方法设置各个控件的样式,最终得到下面的界面:
顶部的边框有点丑丑的,我们通过setWindowFlag()将其隐藏起来:
self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框
这样,完整且好看的界面就完成了,如下图所示:
既然是音乐播放器,当然要能够播放音乐。我们创建的这个音乐播放器不能添加本地的音乐,那就只能播放网络的音乐了。州的先生(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包装起来,作为一个异步的子线程调用:
有了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:
这个方法,接受一个MP3音乐的网络地址参数,然后通过配置,对其进行播放。
我们之前创建了一个继承于QThread的网络歌曲获取类GetMusicThread,通过创建另一个方法对其进行调用,并将完成信号(finished_signal)连接到init_player()方法即可实现网络歌曲的获取和播放:
在这里,next_music()方法调用GetMusicThread随机获取一首歌曲,然后将歌曲的URL地址返回给init_player()方法,以实现播放。
next_music()方法是播放歌曲的主要方法,播放按钮、下一首按钮、一首歌曲播放完之后自动播放下一首歌曲都可以调用它。
播放音乐按钮需要控制和判断音乐的状态,可通过QMediaPlayer的mediaStatus()方法获取,并以此来进行判断:
为了能够在播放完一首歌曲后自动获取和播放下一首歌曲,我们需要创建一个计时器,每隔一秒获取当前播放器的状态,判断其是否已经播放完了音乐,如果播放完了,就调用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编写一个极简的音乐播放器功能”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。