PyQt5之音乐播放器

  

  按照自己思路简单写了个桌面播放器,只有自己喜欢的歌。使用QtDesigner设计的ui界面,功能简单,还有很多bug@~@,代码奉上:

  

  music_button.ui使用扩展工具pyuic5生成了music_button.py文件,内容如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'music_button.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(265, 65)
        MainWindow.setMinimumSize(QtCore.QSize(265, 65))
        MainWindow.setMaximumSize(QtCore.QSize(265, 169))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(60, 10, 24, 24))
        self.pushButton.setAutoFillBackground(False)
        self.pushButton.setStyleSheet("border-image: url(:/qrc_files/up.png);")
        self.pushButton.setText("")
        self.pushButton.setAutoDefault(False)
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(110, 10, 24, 24))
        self.pushButton_2.setStyleSheet("border-image: url(:/qrc_files/play.png);")
        self.pushButton_2.setText("")
        self.pushButton_2.status = 0
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(160, 10, 24, 24))
        self.pushButton_3.setStyleSheet("border-image: url(:/qrc_files/down.png);")
        self.pushButton_3.setText("")
        self.pushButton_3.setObjectName("pushButton_3")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 265, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.pushButton_1_click)
        self.pushButton_2.clicked.connect(self.pushButton_2_click)
        self.pushButton_3.clicked.connect(self.pushButton_3_click)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

    def pushButton_1_click(self):
        pass

    def pushButton_2_click(self):
        pass

    def pushButton_3_click(self):
        pass

from qrc_files import down
from qrc_files import play
from qrc_files import up

  上面引入qrc文件,需要自己使用扩展工具pyrcc将图片资源转为python文件再引入,qrc文件内容如下:

<RCC>
  <qresource prefix="qrc_files/">
    <file>down.png</file>
  </qresource>
</RCC>

  以下是down.png生成的down.py文件:

# -*- coding: utf-8 -*-

# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.11.2)
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore

qt_resource_data = b"
x00x00x03x2d
x89
x50x4ex47x0dx0ax1ax0ax00x00x00x0dx49x48x44x52x00
x00x00x18x00x00x00x18x08x04x00x00x00x4ax7exf5x73
x00x00x00x04x67x41x4dx41x00x00xb1x8fx0bxfcx61x05
x00x00x00x20x63x48x52x4dx00x00x7ax26x00x00x80x84
x00x00xfax00x00x00x80xe8x00x00x75x30x00x00xeax60
x00x00x3ax98x00x00x17x70x9cxbax51x3cx00x00x00x02
x62x4bx47x44x00xffx87x8fxccxbfx00x00x00x07x74x49
x4dx45x07xe3x01x09x02x3bx32xebx8dxcfx60x00x00x00
xabx49x44x41x54x38xcbxbdx92x3bx0exc2x30x10x44x9f
x62xd9x34x20x14x72x03x0axaex80xb8x83xa1x0bx29xe0
x0axb9x0ex35xc7xa2x49xa2x54x34x54x81x16x41x81x10
x8axfcx61x25x14xa6xdbxf1xbcxddx29x0cx3fx48x91x91
x7cx0fx7dxa4xc9xc9xa8xe5xc0x9dx0bx16x13x47x54x6f
xeaxa8xb1x18x1ax29x00x1dx15x1bx74xf8x8ax72x9cx2b
x15xebx70x31xe5xf1xdex48x23x05xa2x57xfcx40x04x09
x01x2fxc4x62x68x79x20xd6x9cx03x8bxbex15xfbx0ax9a
x15x27xcexd2xedx9ax1dx25x13x79x7cx4fxc9xd8x7dx48
x02xf1x82x19x47x6exffx2dxe3xafxa4xd9x92x0ex56x46
x91xc7xcaxb8x1axb1x64x2ax8fx0fxa5x27x47x75x26xe3
xb4x71x5dx6cx00x00x00x25x74x45x58x74x64x61x74x65
x3ax63x72x65x61x74x65x00x32x30x31x39x2dx30x31x2d
x30x39x54x30x32x3ax35x39x3ax35x30x2bx30x38x3ax30
x30xbexc1x87xc1x00x00x00x25x74x45x58x74x64x61x74
x65x3ax6dx6fx64x69x66x79x00x32x30x31x39x2dx30x31
x2dx30x39x54x30x32x3ax35x39x3ax35x30x2bx30x38x3a
x30x30xcfx9cx3fx7dx00x00x00x43x74x45x58x74x73x6f
x66x74x77x61x72x65x00x2fx75x73x72x2fx6cx6fx63x61
x6cx2fx69x6dx61x67x65x6dx61x67x69x63x6bx2fx73x68
x61x72x65x2fx64x6fx63x2fx49x6dx61x67x65x4dx61x67
x69x63x6bx2dx37x2fx2fx69x6ex64x65x78x2ex68x74x6d
x6cxbdxb5x79x0ax00x00x00x18x74x45x58x74x54x68x75
x6dx62x3ax3ax44x6fx63x75x6dx65x6ex74x3ax3ax50x61
x67x65x73x00x31xa7xffxbbx2fx00x00x00x17x74x45x58
x74x54x68x75x6dx62x3ax3ax49x6dx61x67x65x3ax3ax48
x65x69x67x68x74x00x34x30x89xbbx0fx1fx00x00x00x16
x74x45x58x74x54x68x75x6dx62x3ax3ax49x6dx61x67x65
x3ax3ax57x69x64x74x68x00x34x30x71x14xcfx92x00x00
x00x19x74x45x58x74x54x68x75x6dx62x3ax3ax4dx69x6d
x65x74x79x70x65x00x69x6dx61x67x65x2fx70x6ex67x3f
xb2x56x4ex00x00x00x17x74x45x58x74x54x68x75x6dx62
x3ax3ax4dx54x69x6dx65x00x31x35x34x36x39x37x33x39
x39x30x85x91xdax96x00x00x00x10x74x45x58x74x54x68
x75x6dx62x3ax3ax53x69x7ax65x00x31x38x36x42x49x71
xf5x4dx00x00x00x62x74x45x58x74x54x68x75x6dx62x3a
x3ax55x52x49x00x66x69x6cx65x3ax2fx2fx2fx68x6fx6d
x65x2fx77x77x77x72x6fx6fx74x2fx6ex65x77x73x69x74
x65x2fx77x77x77x2ex65x61x73x79x69x63x6fx6ex2ex6e
x65x74x2fx63x64x6ex2dx69x6dx67x2ex65x61x73x79x69
x63x6fx6ex2ex63x6ex2fx66x69x6cx65x73x2fx31x31x33
x2fx31x31x33x37x30x33x38x2ex70x6ex67xa4xb3xebx9e
x00x00x00x00x49x45x4ex44xaex42x60x82
"

qt_resource_name = b"
x00x09
x09x5cx33xc3
x00x71
x00x72x00x63x00x5fx00x66x00x69x00x6cx00x65x00x73
x00x08
x06xe1x5ax27
x00x64
x00x6fx00x77x00x6ex00x2ex00x70x00x6ex00x67
"

qt_resource_struct_v1 = b"
x00x00x00x00x00x02x00x00x00x01x00x00x00x01
x00x00x00x00x00x02x00x00x00x01x00x00x00x02
x00x00x00x18x00x00x00x00x00x01x00x00x00x00
"

qt_resource_struct_v2 = b"
x00x00x00x00x00x02x00x00x00x01x00x00x00x01
x00x00x00x00x00x00x00x00
x00x00x00x00x00x02x00x00x00x01x00x00x00x02
x00x00x00x00x00x00x00x00
x00x00x00x18x00x00x00x00x00x01x00x00x00x00
x00x00x01x6bxb0xb6x90x86
"

qt_version = [int(v) for v in QtCore.qVersion().split('.')]
if qt_version < [5, 8, 0]:
    rcc_version = 1
    qt_resource_struct = qt_resource_struct_v1
else:
    rcc_version = 2
    qt_resource_struct = qt_resource_struct_v2

def qInitResources():
    QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

def qCleanupResources():
    QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)

qInitResources()

  入口文件iuMusic.py内容如下:

# -*- coding: utf-8 -*-
# Nola

import sys
import os
from PyQt5 import QtWidgets, QtMultimedia, QtCore
from PyQt5.QtGui import QIcon
from music_button import Ui_MainWindow
from qrc_files import pause, play
import random

current_dir = os.path.dirname(os.path.abspath(__file__))
music_dir = current_dir + r'music_datas'
music_files = os.listdir(music_dir)

class MyPlayer(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MyPlayer, self).__init__()
        self.setupUi(self)
        self.setWindowTitle("Umusic")
        self.setWindowIcon(QIcon("MusicCloud.ico"))
        self.playlist = QtMultimedia.QMediaPlaylist()  # 播放列表
        self.playlist.setPlaybackMode(QtMultimedia.QMediaPlaylist.Loop)  # 列表循环
        self.played = QtMultimedia.QMediaPlayer()
        self.played.setPlaylist(self.playlist)
        self.played.setVolume(50.0)
        self.current_index = random.randint(0, len(music_files) - 1)
        self.music_path = [(music_dir + '\' + music_file) for music_file in music_files]

    def pushButton_1_click(self):
        """上一曲"""
        self.current_index = self.playlist.currentIndex()
        self.current_index -= 1 if self.current_index != 0 else (len(music_files) - 1)
        self.music_file = music_files[self.current_index]
        self.music_path = music_dir + '\' + self.music_file
        self.playlist.setCurrentIndex(self.current_index)
        # self.played.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(music_files[self.current_index])))
        self.statusBar().showMessage('播放 --> %s' % self.music_file)
        self.played.play()


    def pushButton_2_click(self):
        """播放/暂停"""
        for m in self.music_path:
            self.playlist.addMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(m)))
        # self.playlist.setPlaybackMode(QtMultimedia.QMediaPlaylist.Loop)
        self.playlist.setCurrentIndex(self.current_index)
        if self.pushButton_2.status == 0:
            self.pushButton_2.setStyleSheet("border-image: url(:/qrc_files/pause.png);")
            self.pushButton_2.status = 1
            self.statusBar().showMessage('播放 --> %s' % music_files[self.playlist.currentIndex()]) # TODO 循环时不显示歌名
            self.played.play()

        elif self.pushButton_2.status == 1:
            self.pushButton_2.setStyleSheet("border-image: url(:/qrc_files/play.png);")
            self.pushButton_2.status = 0
            self.statusBar().showMessage('暂停')   # TODO 暂停再播放重新开始播放这首歌,不是从暂停播放进度那刻接着播放
            self.played.pause()
        else:
            self.statusBar().showMessage('未知')

    def pushButton_3_click(self):
        """下一曲"""
        # self.current_index += 1 if self.current_index != (len(music_files) - 1) else 0
        self.current_index = self.playlist.currentIndex()
        self.current_index += 1 if self.current_index != (len(music_files) - 1) else 0
        
        self.music_file = music_files[self.current_index]
        self.music_path = music_dir + '\' + self.music_file
        self.playlist.setCurrentIndex(self.current_index)
        # self.played.setMedia(QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(music_files[self.current_index])))
        self.statusBar().showMessage('播放 --> %s' % self.music_file)
        self.played.play()

    def keyPressEvent(self, e):  # 替换事件处理器函数
        if e.key() == QtCore.Qt.Key_Q:  # 按下q退出程序
            self.close()



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    player = MyPlayer()
    player.move(1000, 600)
    player.show()
    sys.exit(app.exec_())

  music_datas目录放了一些自己喜欢的歌:

  

   PyCharm配置QtDesigner扩展工具,可参考这篇博文~

   

  

原文地址:https://www.cnblogs.com/NolaLi/p/11139550.html