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

制作这个播放器的目的是为了将下载下来的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相关的问题请留言,看到即回复,感谢大家一直的支持!

file

【往期精彩】

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

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

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

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

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 本地音乐播放器制作过程 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • python打包技巧:彻底解决pyinstaller打包exe文件太大的问题

    之前也写过很多的小工具,粉丝朋友们应该都知道在本公众号内回复任意关键字即可获取以往的工具源码或是exe可执行应用。 【阅读全文】 因为以往发过的小工具基本都是几十MB大小的exe应用,也就没有在意exe太大给大家带来的困扰,今天就准备来彻底的解决一下这个问题。 其实每次打包的exe的应用过大无非就是两个方面的语言因导致的,一是我们在开发的代码的过程中为了简便…

    2023年4月2日
    00
  • python实现excel数据与mysql数据库互通有无

    【阅读全文】 python在制作一些小工具上本身就有着得天独厚的优势,大多数非标准库的应用只需要进行简单的安装即可使用。 比如:使用python将excel中的数据导入到mysql数据库表中,或是将mysql数据库表中的数据直接导出为excel都只需要简单的几行代码就可以完成,假如使用Java来做这件事强那可就有些复杂了呢。 话不多说,接下来直接进入正题..…

    2023年4月2日
    00
  • 吐血整理python数据分析利器pandas的八个生命周期!

    这里从八个pandas的数据处理生命周期,整理汇总出pandas框架在整个数据处理过程中都是如何处理数据的。 【阅读全文】 也就是从pandas的数据表对象以及数据汇总、数据统计等等直到数据导出的八个处理过程来完成pandas使用的汇总处理。 首先,需要准备好将python非标准库导入进来,除了pandas之外一般伴随数据分析处理使用的还有numpy科学计算…

    Python开发 2023年4月2日
    00
  • python四个性能检测工具,包括函数的运行内存、时间等等…

    python虽然是一门’慢语言’,但是也有着比较多的性能检测工具来帮助我们优化程序的运行效率。 【阅读全文】 这里总结了五个比较好的python性能检测工具,包括内存使用、运行时间、执行次数等方面。 首先,来编写一个基础的python函数用于在后面的各种性能测试。 def base_func(): for n in range(10000): print(‘…

    2023年4月2日
    00
  • python做一个微型美颜图片处理器,十行代码即可完成

    【阅读全文】 图片美颜处理的实现思路就是使用cv2非标准库对图片做双边过滤,使其达到美颜的效果。 将cv2非标准库导入到代码块中 import cv2 准备好需要美颜的图片,源图片是在百度上面找的用来做测试用。 读取准备好的原始图片 source = cv2.imread(“source.jpeg”) 对准备好的原始图片执行双边过滤 target = cv2…

    2023年4月2日
    00
  • python多线程同步售票系统解决思路

    解决问题场景:假如剩余1000张电影票需要售卖,同时有10家电影App来售卖这1000张电影票。主要的逻辑实现过程是什么,要求使用python技术栈进行解题? 【阅读全文】 1、分析过程 分析:主要信息点是10家App平台同时售卖1000张电影票。此时,可以使用10个python线程来作为10家App平台,同时售卖必须保证电影票数量的同步,比如A平台卖出了一…

    2023年4月2日
    00
  • 数据清洗工具flashtext,效率直接提升了几十倍数

    在平常的一些的小规模的数据的过滤、清洗过程中使用最多的就是正则表达式,但是随着数据规模的增大,正则表达式就显得有些心有余力不足了。 【阅读全文】 正则表达式在一个 10k 的词库中查找 15k 个关键词的时间差不多是 0.165 秒。但是对于 Flashtext 而言只需要 0.002 秒。因此,在这个问题上 Flashtext的速度大约比正则表达式快 82…

    2023年4月2日
    00
  • 如何将多张图片合成mp4视频格式,并加入背景音乐…

    【阅读全文】 实现的思路:将准备好的图片通过opencv读取出来,并将其设置好帧数等参数后合成为无声视频。最后通过moviepy编辑视频将背景音乐加入到视频中。 开始之前还是需要说明一下非标准库的来源,因为有些库的名称和需要导入模块的名称不一定就是一样的。 import os # python标准库,不需要安装,用于系统文件操作相关 import cv2 #…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部