首頁 > 軟體

基於Python實現本地音樂播放器的製作

2022-06-17 10:00:03

製作這個播放器的目的是為了將下載下來的mp3檔案進行隨機或是順序的播放。選擇需要播放的音樂的路徑,選擇播放方式,經過測試可以完美的播放本地音樂。

在開始之前介紹一個免費下載mp3音樂的網站,有需要的可以下載自己喜歡的音樂。當然有各大音樂平臺會員的大佬就不需要了。

缺少音樂素材的可以去免費下載即可,準備好音樂素材後將其放到一個資料夾下面即可。

在應用實現過程中,總共使用了下面這些庫,特別需要注意的是這個庫playsound使用的版本是1.3.0,聽說其他版本在播放音樂時可能存在問題。也可以將播放音樂的部分換成其他的實現方式。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

from QCandyUi import CandyWindow

import random, os
from playsound import playsound

最先實現的是播放音樂的業務邏輯,這裡是採用pyqt5自帶的QThread執行緒來實現的,目的是將播放音樂的部分作為一個子執行緒來執行,防止與UI介面的主執行緒產生阻塞。

實現子執行緒的部分是一樣的正規化,一般情況下按照這種正規化實現,屢試不爽。在前面的UI桌面應用中幾乎都是使用這種方式來實現多執行緒的。

class PlayThread(QThread):
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(PlayThread, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        music_files = os.listdir(self.parent.music_file_path.text())
        print(music_files)
        for index in range(0, len(music_files) - 1):
            if self.parent.play_type_selected.currentText() == '隨機播放':
                index = random.randint(0, len(music_files) - 1)
            print(index)
            playsound(os.path.join(self.parent.music_file_path.text(), music_files[index]))
        self.finished.emit(True)

音樂播放的業務邏輯實現完成了,接下來來實現UI介面的部分。應用就是簡單的設計了一下不是很複雜。

pyqt5的UI介面的實現方式主要是元件的佈局和槽函數的參照,下面是UI介面佈局及各個槽函數的初始化及參照。以及如何介面的主執行緒中呼叫子執行緒的使用。

class MusicUI(QWidget):
    def __init__(self):
        super(MusicUI, self).__init__()
        self.init_ui()
    def init_ui(self):
        self.setWindowTitle('本地音樂播放器  公眾號:[Python 集中營]')
        self.setWindowIcon(QIcon('音樂.ico'))

        self.setFixedWidth(500)
        self.setFixedHeight(100)

        hbox1 = QHBoxLayout()
        self.music_file_path = QLineEdit()
        self.music_file_path.setReadOnly(True)

        self.music_file_btn = QPushButton()
        self.music_file_btn.setText('路徑')
        self.music_file_btn.clicked.connect(self.music_file_btn_click)

        hbox1.addWidget(self.music_file_path)
        hbox1.addWidget(self.music_file_btn)

        hbox2 = QHBoxLayout()

        self.play_type_selected = QComboBox()
        self.play_type_selected.addItem('隨機播放')
        self.play_type_selected.addItem('順序播放')

        self.start_btn = QPushButton()
        self.start_btn.setText('開始播放')
        self.start_btn.clicked.connect(self.start_btn_click)

        hbox2.addWidget(self.play_type_selected)
        hbox2.addWidget(self.start_btn)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)

        self.thread_ = PlayThread(self)
        self.thread_.finished.connect(self.finished)

        self.setLayout(vbox)

    def music_file_btn_click(self):
        dir = QFileDialog.getExistingDirectory(self, "選擇資料夾", os.getcwd())
        self.music_file_path.setText(dir)

    def start_btn_click(self):
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self,finished):
        if finished is True:
            self.start_btn.setEnabled(True)

# 最後,使用mian函數將介面佈局的整個過程加入到主體迴圈中就大功告成了。
if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = CandyWindow.createWindow(MusicUI(), theme='blue', title='本地音樂播放器  公眾號:[Python 集中營]',
                                 ico_path='音樂.ico')
    w.show()
    sys.exit(app.exec_())

完整程式碼

# -*- coding:utf-8 -*-
# @author Python 集中營
# @date 2022/4/23
# @file test10.py

# done
# python 本地音樂播放器製作過程(附完整原始碼)

# 文摘:通過pyqt5多執行緒製作簡單的本地音樂播放器...

# 製作這個播放器的目的是為了將下載下來的mp3檔案進行隨機或是順序的播放。選擇需要播放的音樂的路徑,選擇播放方式,
# 經過測試可以完美的播放本地音樂。

# 在開始之前介紹一個免費下載mp3音樂的網站,有需要的可以下載自己喜歡的音樂。當然有各大音樂平臺會員的大佬就不需要了。

# http://music.y444.cn/

# 缺少音樂素材的可以去免費下載即可,準備好音樂素材後將其放到一個資料夾下面即可。

# 在應用實現過程中,總共使用了下面這些庫,特別需要注意的是這個庫playsound使用的版本是1.3.0,聽說其他版本在播放音樂時可能存在問題。
# 也可以將播放音樂的部分換成其他的實現方式。

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

from QCandyUi import CandyWindow

import random, os
from playsound import playsound

# 最先實現的是播放音樂的業務邏輯,這裡是採用pyqt5自帶的QThread執行緒來實現的,目的是將播放音樂的部分
# 作為一個子執行緒來執行,防止與UI介面的主執行緒產生阻塞。

# 實現子執行緒的部分是一樣的正規化,一般情況下按照這種正規化實現,屢試不爽。在前面的UI桌面應用中幾乎都是使用這種方式來實現多執行緒的。

class PlayThread(QThread):
    finished = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(PlayThread, self).__init__(parent)
        self.parent = parent
        self.working = True

    def __del__(self):
        self.working = False
        self.wait()

    def run(self):
        music_files = os.listdir(self.parent.music_file_path.text())
        print(music_files)
        for index in range(0, len(music_files) - 1):
            if self.parent.play_type_selected.currentText() == '隨機播放':
                index = random.randint(0, len(music_files) - 1)
            print(index)
            playsound(os.path.join(self.parent.music_file_path.text(), music_files[index]))
        self.finished.emit(True)


# 音樂播放的業務邏輯實現完成了,接下來來實現UI介面的部分。應用就是簡單的設計了一下不是很複雜。

# 音樂播放器UI.png

# pyqt5的UI介面的實現方式主要是元件的佈局和槽函數的參照,下面是UI介面佈局及各個槽函數的初始化及參照。
# 以及如何介面的主執行緒中呼叫子執行緒的使用。

class MusicUI(QWidget):
    def __init__(self):
        super(MusicUI, self).__init__()
        self.init_ui()
    def init_ui(self):
        self.setWindowTitle('本地音樂播放器  公眾號:[Python 集中營]')
        self.setWindowIcon(QIcon('音樂.ico'))

        self.setFixedWidth(500)
        self.setFixedHeight(100)

        hbox1 = QHBoxLayout()
        self.music_file_path = QLineEdit()
        self.music_file_path.setReadOnly(True)

        self.music_file_btn = QPushButton()
        self.music_file_btn.setText('路徑')
        self.music_file_btn.clicked.connect(self.music_file_btn_click)

        hbox1.addWidget(self.music_file_path)
        hbox1.addWidget(self.music_file_btn)

        hbox2 = QHBoxLayout()

        self.play_type_selected = QComboBox()
        self.play_type_selected.addItem('隨機播放')
        self.play_type_selected.addItem('順序播放')

        self.start_btn = QPushButton()
        self.start_btn.setText('開始播放')
        self.start_btn.clicked.connect(self.start_btn_click)

        hbox2.addWidget(self.play_type_selected)
        hbox2.addWidget(self.start_btn)

        vbox = QVBoxLayout()
        vbox.addLayout(hbox1)
        vbox.addLayout(hbox2)

        self.thread_ = PlayThread(self)
        self.thread_.finished.connect(self.finished)

        self.setLayout(vbox)

    def music_file_btn_click(self):
        dir = QFileDialog.getExistingDirectory(self, "選擇資料夾", os.getcwd())
        self.music_file_path.setText(dir)

    def start_btn_click(self):
        self.start_btn.setEnabled(False)
        self.thread_.start()

    def finished(self,finished):
        if finished is True:
            self.start_btn.setEnabled(True)

# 最後,使用mian函數將介面佈局的整個過程加入到主體迴圈中就大功告成了。
if __name__ == '__main__':

    app = QApplication(sys.argv)
    w = CandyWindow.createWindow(MusicUI(), theme='blue', title='本地音樂播放器  公眾號:[Python 集中營]',
                                 ico_path='音樂.ico')
    w.show()
    sys.exit(app.exec_())

以上就是基於Python實現本地音樂播放器的製作的詳細內容,更多關於Python本地音樂播放器的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com