【腳本項目源碼】Python製作多功能音樂播放器,打造專屬你的音樂播放器

来源:https://www.cnblogs.com/guzichuan/archive/2022/12/12/16976634.html
-Advertisement-
Play Games

前言 本文給大家分享的是如何通過利用Python實現多功能音樂播放器,廢話不多直接開整~ 開發工具 Python版本: 3.6 相關模塊: os模塊 sys模塊 time模塊 random模塊 PyQt5模塊 環境搭建 安裝Python並添加到環境變數,pip安裝需要的相關模塊即可。 文中完整源碼, ...


前言

本文給大家分享的是如何通過利用Python實現多功能音樂播放器,廢話不多直接開整~

開發工具

Python版本: 3.6

相關模塊:

os模塊

sys模塊

time模塊

random模塊

PyQt5模塊

環境搭建

安裝Python並添加到環境變數,pip安裝需要的相關模塊即可。

文中完整源碼,評論留言獲取。

代碼實現

初始化

def __initialize(self):
self.setWindowTitle('音樂播放器-Python工程獅')
self.setWindowIcon(QIcon('icon.ico'))
self.songs_list = []
self.song_formats = ['mp3', 'm4a', 'flac', 'wav', 'ogg']
self.settingfilename = 'setting.ini'
self.player = QMediaPlayer()
self.cur_path = os.path.abspath(os.path.dirname(__file__))
self.cur_playing_song = ''
self.is_switching = False
self.is_pause = True
# 界面元素
# --播放時間
self.label1 = QLabel('00:00')
self.label1.setStyle(QStyleFactory.create('Fusion'))
self.label2 = QLabel('00:00')
self.label2.setStyle(QStyleFactory.create('Fusion'))
# --滑動條
self.slider = QSlider(Qt.Horizontal, self)
self.slider.sliderMoved[int].connect(lambda: self.player.setPosition(self.slider.value()))
self.slider.setStyle(QStyleFactory.create('Fusion'))
# --播放按鈕
self.play_button = QPushButton('播放', self)
self.play_button.clicked.connect(self.playMusic)
self.play_button.setStyle(QStyleFactory.create('Fusion'))
# --上一首按鈕
self.preview_button = QPushButton('上一首', self)
self.preview_button.clicked.connect(self.previewMusic)
self.preview_button.setStyle(QStyleFactory.create('Fusion'))
# --下一首按鈕
self.next_button = QPushButton('下一首', self)
self.next_button.clicked.connect(self.nextMusic)
self.next_button.setStyle(QStyleFactory.create('Fusion'))
# --打開文件夾按鈕
self.open_button = QPushButton('打開文件夾', self)
self.open_button.setStyle(QStyleFactory.create('Fusion'))
self.open_button.clicked.connect(self.openDir)
# --顯示音樂列表
self.qlist = QListWidget()
self.qlist.itemDoubleClicked.connect(self.doubleClicked)
self.qlist.setStyle(QStyleFactory.create('windows'))
# --如果有初始化setting, 導入setting
self.loadSetting()
# --播放模式
self.cmb = QComboBox()
self.cmb.setStyle(QStyleFactory.create('Fusion'))
self.cmb.addItem('順序播放')
self.cmb.addItem('單曲迴圈')
self.cmb.addItem('隨機播放')
# --計時器
self.timer = QTimer(self)
self.timer.start(1000)
self.timer.timeout.connect(self.playByMode)
# 界面佈局
self.grid = QGridLayout()
self.setLayout(self.grid)
self.grid.addWidget(self.qlist, 0, 0, 5, 10)
self.grid.addWidget(self.label1, 0, 11, 1, 1)
self.grid.addWidget(self.slider, 0, 12, 1, 1)
self.grid.addWidget(self.label2, 0, 13, 1, 1)
self.grid.addWidget(self.play_button, 0, 14, 1, 1)
self.grid.addWidget(self.next_button, 1, 11, 1, 2)
self.grid.addWidget(self.preview_button, 2, 11, 1, 2)
self.grid.addWidget(self.cmb, 3, 11, 1, 2)
self.grid.addWidget(self.open_button, 4, 11, 1, 2)

根據播放模式播放音樂

def playByMode(self):
if (not self.is_pause) and (not self.is_switching):
self.slider.setMinimum(0)
self.slider.setMaximum(self.player.duration())
self.slider.setValue(self.slider.value() + 1000)
self.label1.setText(time.strftime('%M:%S', time.localtime(self.player.position()/1000)))
self.label2.setText(time.strftime('%M:%S', time.localtime(self.player.duration()/1000)))
# 順序播放
if (self.cmb.currentIndex() == 0) and (not self.is_pause) and (not self.is_switching):
if self.qlist.count() == 0:
return
if self.player.position() == self.player.duration():
self.nextMusic()
# 單曲迴圈
elif (self.cmb.currentIndex() == 1) and (not self.is_pause) and (not self.is_switching):
if self.qlist.count() == 0:
return
if self.player.position() == self.player.duration():
self.is_switching = True
self.setCurPlaying()
self.slider.setValue(0)
self.playMusic()
self.is_switching = False
# 隨機播放
elif (self.cmb.currentIndex() == 2) and (not self.is_pause) and (not self.is_switching):
if self.qlist.count() == 0:
return
if self.player.position() == self.player.duration():
self.is_switching = True
self.qlist.setCurrentRow(random.randint(0, self.qlist.count()-1))
self.setCurPlaying()
self.slider.setValue(0)
self.playMusic()
self.is_switching = False

代碼有點多~~

剩餘代碼

'''打開文件夾'''
def openDir(self):
self.cur_path = QFileDialog.getExistingDirectory(self, "選取文件夾", self.cur_path)
if self.cur_path:
self.showMusicList()
self.cur_playing_song = ''
self.setCurPlaying()
self.label1.setText('00:00')
self.label2.setText('00:00')
self.slider.setSliderPosition(0)
self.is_pause = True
self.play_button.setText('播放')
'''導入setting'''
def loadSetting(self):
if os.path.isfile(self.settingfilename):
config = configparser.ConfigParser()
config.read(self.settingfilename)
self.cur_path = config.get('MusicPlayer', 'PATH')
self.showMusicList()
'''更新setting'''
def updateSetting(self):
config = configparser.ConfigParser()
config.read(self.settingfilename)
if not os.path.isfile(self.settingfilename):
config.add_section('MusicPlayer')
config.set('MusicPlayer', 'PATH', self.cur_path)
config.write(open(self.settingfilename, 'w'))
'''顯示文件夾中所有音樂'''
def showMusicList(self):
self.qlist.clear()
self.updateSetting()
for song in os.listdir(self.cur_path):
if song.split('.')[-1] in self.song_formats:
self.songs_list.append([song, os.path.join(self.cur_path, song).replace('\\', '/')])
self.qlist.addItem(song)
self.qlist.setCurrentRow(0)
if self.songs_list:
self.cur_playing_song = self.songs_list[self.qlist.currentRow()][-1]
'''雙擊播放音樂'''
def doubleClicked(self):
self.slider.setValue(0)
self.is_switching = True
self.setCurPlaying()
self.playMusic()
self.is_switching = False
'''設置當前播放的音樂'''
def setCurPlaying(self):
self.cur_playing_song = self.songs_list[self.qlist.currentRow()][-1]
self.player.setMedia(QMediaContent(QUrl(self.cur_playing_song)))
'''提示'''
def Tips(self, message):
QMessageBox.about(self, "提示", message)
'''播放音樂'''
def playMusic(self):
if self.qlist.count() == 0:
self.Tips('當前路徑內無可播放的音樂文件')
return
if not self.player.isAudioAvailable():
self.setCurPlaying()
if self.is_pause or self.is_switching:
self.player.play()
self.is_pause = False
self.play_button.setText('暫停')
elif (not self.is_pause) and (not self.is_switching):
self.player.pause()
self.is_pause = True
self.play_button.setText('播放')
'''上一首'''
def previewMusic(self):
self.slider.setValue(0)
if self.qlist.count() == 0:
self.Tips('當前路徑內無可播放的音樂文件')
return
pre_row = self.qlist.currentRow()-1 if self.qlist.currentRow() != 0 else self.qlist.count() - 1
self.qlist.setCurrentRow(pre_row)
self.is_switching = True
self.setCurPlaying()
self.playMusic()
self.is_switching = False
'''下一首'''
def nextMusic(self):
self.slider.setValue(0)
if self.qlist.count() == 0:
self.Tips('當前路徑內無可播放的音樂文件')
return
next_row = self.qlist.currentRow()+1 if self.qlist.currentRow() != self.qlist.count()-1 else 0
self.qlist.setCurrentRow(next_row)
self.is_switching = True
self.setCurPlaying()
self.playMusic()
self.is_switching = False


'''run'''
if __name__ == '__main__':
app = QApplication(sys.argv)
gui = musicPlayer()
gui.show()
sys.exit(app.exec_())

結果展示

音樂播放器

最後

今天的分享到這裡就結束了 ,感興趣的朋友也可以去試試哈

對文章有問題的,或者有其他關於python的問題,可以在評論區留言或者私信我哦

覺得我分享的文章不錯的話,可以關註一下我,或者給文章點贊(/≧▽≦)/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好家伙, 1.數組 Array應該就是ECMAScript中最常用的類型了。ECMAScript數組跟其他編程語言的數組有很大區別。 跟其他語言中的數組一樣,ECMAScript 數組也是一組有序的數據, 但跟其他語言不同的是,數組中每個槽位可以存儲任意類型的數據。 這意味著可以創建一個數組,它的第 ...
  • 本章將和大家分享JS中URLSearchParams的基本用法。話不多說,下麵我們直接來看代碼。 一、JS中URLSearchParams的基本用法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-e ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 目前平臺前端使用的是原生CSS+BEM命名,在多人協作的模式下,容易出現樣式衝突。為了減少這一類的問題,提升研效,我調研了業界上主流的7種CSS解決方案,並將最終升級方案落地到了工程中。 樣式衝突的原因 目前遇到的樣式衝突的原因,其實根本 ...
  • 一、JS執行機制 JS語言有個特點是單線程,即同一時間只能做一件事。單線程就意味著,所有的任務需要排隊,前一個任務結束,才會執行後一個任務,可能造成頁面渲染不連貫。 為瞭解決這個問題,利用多核CPU的計算能力,允許JS腳本創建多個線程,即同步和非同步。 同步任務: 同步任務都在主線程上執行,形成一個執 ...
  • 關於 SpringBoot 的自動裝配功能,相信是每一個 Java 程式員天天都會用到的一個功能,但是它究竟是如何實現的呢?今天阿粉來帶大家看一下。 自動裝配案例 首先我們通過一個案例來看一下自動裝配的效果,創建一個 SpringBoot 的項目,在 pom 文件中加入下麵的依賴。 <depende ...
  • 這本書是寫什麼的? 這是一本 Go 語言快速入門手冊,目標讀者是有任一編程語言基礎,希望以最快的時間 (比如一個周末) 入門 Go 語言。 這本書應該怎麼讀? 書中幾乎沒有較長篇幅的理論知識,更多的是 示例驅動開發,鼓勵讀者通過快速實踐加深基礎理解,加快學習速度。 全書按照章節順序閱讀即可,其中一些 ...
  • 背景 管理資料庫的界面工具。 開發團隊中一般有非技術背景人員,比如: 產品,功能測試人員; 對他們來說,可能安裝資料庫管理工具客戶端都很麻煩,需要一款線上的網頁工具能方便他們查閱數據。 本地docker安裝 單庫: docker run --name myadmin -d -e PMA_HOST=l ...
  • dubbo當前版本 2.7.3 期望升級到 3.0.11。 升級過程 maven依賴變更 <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.11</version> ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...