成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一起用python做個(gè)炫酷音樂(lè)播放器,想聽(tīng)啥隨便搜!【V2.0升級(jí)版,含源碼及打包exe】

leap_frog / 2065人閱讀

摘要:自制一款炫酷音樂(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打包程序。

一、核心功能設(shè)計(jì)

在之前的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è)核心功能:

  • 對(duì)UI排版布局增加子列表頁(yè)面,主要包括最近播放、喜愛(ài)的歌、歌詞顯示、本地音樂(lè)播放4個(gè)子列表頁(yè)面
  • 音樂(lè)本地下載及添加我喜愛(ài)的歌曲功能
  • 我喜愛(ài)的歌內(nèi)容保存及初始化讀取我喜愛(ài)的歌列表顯示,喜愛(ài)歌曲列表播放功能
  • 當(dāng)前播放歌曲歌詞讀取顯示功能
  • 讀取播放本地歌曲功能

二、實(shí)現(xiàn)步驟

1. UI排版布局

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)效果如下:

2. 音樂(lè)本地下載及添加我喜愛(ài)的歌曲

我們根據(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è)面下,如下圖所示。

3. 喜愛(ài)的歌初始化讀取顯示及列表播放

對(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

相關(guān)文章

  • 首次公開(kāi),整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0
  • 一起Python做個(gè)上課點(diǎn)名器,好玩又實(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ò)程。 ...

    phpmatt 評(píng)論0 收藏0
  • React實(shí)現(xiàn)H5在線音樂(lè)放器

    摘要:,在聽(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è)搜索的...

    whatsns 評(píng)論0 收藏0
  • 「碼個(gè)蛋」2017年200篇精選干貨集合

    摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過(guò)去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...

    wangtdgoodluck 評(píng)論0 收藏0
  • 推薦一個(gè)高大上的網(wǎng)易云音樂(lè)命令行播放工具:musicbox

    摘要:網(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地址...

    PAMPANG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<