基于Python实现本地音乐播放器的制作

作者:Python?集中营 时间:2022-05-11 16:37:46 

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

基于Python实现本地音乐播放器的制作

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

来源:https://www.cnblogs.com/lwsbc/p/16383567.html

标签:Python,本地,音乐,播放器
0
投稿

猜你喜欢

  • Python内置数据结构与操作符的练习题集锦

    2022-07-25 05:12:53
  • golang 实现tcp server端和client端,并计算RTT时间操作

    2023-08-30 14:12:49
  • python使用opencv按一定间隔截取视频帧

    2021-10-29 01:27:14
  • Asp编写不再让人讨厌的自动弹出窗口

    2007-09-29 12:16:00
  • 使用javascript+xml技术实现分页浏览

    2008-05-29 13:49:00
  • MySQL UPDATE时主键冲突引发的思考

    2008-06-21 17:00:00
  • 深入解析pandas数据聚合和重组

    2023-11-17 17:45:51
  • Oracle 8i字符集乱码问题析及其解决办法

    2010-07-26 13:29:00
  • HTML的基本元素

    2010-03-16 12:39:00
  • Python抓取电影天堂电影信息的代码

    2023-07-23 17:18:49
  • 详解Python 字符串相似性的几种度量方法

    2023-06-19 14:12:39
  • Python测试开源工具splinter安装与使用教程

    2022-07-22 01:56:36
  • 收集的ORACLE函数大全

    2010-07-16 12:58:00
  • JQuery获取表单值

    2009-11-19 13:17:00
  • Oracle数据库安全策略分析 (三)

    2010-07-31 13:24:00
  • js 可选链操作符的使用

    2023-08-18 16:04:57
  • MySQL与PHP的基础与应用专题之自连接

    2023-11-14 08:52:37
  • Python使用pandas将表格数据进行处理

    2023-10-08 06:23:55
  • ASP UTF-8页面乱码+GB2312转UTF-8 +生成UTF-8格式的文件(编码)

    2011-04-19 11:15:00
  • 解析Tensorflow之MNIST的使用

    2021-09-06 03:34:27
  • asp之家 网络编程 m.aspxhome.com