链接:https://pan.baidu.com/s/1WWOXlPqNxq6zdEEoCr611g
提取码:qw7h
myMainWindow.py
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow,QFileDialog,QListWidgetItem
from PyQt5.QtCore import pyqtSlot,QUrl,QModelIndex,QDir,QFileInfo
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimedia import QMediaPlayer,QMediaPlaylist,QMediaContent
from ui_mainwindow import Ui_MainWindow
class QmyMainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui=Ui_MainWindow()
self.ui.setupUi(self)
self.player=QMediaPlayer(self)#播放器
self.playlist=QMediaPlaylist(self)#播放列表
self.player.setPlaylist(self.playlist)#为播放器设置播放列表
self.playlist.setPlaybackMode(QMediaPlaylist.Loop)#循环模式
self.__duration=""#文件总时间长度
self.__curPos=""#当前播放位置
self.player.stateChanged.connect(self.do_stateChanged)
self.player.positionChanged.connect(self.do_positionChanged)
self.player.durationChanged.connect(self.do_durationChanged)
self.playlist.currentIndexChanged.connect(self.do_currentChanged)
def do_stateChanged(self,state):##播放器状态变化
self.ui.btnPlay.setEnabled(state!=QMediaPlayer.PlayingState)
self.ui.btnPause.setEnabled(state==QMediaPlayer.PlayingState)
self.ui.btnStop.setEnabled(state==QMediaPlayer.PlayingState)
def do_positionChanged(self,position):##当前文件播放位置变化
if(self.ui.sliderPosition.isSliderDown()):#正在拖动滑块调整进度
return
self.ui.sliderPosition.setSliderPosition(position)
secs=position/1000 #秒
mins=secs/60#分
secs=secs%60 #秒
self.__curPos="%d:%d"%(mins,secs)
self.ui.LabRatio.setText(self.__curPos+'/'+self.__duration)
def do_durationChanged(self,duration):##文件时长变化
self.ui.sliderPosition.setMaximum(duration)
secs=duration/1000
mins=secs/60 #分
secs=secs%60 #余数 是 秒
self.__duration="%d:%d"%(mins,secs)
self.ui.LabRatio.setText(self.__curPos+'/'+self.__duration)
def do_currentChanged(self,position):#playlist当前曲目发生变化时
self.ui.listWidget.setCurrentRow(position)
item=self.ui.listWidget.currentItem()##QListWidgetItem
if(item!=None):
self.ui.LabCurMedia.setText(item.text())
@pyqtSlot()##添加文件
def on_btnAdd_clicked(self):
curPath=QDir.currentPath()
dlgTitle="选择音频文件"
filt="音频文件(*.mp3 *.wav *.wma);所有文件(*.*)"
fileList,flt=QFileDialog.getOpenFileNames(self,dlgTitle,curPath,filt)
count=len(fileList)
if(count<1):
return
filename=fileList[0]
fileInfo=QFileInfo(filename)#文件信息
QDir.setCurrent(fileInfo.absolutePath())#重设当前路径
for i in range(count):
filename=fileList[i]
fileInfo.setFile(filename)
song=QMediaContent(QUrl.fromLocalFile(filename))
self.playlist.addMedia(song)#添加播放媒体
basename=fileInfo.baseName()
self.ui.listWidget.addItem(basename)
if(self.player.state()!=QMediaPlayer.PlayingState):
self.playlist.setCurrentIndex(0)
self.player.play()
@pyqtSlot()##移除一个文件
def on_btnRemove_clicked(self):
pos=self.ui.listWidget.currentRow()
item=self.ui.listWidget.takeItem(pos)##python会自动删除
if(self.playlist.currentIndex()==pos):##是当前播放的曲目
nextPos=0
if pos>=1:
nextPos=pos-1
self.playlist.removeMedia(pos)#从播放列表里删除
if(self.ui.listWidget.count()>0):
self.playlist.setCurrentIndex(nextPos)
self.do_currentChanged(nextPos)
else:
self.player.stop()
self.ui.LabCurMedia.setText("无曲目")
else:#不是当前播放的曲目,直接删除
self.playlist.removeMedia(pos)
@pyqtSlot()#清空播放列表
def on_btnClear_clicked(self):
self.playlist.clear()#清空播放列表
self.ui.listWidget.clear()
self.player.stop()#停止播放
@pyqtSlot()#上一曲目
def on_btnPrevious_clicked(self):
self.playlist.previous()
@pyqtSlot()##下一曲目
def on_btnNext_clicked(self):
self.playlist.next()
def on_listWidget_doubleClicked(self,index):##双击时切换播放文件
rowNo=index.row()#行号
self.playlist.setCurrentIndex(rowNo)
self.player.play()
@pyqtSlot()#播放
def on_btnPlay_clicked(self):
if(self.playlist.currentIndex()<0):
self.playlist.setCurrentIndex(0)
self.player.play()
@pyqtSlot()##暂停
def on_btnPause_clicked(self):
self.player.pause()
@pyqtSlot()##停止
def on_btnStop_clicked(self):
self.player.stop()
@pyqtSlot()#静音控制
def on_btnSound_clicked(self):
mute=self.player.isMuted()
self.player.setMuted(not mute)
if mute:
self.ui.btnSound.setIcon(QIcon(":/icons/images/volumn.bmp"))
else:
self.ui.btnSound.setIcon(QIcon(":/icons/images/mute.bmp"))
@pyqtSlot(int)#调节音量
def on_sliderVolumn_valueChanged(self,value):
self.player.setVolume(value)
@pyqtSlot(int)#文件进度调度
def on_sliderPosition_valueChanged(self,value):
self.player.setPosition(value)
def closeEvent(self, event):#窗体关闭时
if(self.player.state()==QMediaPlayer.PlayingState):
self.player.stop()
if __name__=="__main__":
# QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放
app=QApplication(sys.argv)
form=QmyMainWindow()
form.show()
sys.exit(app.exec_())