美文网首页pythonPython
python 本地音乐播放器制作过程

python 本地音乐播放器制作过程

作者: Python集中营 | 来源:发表于2022-06-16 21:07 被阅读0次

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

    file

    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,太好看了!

    相关文章

      网友评论

        本文标题:python 本地音乐播放器制作过程

        本文链接:https://www.haomeiwen.com/subject/ymnqvrtx.html