• 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扩展工具,可参考这篇博文~

       

      

  • 相关阅读:
    BestCoder Round #32
    USACO Runaround Numbers
    USACO Subset Sums
    USACO Sorting a Three-Valued Sequence
    USACO Ordered Fractions
    USACO 2.1 The Castle
    Codeforces Round #252 (Div. 2)
    Codeforces Round #292 (Div. 2)
    BZOJ 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居
    BZOJ 1603: [Usaco2008 Oct]打谷机
  • 原文地址:https://www.cnblogs.com/NolaLi/p/11139550.html
Copyright © 2020-2023  润新知