摘要:自制一款炫酷音樂(lè)播放器,想聽(tīng)啥隨便搜下面我們就介紹這個(gè)音樂(lè)播放器版本新加的部分功能制作過(guò)程。直接跳到文末獲取源碼及打包程序。雙擊列表頁(yè)面中某一首歌曲,即可實(shí)現(xiàn)音樂(lè)播放功能。
前段時(shí)間寫的Python自制一款炫酷音樂(lè)播放器,有不少小伙伴私信我,對(duì)播放器提了不少改進(jìn)建議,讓我完善播放器的功能。今天音樂(lè)播放器2.0版本完成了,大家一起來(lái)看看是如何用python自制一款炫酷的音樂(lè)播放器的吧~
首先我們還是一起來(lái)看看實(shí)現(xiàn)的音樂(lè)播放器最終效果如何:
由于之前已經(jīng)介紹過(guò)了音樂(lè)播放器V1.0版本的大致功能,如果有不了解的小伙伴可以先去看看V1.0版本的音樂(lè)播放器大致介紹?!?a >python自制一款炫酷音樂(lè)播放器,想聽(tīng)啥隨便搜!】下面我們就介紹這個(gè)音樂(lè)播放器V2.0版本新加的部分功能制作過(guò)程。
直接跳到文末獲取源碼及exe打包程序。
在之前的V1.0版本中,我們已經(jīng)完成了播放器UI界面的設(shè)計(jì),對(duì)播放器的畫面布局進(jìn)行排版設(shè)計(jì);其次音樂(lè)播放器的最重要的核心功能根據(jù)關(guān)鍵字搜索自動(dòng)爬取音樂(lè)并且進(jìn)行音樂(lè)播放已經(jīng)完成了。當(dāng)然也完成了一些播放器常見(jiàn)的附加功能,如播放方式列表循環(huán)、單曲循環(huán)、隨機(jī)播放;當(dāng)前上一首下一首播放;播放暫停開(kāi)始;音量增加減少等。
V2.0版本中,我們主要增加了以下幾個(gè)核心功能:
V1.0版本中,我們已經(jīng)對(duì)排版布局進(jìn)行了初步設(shè)計(jì)。頭部主要包括關(guān)鍵字搜索和音樂(lè)來(lái)源選擇,以及窗體最小化,最大化,關(guān)閉功能;底部主要來(lái)顯示當(dāng)前播放音樂(lè),播放進(jìn)度條,音量控制,上一首/下一首,暫停/開(kāi)始,播放方式等附加功能;中間主體包含左右兩側(cè),左側(cè)用來(lái)顯示播放音樂(lè)封面圖,右側(cè)用來(lái)進(jìn)行音樂(lè)列表顯示。
V2.0版本中我們將新增的幾個(gè)子列表頁(yè)面放在界面中間主體右側(cè),疊加在音樂(lè)搜索顯示列表頁(yè)。這里我們使用的還是pyqt5。添加子列表頁(yè)面核心設(shè)計(jì)代碼如下:
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右側(cè)部件在第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) # 左側(cè)部件在第0行第0列,占1行3列 self.down_layout.addWidget(self.label, 1, 0, 1, 1) self.setCentralWidget(self.main_widget) # 設(shè)置窗口主部件 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, " 搜索頁(yè) ") 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, " 喜愛(ài)的歌 ") 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界面布局實(shí)現(xiàn)效果如下:
我們根據(jù)V1.0版本完成的,輸入的關(guān)鍵字和選擇音樂(lè)來(lái)源進(jìn)行音樂(lè)爬取,通過(guò)多線程,將歌曲、歌手、歌曲url地址全都獲取;并將這些爬取的音樂(lè)數(shù)據(jù)列表顯示到搜索頁(yè)面中。雙擊列表頁(yè)面中某一首歌曲,即可實(shí)現(xiàn)音樂(lè)播放功能。
V2.0版本中,我們添加了對(duì)當(dāng)前播放音樂(lè)的本地下載、搜索頁(yè)音樂(lè)列表一鍵下載、喜愛(ài)的歌列表一鍵下載、添加我喜愛(ài)的歌曲功能。
音樂(lè)下載:
對(duì)于音樂(lè)下載,我們可以進(jìn)行當(dāng)前播放音樂(lè)下載、搜索頁(yè)音樂(lè)列表一鍵下載、喜愛(ài)的歌一鍵下載。如下圖所示:
核心代碼如下:
# 當(dāng)前播放音樂(lè)下載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))# 下載所有音樂(lè)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("默認(rèn)圖片下載錯(cuò)誤") pass# 下載搜索頁(yè)列表所有音樂(lè)def downloadalls(self): self.downloadall("boing")# 下載喜愛(ài)的歌列表所有音樂(lè)def downloadalllove(self): self.downloadall("love")
添加喜愛(ài)的歌:
對(duì)于添加喜愛(ài)的歌曲,我們可以通過(guò)當(dāng)前播放音樂(lè)的?標(biāo)志,也可以通過(guò)右鍵音樂(lè)列表進(jìn)行喜愛(ài)的歌曲添加。核心代碼如下:
# 通過(guò)點(diǎn)擊?標(biāo)志,對(duì)當(dāng)前播放音樂(lè)添加喜愛(ài)的歌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# 通過(guò)右鍵音樂(lè)列表進(jìn)行喜愛(ài)的歌曲添加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)
這樣我們就可以把歌曲添加到喜愛(ài)的歌子列表頁(yè)面下,如下圖所示。
對(duì)于添加到喜愛(ài)的歌曲列表,我們需要在退出音樂(lè)播放器程序時(shí),將這些數(shù)據(jù)保存到本地文件,方便后面重新運(yùn)行時(shí)初始化讀取顯示列表。
喜愛(ài)歌曲本地保存:
我們可以把喜愛(ài)的歌曲列表、喜愛(ài)歌曲圖片、歌曲url鏈接、歌詞等數(shù)據(jù)保存到本地。核心代碼如下:
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("刪除錯(cuò)誤類型是", e.__class__.__name__) print("刪除錯(cuò)誤明細(xì)是", 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"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121158.html
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:今天就繼續(xù)給大家分享一個(gè)讀者粉絲投稿的,關(guān)于上課點(diǎn)名的實(shí)戰(zhàn)案例,一起來(lái)看看是如何實(shí)現(xiàn)的吧首先我們還是一起先來(lái)看看點(diǎn)名器實(shí)現(xiàn)的效果下面,我們開(kāi)始介紹這款點(diǎn)名器的制作過(guò)程。 ...
摘要:,在聽(tīng)音樂(lè)的時(shí)候忽然想聽(tīng)騰格爾的鋼鐵之翼隱形的翅膀,在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個(gè),音樂(lè)搜索的功能,把所有想聽(tīng)的歌,能夠一次性在酷狗網(wǎng)易云蝦米等平臺(tái)上找找完。本項(xiàng)目非常適合新手練習(xí)熟悉全家桶,歡迎哦。 React-music React Music WebApp,在聽(tīng)音樂(lè)的時(shí)候忽然想聽(tīng)騰格爾的鋼鐵之翼(隱形的翅膀),在網(wǎng)易云上卻找不到,就很氣。于是想到了做一個(gè),音樂(lè)搜索的...
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
摘要:網(wǎng)易云音樂(lè)上有很多適合程序猿的歌單,但是今天文章介紹的不是這些適合程序員工作時(shí)聽(tīng)的歌,而是一個(gè)用開(kāi)發(fā)的開(kāi)源播放器,專門適用于網(wǎng)易云音樂(lè)的播放。 網(wǎng)易云音樂(lè)上有很多適合程序猿的歌單,但是今天文章介紹的不是這些適合程序員工作時(shí)聽(tīng)的歌,而是一個(gè)用Python開(kāi)發(fā)的開(kāi)源播放器,專門適用于網(wǎng)易云音樂(lè)的播放。這個(gè)播放器的名稱為MusicBox, 特色是用命令行版本執(zhí)行音樂(lè)的播放。 github地址...
閱讀 2951·2023-04-25 19:20
閱讀 814·2021-11-24 09:38
閱讀 2066·2021-09-26 09:55
閱讀 2442·2021-09-02 15:11
閱讀 2075·2019-08-30 15:55
閱讀 3620·2019-08-30 15:54
閱讀 3158·2019-08-30 14:03
閱讀 2972·2019-08-29 17:11