简易播放器的制作(超详细!!!!!!!!!!!!)

1安装PyQt5工具,安装PyQt5设计器,配置扩展工具

2设计播放器的窗体

3完成播放器的窗体加载

4初始化窗体属性(播放功能、进度条功能、顺序播放、循环播放功能)

目录

1安装PyQt5工具,安装PyQt5设计器,配置扩展工具

2设计播放器的窗体

3完成播放器的窗体加载

4初始化窗体属性(播放功能、进度条功能、顺序播放、循环播放功能等)

5自我总结  

1安装PyQt5工具,安装PyQt5设计器,配置扩展工具

1先创建好一个新的项目,记住项目存放的位置,尽量存到D盘中,如图中找到设置选项,找到Python Interperter这个选项,点击之后会看到页面上有一个小加号,点击就可以下载啦,然后依次下载PyQt5、PyQt5-tools、PyQt5designer  

 

 接下来安装扩展工具,从项目中找到QtDesigner,依次按找下图点击,复制其绝对路径

 复制之后,要将其加入到扩展工具中,如下图

将复制的绝对路径复制到Program中,然后其他设置按照如图所示设置 

 

 然后接着配置第二个扩展,如下图所示,找到python.exe的绝对路径并复制。

Name=PyUic

Working director:$FileDie$

Arguments:  -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

注意一个字母,一个空格都不要落下。

其余都与上面那个扩展一样

2设计播放器的窗体 

设计好了之后就可以保存下来,然后在pycharm的左侧栏中找到你保存的设计窗体,右击找到externaltool点击pyuic,然后便可以双击打开后缀为.py的文件。注意这些按钮还是不要拖动错误,当然如果你有更好的想法,可以多加入一些东西,我小白,因为拖错按钮,导致重新开始。

 3完成播放器的窗体加载

点击进去后会发现系统自动帮你生成你设计窗口的代码,这些代码一般都不用动,如果程序运行后,它出来的窗口不符合你心中所想,你可以在自动生成的代码中进行调整,可以对比着你的设计页面,来修改具体的参数。

首先要有一个明确的思路,当你设计好窗口点击运行时,窗口并不会出现,这需要我们自己打代码来使得窗口呈现,思路:程序都需要入口,也要创建应用程序对象,再创建主窗口,再创建自定义的窗口,将自定义窗口设置为主窗体,这样可以使得当我们关闭应用程序时,可以一下子结束应用程序,然后再展示主窗体,最后再退出。以下代码都是很常用的,基本都是固定死的,多用几遍就可以记住了。之后我应该还会再发一个博客,水果机项目,代码基本与下述代码一致。项目在进行时会有很多代码有红色下划线,其实只需要把鼠标放到代码上,等待几秒后,它就会出现导入包的按钮,点击之后就可以正常使用了。比如里面的QMainWindow等。

#程序入口
if __name__ == '__main__':
    #创建应用程序对象
    app=QApplication(sys.argv)
    #创建主窗口对象
    MainWindow=QMainWindow()
    #创建自定义窗口对象
    ui=Ui_MainWindow()
    #将自定义窗口设置为主窗口
    ui.setupUi(MainWindow)
    #运行的程序没有限制其长宽,会使得程序窗口可以随意拉伸放大,这段代码时为了限制
    MainWindow.setFixedSize(MainWindow.width(),MainWindow.height())#不可更改长宽
    #显示主窗口
    MainWindow.show()
    #应用程序退出
    sys.exit(app.exec_())

3完成播放器的窗体加载

目前该窗口上共有三个按钮,可以一一来设计

播放的音乐应该有播放器,但播放器中不能存音乐,音乐都应该在播放列表中存储,首先创建播放列表对象,顺带可以初始化它的播放模式,接着创建播放器对象,顺便设置其播放音量,最后将播放列表传递给播放器,播放器通过鼠标点击来进行播放,这里就要用到信号与槽函数这基本知识点,接着可以设置按钮的基本信息(起到提示作用)。 

#一定要在上面的类中调用该函数 
        self.myWindowInit() 


def myWindowInit(self):
        #创建播放列表,保存音频文件
        self.playList=QMediaPlaylist()
        #创建播放列表的播放方式
        self.playList.setPlaybackMode(QMediaPlaylist.Loop)
        #创建播放器,用来播放
        self.player=QMediaPlayer()
        #设置播放器的音量
        self.player.setVolume(30)
        #把播放列表传给播放器
        self.player.setPlaylist(self.playList)
        #创建保存音乐名称的列表,用来显示在窗口标题上来提示用户所播放的音乐名称
        self.musicNames=[]
        #设置按键的提示信息
        self.play_btn.setToolTip('播放')
        self.mode_btn.setToolTip('顺序播放')

4初始化窗体属性(播放功能、进度条功能、顺序播放、循环播放功能等)

首先自定义函数的播放功能,共三种情况,一种是播放,一种是暂停,另一种是静止(打开窗口并未进行任何操作),首先我们打开窗口就是静止状态,此时需要我们获取本地文件,并加载到播放列表对象,然后再把音乐名称加载到保存音乐名称的列表中,设置当前播放音乐的索引,开始播放并更改按钮图片,更改按钮提示信息,显示窗体标题为播放音乐名称。

#设置自定义函数(对接播放按钮)
    def musicPlay(self):
#播放状态为播放状态
        if self.player.state()==QMediaPlayer.State.PlayingState:
#设置播放器暂停(反着来)(鼠标点击后,就会暂停)
            self.player.pause()
#设置播放器按钮图标为暂停图标 
                                        self.play_btn.setIcon(QIcon("images/9abf737d_E771324_e90790dc.png"))
#设置按钮提示信息为播放
            self.play_btn.setToolTip('播放')
#播放器状态为暂停状态
        elif self.player.state()==QMediaPlayer.State.PausedState:
#设置播放器播放
            self.player.play()
#播放按钮改为播放图片            self.play_btn.setIcon(QIcon("images/64523fba3f75a335b641957d8b82cc125fe64fc04f88-znmEZL_fw658webp.webp"))
#按钮提示信息为暂停
            self.play_btn.setToolTip('暂停')
#若为停止状态,则从本地文件中导入音乐,None是文件打开不依赖于任何窗口,可以自己独立打开,“选择音乐”是打开窗口的提示,*是所有文件,typename是为了接收后面的*
        else:
            fileNames,typeName=QFileDialog.getOpenFileNames(None,'选择音乐','','*')
#循环遍历音频文件路径
            for i in fileNames:
#保存到播放列表中,播放器才可以从播放列表中拿出来播放  QUrl是路径              self.playList.addMedia((QMediaContent(QUrl.fromLocalFile(i))))
#目的旨在拿出播放音乐的名称,并存入到self.musicNames[]列表中
                start=i.rfind('/')
                end=i.rfind('.')
                self.musicNames.append(i[start+1:end])
#设置开始播放的音乐为第一个
            self.playList.setCurrentIndex(0)
#开始播放
            self.player.play()
#设置按钮图片为播放状态            self.play_btn.setIcon(QIcon("images/64523fba3f75a335b641957d8b82cc125fe64fc04f88-znmEZL_fw658webp.webp"))
#提示信息为暂停
            self.play_btn.setToolTip('暂停')
#设置主窗体的标题为音乐名称
            MainWindow.setWindowTitle(f"我的音乐库————{self.musicNames[0]}")

记得在自定义窗体函数内调用该函数

#点击播放按钮就会调用musicPlay函数
self.play_btn.clicked.connect(self.musicPlay)

进度条    

  #记得在上方的类中调用自定义函数
#播放音频的音频持续时长改变就会调用此函数
   self.player.durationChanged.connect(self.getTotalTime)
#当前播放位置改变,就会调用getCurrent这个函数
   self.player.positionChanged.connect(self.getCurrentTime)
#记得都要调用,进度条拖动改编位置后,要调用该函数
   self. time_slider.sliderMoved.connect(self.timeChanged)
#以上都是要在类中进行调用的函数

#该自定义函数本来就是为了使进度条时长匹配播放音乐的时长,也为了在窗口标题上改变音乐的名字

   def getTotalTime(self,d):#参数d保存的时音频的总时长(毫秒)
#设置进度条的时长与正在播放的音频的时长一样
        self.time_slider.setRange(0,d)
#获取当前播放音频的索引
        index=self.playList.currentIndex()
        MainWindow.setWindowTitle(f"我的音乐库————{self.musicNames[index]}")

#自定义函数来获取当前播放时间 
   def getCurrentTime(self,p):
#使得进度条动起来,设置进度条和当前播放的时长一致
        self.time_slider.setValue(p)
#计算秒
        seconds=int(p/1000)
#计算分钟
        minutes=int(seconds/60)
#当秒数大于60时,及时止损,让他从头开始计数
        seconds-=minutes*60
#一下代码是为了实现00:00的格式而写
        str_time=""
        if minutes<10:
            str_time=str_time+"0"+str(minutes)
        else:
            str_time=str_time+str(minutes)
        str_time=str_time+":"
        if seconds<10:
            str_time=str_time+"0"+str(seconds)
        else:
            str_time = str_time + str(seconds)
#将分钟,秒显示在时间标签中
        self.time_lbl.setText(str_time)
#拖动进度条,改变时长
        def timeChanged(self,t):
#设置播放器播放位置为拖动到的位置t
            self.player.setPosition(t)

接下来接着改变播放模式,顺序播放,循环播放......

#还是那句话记得在上面的类中进行调用
self.mode_btn.clicked.connect(self.modeChange)

#自定义函数为了改变播放模式
    def modeChanged(self):
#如果播放模式是顺序播放,点击之后,就把它改成单曲循环播放模式
        if self.playList.playbackMode()==QMediaPlaylist.Loop:
            self.playList.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
#播放按钮图片也应该改成单曲循环播放图片            self.mode_btn.setIcon(QIcon("images/8fd7a46a5ac5cecb8585b3302205a72f8b8afdc4e624-7Mo4qB_fw658webp.webp"))
#提示信息为单曲循环
            self.mode_btn.setToolTip("单曲循环")
#如果是单曲循环的话,点击之后就应该变成顺序播放
        else:
            self.playList.setPlaybackMode(QMediaPlaylist.Loop)
#然后播放图片也变成顺序循环图片                            
 self.mode_btn.setIcon(QIcon("images/2352699554c2f52c8cf8d1750a31d03d9b58424b379a-ZwVLwH_fw658webp.webp"))
#提示信息改成顺序播放
            self.mode_btn.setToolTip("顺序播放")

这就是最后的运行程序,我播放的音乐是周杰伦的《枫》,因此主标题上就是歌曲的名字

5自我总结

 

第一遍感觉还是有些困难的,因为仅仅学了python基础,经过四五天的硬啃,外加老师的协助,对项目的理解加深了很多,其中也因为在设计过程中,一个按键弄错了,导致项目得从头来一遍,心态几近崩溃......

不过,目前看来我是挺过来了,现在感觉状态良好,写这个博客就是希望自己以后能看看,不要忘记这段经历,嗯嗯,就这样。

如果,如果,如果,该博客中出现任何问题,请及时交流沟通,我是纯小白,渴望能有大佬及时纠错,好吧,就到这结束吧!

不,还没结束!最后我还是附上源码,这是全部代码,目前运行的话没有问题,如果想要验证这个代码的话,还是要注意跟我的变量名称是否相同,失之毫厘,谬以千里......后面如果我勤快的话,可以写一下要打包啥的之类的。嗯嗯,结束了...

# -*- coding: utf-8 -*-
import sys

# Form implementation generated from reading ui file 'musicplayer.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimedia import QMediaPlaylist, QMediaPlayer, QMediaContent
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(493, 45)
        icon = QtGui.QIcon("D:\pythonProject\myplayer\images\图标.ico")
        icon.addPixmap(QtGui.QPixmap("D:\pythonProject\myplayer\images\1060dc5b0e1e18028c82f219c436be32df857c8c7c95b-N7NfX7_fw658webp.webp"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.play_btn = QtWidgets.QPushButton(self.centralwidget)
        self.play_btn.setGeometry(QtCore.QRect(0, 0, 41, 31))
        self.play_btn.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("D:\pythonProject\myplayer\images\R-C.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.play_btn.setIcon(icon1)
        self.play_btn.setIconSize(QtCore.QSize(30, 30))
        self.play_btn.setObjectName("play_btn")
        self.mode_btn = QtWidgets.QPushButton(self.centralwidget)
        self.mode_btn.setGeometry(QtCore.QRect(450, 0, 41, 31))
        self.mode_btn.setText("")
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("D:\pythonProject\myplayer\images\9467660d999d463ddcad8f61067e2786c88d1ff63ae9-jkiU23_fw658webp.webp"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.mode_btn.setIcon(icon2)
        self.mode_btn.setIconSize(QtCore.QSize(30, 30))
        self.mode_btn.setObjectName("mode_btn")
        self.time_slider = QtWidgets.QSlider(self.centralwidget)
        self.time_slider.setGeometry(QtCore.QRect(60, 8, 321, 20))
        self.time_slider.setOrientation(QtCore.Qt.Horizontal)
        self.time_slider.setObjectName("time_slider")
        self.time_lbl = QtWidgets.QLabel(self.centralwidget)
        self.time_lbl.setGeometry(QtCore.QRect(400, 0, 71, 31))
        self.time_lbl.setObjectName("time_lbl")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.myWindowInit()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "我的音乐库"))
        self.time_lbl.setText(_translate("MainWindow", "00:00"))
    def myWindowInit(self):
        #创建播放列表
        self.playList=QMediaPlaylist()
        #创建播放列表的播放方式
        self.playList.setPlaybackMode(QMediaPlaylist.Loop)
        #创建播放器
        self.player=QMediaPlayer()
        #设置播放器的音量
        self.player.setVolume(30)
        #把播放列表传给播放器
        self.player.setPlaylist(self.playList)
        #创建保存音乐名称的列表
        self.musicNames=[]
        #设置按键的提示信息
        self.play_btn.setToolTip('播放')
        self.mode_btn.setToolTip('顺序播放')
        #点击播放按钮就会调用musicPlay函数
        self.play_btn.clicked.connect(self.musicPlay)
        #播放器音频播放时长改变(durationChanged)调用getTotaltime函数
        self.player.durationChanged.connect(self.getTotalTime)
        self.player.positionChanged.connect(self.getCurrentTime)
        self.time_slider.sliderMoved.connect(self.timeChanged)
        self.mode_btn.clicked.connect(self.modeChanged)
    def modeChanged(self):
        if self.playList.playbackMode()==QMediaPlaylist.Loop:
            self.playList.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
            self.mode_btn.setIcon(QIcon("images/8fd7a46a5ac5cecb8585b3302205a72f8b8afdc4e624-7Mo4qB_fw658webp.webp"))
            self.mode_btn.setToolTip("单曲循环")
        else:
            self.playList.setPlaybackMode(QMediaPlaylist.Loop)
            self.mode_btn.setIcon(QIcon("images/2352699554c2f52c8cf8d1750a31d03d9b58424b379a-ZwVLwH_fw658webp.webp"))
            self.mode_btn.setToolTip("顺序播放")
    def getTotalTime(self,d):#参数d保存的时音频的总时长(毫秒)
        self.time_slider.setRange(0,d)
        index=self.playList.currentIndex()
        MainWindow.setWindowTitle(f"我的音乐库————{self.musicNames[index]}")
    def getCurrentTime(self,p):
        self.time_slider.setValue(p)
        seconds=int(p/1000)
        minutes=int(seconds/60)
        seconds-=minutes*60
        str_time=''
        # if minutes<10:
        #     self.time_lbl1='0'+str(minutes)
        # else:
        #     self.time_lbl1=str(minutes)
        # if seconds<10:
        #     self.time_lbl1=self.time_lbl+':'+'0'+str(seconds)
        # else:
        #     self.time_lbl1=self.time_lbl+':'+str(seconds)
        # self.time_lbl.setText(self.time_lbl1)
        # if seconds<10:
        #     self.time_lbl.setText(f"0{minutes}:0{seconds}")
        # else:
        #     self.time_lbl.setText(f"0{minutes}:{seconds}")
        if minutes<10:
            str_time=str_time+"0"+str(minutes)
        else:
            str_time=str_time+str(minutes)
        str_time=str_time+":"
        if seconds<10:
            str_time=str_time+"0"+str(seconds)
        else:
            str_time = str_time + str(seconds)

        self.time_lbl.setText(str_time)
    def timeChanged(self,t):
        self.player.setPosition(t)

    def musicPlay(self):
        if self.player.state()==QMediaPlayer.State.PlayingState:
            self.player.pause()
            self.play_btn.setIcon(QIcon("images/9abf737d_E771324_e90790dc.png"))
            self.play_btn.setToolTip('播放')
        elif self.player.state()==QMediaPlayer.State.PausedState:
            self.player.play()
            self.play_btn.setIcon(QIcon("images/64523fba3f75a335b641957d8b82cc125fe64fc04f88-znmEZL_fw658webp.webp"))
            self.play_btn.setToolTip('暂停')
        else:
            fileNames,typeName=QFileDialog.getOpenFileNames(None,'选择音乐','','*')
            for i in fileNames:
                self.playList.addMedia((QMediaContent(QUrl.fromLocalFile(i))))
                start=i.rfind('/')
                end=i.rfind('.')
                self.musicNames.append(i[start+1:end])

            self.playList.setCurrentIndex(0)
            self.player.play()
            self.play_btn.setIcon(QIcon("images/64523fba3f75a335b641957d8b82cc125fe64fc04f88-znmEZL_fw658webp.webp"))
            self.play_btn.setToolTip('暂停')
            MainWindow.setWindowTitle(f"我的音乐库————{self.musicNames[0]}")

if __name__ == '__main__':
    app=QApplication(sys.argv)
    MainWindow=QMainWindow()
    ui=Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.setFixedSize(MainWindow.width(),MainWindow.height())#不可更改长宽
    MainWindow.show()
    sys.exit(app.exec_())

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值