摘要:自制一款炫酷音樂播放器,想聽啥隨便搜下面我們就介紹這個音樂播放器版本新加的部分功能制作過程。直接跳到文末獲取源碼及打包程序。雙擊列表頁面中某一首歌曲,即可實現音樂播放功能。
前段時間寫的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("/", "http://") 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"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121158.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:今天就繼續給大家分享一個讀者粉絲投稿的,關于上課點名的實戰案例,一起來看看是如何實現的吧首先我們還是一起先來看看點名器實現的效果下面,我們開始介紹這款點名器的制作過程。 ...
摘要:,在聽音樂的時候忽然想聽騰格爾的鋼鐵之翼隱形的翅膀,在網易云上卻找不到,就很氣。于是想到了做一個,音樂搜索的功能,把所有想聽的歌,能夠一次性在酷狗網易云蝦米等平臺上找找完。本項目非常適合新手練習熟悉全家桶,歡迎哦。 React-music React Music WebApp,在聽音樂的時候忽然想聽騰格爾的鋼鐵之翼(隱形的翅膀),在網易云上卻找不到,就很氣。于是想到了做一個,音樂搜索的...
摘要:讓你收獲滿滿碼個蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術文章,為了讓大家在家也能好好學習,特此花了幾個小時整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個蛋從2017年02月20...
摘要:網易云音樂上有很多適合程序猿的歌單,但是今天文章介紹的不是這些適合程序員工作時聽的歌,而是一個用開發的開源播放器,專門適用于網易云音樂的播放。 網易云音樂上有很多適合程序猿的歌單,但是今天文章介紹的不是這些適合程序員工作時聽的歌,而是一個用Python開發的開源播放器,專門適用于網易云音樂的播放。這個播放器的名稱為MusicBox, 特色是用命令行版本執行音樂的播放。 github地址...
閱讀 2943·2023-04-25 19:20
閱讀 786·2021-11-24 09:38
閱讀 2040·2021-09-26 09:55
閱讀 2430·2021-09-02 15:11
閱讀 2015·2019-08-30 15:55
閱讀 3610·2019-08-30 15:54
閱讀 3148·2019-08-30 14:03
閱讀 2962·2019-08-29 17:11