摘要:自制一款炫酷音乐播放器,想听啥随便搜下面我们就介绍这个音乐播放器版本新加的部分功能制作过程。直接跳到文末获取源码及打包程序。双击列表页面中某一首歌曲,即可实现音乐播放功能。
前段时间写的Python自制一款炫酷音乐播放器,有不少小伙伴私信我,对播放器提了不少改进建议,让我完善播放器的功能。今天音乐播放器2.0版本完成了,大家一起来看看是如何用python自制一款炫酷的音乐播放器的吧~
首先我们还是一起来看看实现的音乐播放器最终效果如何:
由于之前已经介绍过了音乐播放器V1.0版本的大致功能,如果有不了解的小伙伴可以先去看看V1.0版本的音乐播放器大致介绍。【python自制一款炫酷音乐播放器,想听啥随便搜!】下面我们就介绍这个音乐播放器V2.0版本新加的部分功能制作过程。
直接跳到文末获取源码及exe打包程序。
在之前的V1.0版本中,我们已经完成了播放器UI界面的设计,对播放器的画面布局进行排版设计;其次音乐播放器的最重要的核心功能根据关键字搜索自动爬取音乐并且进行音乐播放已经完成了。当然也完成了一些播放器常见的附加功能,如播放方式列表循环、单曲循环、随机播放;当前上一首下一首播放;播放暂停开始;音量增加减少等。
V2.0版本中,我们主要增加了以下几个核心功能:
V1.0版本中,我们已经对排版布局进行了初步设计。头部主要包括关键字搜索和音乐来源选择,以及窗体最小化,最大化,关闭功能;底部主要来显示当前播放音乐,播放进度条,音量控制,上一首/下一首,暂停/开始,播放方式等附加功能;中间主体包含左右两侧,左侧用来显示播放音乐封面图,右侧用来进行音乐列表显示。
V2.0版本中我们将新增的几个子列表页面放在界面中间主体右侧,叠加在音乐搜索显示列表页。这里我们使用的还是pyqt5。添加子列表页面核心设计代码如下:
def init_ui(self): self.main_layout.addWidget(self.up_widget, 0, 0, 1, 110) self.main_layout.addWidget(self.left_widget, 1, 0, 90, 20) self.main_layout.addWidget(self.right_widget, 1, 20, 90, 90) # 22右侧部件在第0行第3列,占8行9列 self.main_layout.addWidget(self.down_widget, 100, 0, 10, 110) self.main_layout.addWidget(self.close_widget, 0, 105, 1, 5) # 左侧部件在第0行第0列,占1行3列 self.down_layout.addWidget(self.label, 1, 0, 1, 1) self.setCentralWidget(self.main_widget) # 设置窗口主部件 self.tabWidget = QTabWidget(self) self.tabWidget.setGeometry(QRect(33, 20, 716, 471)) self.tab = QWidget() self.tab.setObjectName("tab") self.tab_layout = QGridLayout() self.tab.setLayout(self.tab_layout) self.listwidget = QListWidget(self.tab) self.label361 = QLabel(self) self.label361.setText("") self.label361.setStyleSheet("color:#6DDF6D") self.tab_layout.addWidget(self.label361, 0, 1, 1, 1) self.button_1235 = QPushButton(icon("fa.download", color="#D0D0D0", font=24), "下载全部") self.button_1235.clicked.connect(self.downloadalls) self.button_1235.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab_layout.addWidget(self.button_1235, 0, 2, 1, 1) self.button_1236 = QPushButton(icon("fa.trash-o", color="#D0D0D0", font=24), "清空列表") self.button_1236.clicked.connect(self.dell) self.button_1236.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab_layout.addWidget(self.button_1236, 0, 3, 1, 1) self.listwidget.doubleClicked.connect(lambda: self.change_func(self.listwidget)) self.listwidget.setContextMenuPolicy(Qt.CustomContextMenu) self.listwidget.customContextMenuRequested[QPoint].connect(self.myListWidgetContext) self.listwidget.setStyleSheet(self.css) self.listwidget.setObjectName("listWidget") self.tab_layout.addWidget(self.listwidget, 1, 0, 1, 4) self.tabWidget.addTab(self.tab, " 搜索页 ") self.tab2 = QWidget() self.tab2.setObjectName("tab") self.tab2_layout = QGridLayout() self.tab2.setLayout(self.tab2_layout) self.listwidget2 = QListWidget(self.tab2) self.listwidget2.doubleClicked.connect(lambda: self.change_funcse(self.listwidget2)) self.listwidget2.setContextMenuPolicy(Qt.CustomContextMenu) self.listwidget2.customContextMenuRequested[QPoint].connect(self.myListWidgetContext2) self.listwidget2.setStyleSheet(self.css) self.listwidget2.setObjectName("listWidget2") self.listwidget2.setContextMenuPolicy(3) self.tab2_layout.addWidget(self.listwidget2, 0, 0, 1, 1) self.tabWidget.addTab(self.tab2, " 最近播放 ") self.tab3 = QWidget() self.tab3.setObjectName("tab") self.tab3_layout = QGridLayout() self.tab3.setLayout(self.tab3_layout) self.label223 = QLabel(self) # self.label5.setScaledContents(True) pix_img = QPixmap(str(data + "/backdown.png")) pix = pix_img.scaled(100, 100, Qt.KeepAspectRatio) self.label223.setPixmap(pix) # self.label5.setMaximumSize(1,1) self.tab3_layout.addWidget(self.label223, 0, 0, 1, 1) self.button_1237 = QPushButton(icon("fa.play", color="#FFFFFF", font=24), "播放全部") self.button_1237.clicked.connect(self.allplaylove) self.button_1237.setStyleSheet( """QPushButton{background:#EC4141;border-radius:5px;}QPushButton:hover{background:#E92121;}""") self.tab3_layout.addWidget(self.button_1237, 0, 1, 1, 1) self.button_1235 = QPushButton(icon("fa.download", color="#D0D0D0", font=24), "下载全部") self.button_1235.clicked.connect(self.downloadalllove) self.button_1235.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab3_layout.addWidget(self.button_1235, 0, 2, 1, 1) self.button_1236 = QPushButton(icon("fa.trash-o", color="#D0D0D0", font=24), "清空列表") self.button_1236.clicked.connect(self.delove) self.button_1236.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab3_layout.addWidget(self.button_1236, 0, 3, 1, 1) self.listwidget3 = QListWidget(self.tab3) self.listwidget3.doubleClicked.connect(lambda: self.change_funclove(self.listwidget3)) self.listwidget3.setContextMenuPolicy(Qt.CustomContextMenu) self.listwidget3.customContextMenuRequested[QPoint].connect(self.myListWidgetContext3) self.listwidget3.setStyleSheet(self.css) self.listwidget3.setObjectName("listWidget3") self.tab3_layout.addWidget(self.listwidget3, 1, 0, 1, 4) self.tabWidget.addTab(self.tab3, " 喜爱的歌 ") self.tab4 = QWidget() self.tab4.setObjectName("tab") self.tab4_layout = QGridLayout() self.tab4.setLayout(self.tab4_layout) self.listwidget4 = QListWidget(self.tab4) # self.listwidget4.doubleClicked.connect(lambda: self.change_func(self.listwidget)) self.listwidget4.setStyleSheet(self.css) self.listwidget4.setObjectName("listWidget4") self.tab4_layout.addWidget(self.listwidget4, 0, 0, 1, 1) self.tabWidget.addTab(self.tab4, " 歌词 ") self.tab5 = QWidget() self.tab5.setObjectName("tab5") self.tab5_layout = QGridLayout() self.tab5.setLayout(self.tab5_layout) self.listwidget5 = QListWidget(self.tab5) self.listwidget5.doubleClicked.connect(lambda: self.change(self.listwidget5)) self.listwidget5.setContextMenuPolicy(Qt.CustomContextMenu) self.listwidget5.customContextMenuRequested[QPoint].connect(self.myListWidgetContext5) self.button_12351 = QPushButton(icon("fa.download", color="#D0D0D0", font=24), "添加目录") self.button_12351.clicked.connect(self.add) self.button_12351.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab5_layout.addWidget(self.button_12351, 0, 2, 1, 1) self.button_12361 = QPushButton(icon("fa.trash-o", color="#D0D0D0", font=24), "清空列表") self.button_12361.clicked.connect(self.dellocal) self.button_12361.setStyleSheet( """QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#303030;}""") self.tab5_layout.addWidget(self.button_12361, 0, 3, 1, 1) self.listwidget5.setStyleSheet(self.css) self.listwidget5.setObjectName("listWidget5") self.tab5_layout.addWidget(self.listwidget5, 1, 0, 1, 4) self.tabWidget.addTab(self.tab5, " 本地歌曲 ") self.right_layout.addWidget(self.tabWidget, 3, 0, 100, 90)
UI界面布局实现效果如下:
我们根据V1.0版本完成的,输入的关键字和选择音乐来源进行音乐爬取,通过多线程,将歌曲、歌手、歌曲url地址全都获取;并将这些爬取的音乐数据列表显示到搜索页面中。双击列表页面中某一首歌曲,即可实现音乐播放功能。
V2.0版本中,我们添加了对当前播放音乐的本地下载、搜索页音乐列表一键下载、喜爱的歌列表一键下载、添加我喜爱的歌曲功能。
音乐下载:
对于音乐下载,我们可以进行当前播放音乐下载、搜索页音乐列表一键下载、喜爱的歌一键下载。如下图所示:
核心代码如下:
# 当前播放音乐下载def down(self): if bo == "local": downpath = str(filew) downpath = downpath.replace("/", "//") downpath = downpath + SongName[num] print(downpath) print("explorer /select,{}".format(downpath)) call("explorer /select,{}".format(downpath)) else: call("explorer /select,{}".format(to))# 下载所有音乐def downloadall(self, typer): try: global typerr typerr = typer print(typer) print(typerr) self.work = downall() self.work.start() self.work.trigger.connect(self.disdownall) except: print("默认图片下载错误") pass# 下载搜索页列表所有音乐def downloadalls(self): self.downloadall("boing")# 下载喜爱的歌列表所有音乐def downloadalllove(self): self.downloadall("love")
添加喜爱的歌:
对于添加喜爱的歌曲,我们可以通过当前播放音乐的❤标志,也可以通过右键音乐列表进行喜爱的歌曲添加。核心代码如下:
# 通过点击❤标志,对当前播放音乐添加喜爱的歌def lovesong(self): if bo == "boing" or bo == "boed": try: global loves global loveurls global lovepics global lovelrc if bo == "boing": loves.append(songs[num]) loveurls.append(urls[num]) lovepics.append(pic[num]) lovelrc.append(lrcs[num]) elif bo == "boed": loves.append(songed[num]) loveurls.append(urled[num]) lovepics.append(picd[num]) lovelrc.append(lrcd[num]) else: pass except: pass self.work = firstThread() self.work.start() self.work.trigger.connect(self.dispng) r = 0 self.listwidget3.clear() for i in loves: self.listwidget3.addItem(i) self.listwidget3.item(r).setForeground(Qt.white) r = r + 1 print(loves) else: pass# 通过右键音乐列表进行喜爱的歌曲添加def addItem(self): try: global loves global loveurls global lovepics global lovelrc if list_confident == "boing": loves.append(songs[num_m]) loveurls.append(urls[num_m]) lovepics.append(pic[num_m]) lovelrc.append(lrcs[num_m]) else: loves.append(songed[num_m]) loveurls.append(urled[num_m]) lovepics.append(picd[num_m]) lovelrc.append(lrcd[num_m]) self.work = firstThread() self.work.start() self.work.trigger.connect(self.dispng) except: pass r = 0 self.listwidget3.clear() for i in loves: self.listwidget3.addItem(i) self.listwidget3.item(r).setForeground(Qt.white) r = r + 1 print("done") print(loves)
这样我们就可以把歌曲添加到喜爱的歌子列表页面下,如下图所示。
对于添加到喜爱的歌曲列表,我们需要在退出音乐播放器程序时,将这些数据保存到本地文件,方便后面重新运行时初始化读取显示列表。
喜爱歌曲本地保存:
我们可以把喜爱的歌曲列表、喜爱歌曲图片、歌曲url链接、歌词等数据保存到本地。核心代码如下:
def close(self): reply = QMessageBox.question(self, u"警告", u"确定退出?", QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: close = True try: mixer.music.stop() except: pass try: rmtree(str(data)) except Exception as e: print("删除错误类型是", e.__class__.__name__) print("删除错误明细是", e) filepath = "{}/musicdata".format(apdata) try: mkdir(filepath) except: pass print(filepath) with open(filepath + "/loves", "w", encoding="utf-8") as f: f.truncate(0) print(f.write(str(loves))) with open(filepath + "/lovepics", "w"
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121158.html
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
摘要:今天就继续给大家分享一个读者粉丝投稿的,关于上课点名的实战案例,一起来看看是如何实现的吧首先我们还是一起先来看看点名器实现的效果下面,我们开始介绍这款点名器的制作过程。 ...
摘要:,在听音乐的时候忽然想听腾格尔的钢铁之翼隐形的翅膀,在网易云上却找不到,就很气。于是想到了做一个,音乐搜索的功能,把所有想听的歌,能够一次性在酷狗网易云虾米等平台上找找完。本项目非常适合新手练习熟悉全家桶,欢迎哦。 React-music React Music WebApp,在听音乐的时候忽然想听腾格尔的钢铁之翼(隐形的翅膀),在网易云上却找不到,就很气。于是想到了做一个,音乐搜索的...
摘要:让你收获满满码个蛋从年月日推送第篇文章一年过去了已累积推文近篇文章,本文为年度精选,共计篇,按照类别整理便于读者主题阅读。本篇文章是今年的最后一篇技术文章,为了让大家在家也能好好学习,特此花了几个小时整理了这些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 让你收获满满! 码个蛋从2017年02月20...
摘要:网易云音乐上有很多适合程序猿的歌单,但是今天文章介绍的不是这些适合程序员工作时听的歌,而是一个用开发的开源播放器,专门适用于网易云音乐的播放。 网易云音乐上有很多适合程序猿的歌单,但是今天文章介绍的不是这些适合程序员工作时听的歌,而是一个用Python开发的开源播放器,专门适用于网易云音乐的播放。这个播放器的名称为MusicBox, 特色是用命令行版本执行音乐的播放。 github地址...
阅读 2942·2023-04-25 19:20
阅读 785·2021-11-24 09:38
阅读 2039·2021-09-26 09:55
阅读 2430·2021-09-02 15:11
阅读 2013·2019-08-30 15:55
阅读 3610·2019-08-30 15:54
阅读 3147·2019-08-30 14:03
阅读 2961·2019-08-29 17:11