关于python:python-本地音乐播放器制作过程

8次阅读

共计 2991 个字符,预计需要花费 8 分钟才能阅读完成。

制作这个播放器的目标是为了将下载下来的 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 界面的局部。利用就是简略的设计了一下不是很简单。

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_())

残缺源代码曾经保留在百度网盘下面,将上述代码块全副 copy 到开发中运行即可,或者在公众号内回复 ’1002’ 获取下载链接间接下载.py 文件到开发工具运行也是能够的。

创作不易,欢送大家踊跃发问,有 python 相干的问题请留言,看到即回复,感激大家始终的反对!

【往期精彩】

自动化工具:PyAutoGUI 的鼠标与键盘管制,解放双手的利器!

来自程序猿的生日蛋糕你见过吗?

懒人 python 操作,代码中永远只须要导入一个库 …

自动化办公:手机号码提取器,应用正则表达式轻松提取文本文件中的手机号码 …

刚刚发现的可视化动静图库 ipyvizzu,太难看了!

正文完
 0