按照自己思路简单写了个桌面播放器,只有自己喜欢的歌。使用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扩展工具,可参考这篇博文~