├── .gitignore ├── LICENSE ├── README.md ├── icon ├── addlist.png ├── back2.jpg ├── download.png ├── index.ico ├── list.png ├── male.png ├── music.png ├── next.png ├── ok.png ├── pause.png ├── play.png ├── plus.png ├── prev.png ├── search.png ├── stop.png ├── vol_max.png ├── vol_medium.png └── vol_mute.png ├── index.py ├── musicform.py ├── search.py ├── searchform.py ├── songlist.py └── widget.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 FNgrey 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # - 2 | 基于网易云api的python+pyqt5实现的简单音乐播放器 3 | 主文件index.py 4 | 次文件search.py 5 | 其余为界面文件 6 | 主要完成的是音乐播放器的搜索、列表、循环播放 7 | 未完成左侧存储歌单、用户登录、批量操作 8 | -------------------------------------------------------------------------------- /icon/addlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/addlist.png -------------------------------------------------------------------------------- /icon/back2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/back2.jpg -------------------------------------------------------------------------------- /icon/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/download.png -------------------------------------------------------------------------------- /icon/index.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/index.ico -------------------------------------------------------------------------------- /icon/list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/list.png -------------------------------------------------------------------------------- /icon/male.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/male.png -------------------------------------------------------------------------------- /icon/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/music.png -------------------------------------------------------------------------------- /icon/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/next.png -------------------------------------------------------------------------------- /icon/ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/ok.png -------------------------------------------------------------------------------- /icon/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/pause.png -------------------------------------------------------------------------------- /icon/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/play.png -------------------------------------------------------------------------------- /icon/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/plus.png -------------------------------------------------------------------------------- /icon/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/prev.png -------------------------------------------------------------------------------- /icon/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/search.png -------------------------------------------------------------------------------- /icon/stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/stop.png -------------------------------------------------------------------------------- /icon/vol_max.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/vol_max.png -------------------------------------------------------------------------------- /icon/vol_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/vol_medium.png -------------------------------------------------------------------------------- /icon/vol_mute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FNgrey/musicplayer/5124f84f2894a3f41e5ddc95f8d1521d58d73cf7/icon/vol_mute.png -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from PyQt5 import QtWidgets 3 | from PyQt5.QtWidgets import QWidget 4 | 5 | from PyQt5.QtGui import QPixmap,QIcon,QPainter,QCursor 6 | from PyQt5.QtCore import QSize,Qt,pyqtSignal,QObject,QTimer 7 | import search,pygame,json 8 | # (form_class, qtbase_class) = uic.loadUiType('widget.ui') 9 | # (form_class2, qtbase_class2) = uic.loadUiType('searchform.ui') 10 | # (form_class3, qtbase_class3) = uic.loadUiType('songlist.ui') 11 | # (form_class4, qtbase_class4) = uic.loadUiType('musicform.ui') 12 | from widget import Ui_widget 13 | from searchform import Ui_searchForm 14 | from songlist import Ui_SongList 15 | from musicform import Ui_MusicForm 16 | class PlaySignal(QObject): 17 | instance = None 18 | signal = pyqtSignal(list,int) 19 | @classmethod 20 | def my_signal(cls): 21 | if cls.instance: 22 | return cls.instance 23 | else: 24 | obj = cls() 25 | cls.instance = obj 26 | return cls.instance 27 | def em(self,list,int): 28 | self.signal.emit(list,int) 29 | class Widget(QWidget, Ui_widget): 30 | playsignal = PlaySignal().my_signal().signal 31 | def __init__(self): 32 | super(Widget, self).__init__() 33 | self.setupUi(self) 34 | pygame.mixer.init() 35 | pygame.mixer.music.set_volume(0.5) 36 | self.setFixedSize(self.width(), self.height()) 37 | self.setAutoFillBackground(True) 38 | self.playpress = True #play按键状态 39 | self.musicpress = False #单曲子窗口按钮状态 40 | self.j = 0 41 | self.newtime = 0 #当前播放时间 42 | self.maxtime = 0 #单首歌曲时间 43 | self.musiclist = [] #歌曲播放列表 44 | self.searchform = SearchForm() #搜索子窗口 45 | self.musicform = MusicForm() #单曲子窗口 46 | self.timer = QTimer(self) 47 | self.songlistform.close() #初始化时隐藏播放列表 48 | self.soundslider.close() #隐藏声音滑块 49 | self.songslider.setMinimum(0) 50 | self.songslider.setSingleStep(1000) 51 | self.listbutton.clicked[bool].connect(self.ShowSongList) 52 | self.playbutton.clicked.connect(self.SetPlayButton) 53 | self.playsignal.connect(self.SetSongButoon) 54 | self.nextbutton.clicked.connect(self.NextMusic) 55 | self.prevbutton.clicked.connect(self.PrevMusic) 56 | self.artimglabel.clicked.connect(self.ShowMusicForm) 57 | self.soundslider.valueChanged.connect(self.ChangeSound) 58 | self.soundbutton.clicked[bool].connect(self.ShowSound) 59 | self.timer.start(1000) 60 | self.timer.timeout.connect(self.TimerEnd) 61 | def paintEvent(self,event): 62 | painter = QPainter(self) 63 | pixmap = QPixmap("./icon/back2.jpg") 64 | painter.drawPixmap(self.rect(), pixmap) 65 | #返回时间的str形式 66 | def CalTime(self,time): 67 | Stime = int(time/1000) 68 | stime = Stime%60 69 | mtime = int((Stime-stime)/60) 70 | return str(mtime)+':'+str(stime).zfill(2) 71 | #设置每一秒结束后的操作 72 | def TimerEnd(self): 73 | if self.maxtime !=0: 74 | if self.playpress: 75 | self.newtime += 1000 76 | self.songslider.setValue(self.newtime) 77 | self.nowtime.setText(self.CalTime(self.newtime)) 78 | if self.newtime >= self.maxtime & self.maxtime != 0: 79 | self.NextMusic() 80 | #设置单曲播放图片、歌名、歌手 /传入'song - art' 81 | def SetFL(self,music): 82 | self.artimglabel.setIcon(QIcon('./art/{}.jpg'.format(music))) 83 | self.songlabel.setText(music.split(' - ')[0]) 84 | self.artlabel.setText(music.split(' - ')[1]) 85 | self.musicform.artimg.setPixmap(QPixmap('./art/{}.jpg'.format(music))) 86 | self.musicform.songlabel.setText(music.split(' - ')[0]) 87 | self.musicform.artlabel.setText(music.split(' - ')[1]) 88 | try: 89 | with open('./lyric/{}.txt'.format(music),'r',encoding='utf8') as f: 90 | lyric = json.loads(f.read())['lrc']['lyric'] 91 | self.musicform.lyric.setPlainText(lyric) 92 | except(FileNotFoundError,KeyError): 93 | self.musicform.lyric.setPlainText('无此歌曲歌词') 94 | #设置进度条及其他时间 95 | def SetMaxTime(self,time): 96 | self.maxtime = time 97 | self.songslider.setMaximum(time) 98 | Stime = int(time/1000) 99 | stime = Stime%60 100 | mtime = int((Stime-stime)/60) 101 | self.endtime.setText(str(mtime)+':'+str(stime).zfill(2)) 102 | #自定义信号函数0:增加音乐列表;1:播放 103 | def SetSongButoon(self,message,ltype): 104 | if ltype == 1: 105 | self.newtime = 0 106 | self.nowmusic = [message[0] + ' - ' + message[2],message[-2]] 107 | self.playpress = False 108 | self.SetMaxTime(message[-2]) 109 | self.SetPlayButton() 110 | self.SetFL('{} - {}'.format(message[0],message[2])) 111 | self.AddSongList(message) 112 | #加入列表 113 | def AddSongList(self,message): 114 | musicname = message[0]+' - '+message[2] 115 | if self.JudgeList(musicname) != -1: 116 | return 117 | self.musiclist.append([message[0]+' - '+message[2],message[-2]]) 118 | self.songlistform.addItem(self.musiclist[self.j][0]) 119 | self.j +=1 120 | # pygame.mixer.music.queue(self.musiclist[self.j]) 121 | #判断歌曲是否在音乐列表中 122 | def JudgeList(self,musicname): 123 | if self.songlistform.count() == 0: 124 | return -1 125 | for i in range(self.songlistform.count()): 126 | if self.songlistform.item(i).text() == musicname: 127 | return i 128 | else: 129 | return -1 130 | #判断是否显示音乐列表 131 | def ShowSongList(self,pressed): 132 | if pressed: 133 | self.songlistform.show() 134 | else: 135 | self.songlistform.close() 136 | #下一首键 137 | def NextMusic(self): 138 | try: 139 | music = self.nowmusic[0] 140 | i = self.JudgeList(music) 141 | try: 142 | self.nowmusic = self.musiclist[i+1] 143 | except(IndexError): 144 | self.nowmusic = self.musiclist[0] 145 | self.newtime = 0 146 | self.nowtime.setText(self.CalTime(self.newtime)) 147 | self.songslider.setValue(self.newtime) 148 | search.PlayMusic('{}.mp3'.format(self.nowmusic[0])) 149 | self.SetMaxTime(self.nowmusic[1]) 150 | self.SetFL(self.nowmusic[0]) 151 | except(AttributeError): 152 | pass 153 | def PrevMusic(self): 154 | try: 155 | music = self.nowmusic[0] 156 | i = self.JudgeList(music) 157 | try: 158 | self.nowmusic = self.musiclist[i-1] 159 | except(IndexError): 160 | self.nowmusic = self.musiclist[-1] 161 | self.newtime = 0 162 | self.nowtime.setText(self.CalTime(self.newtime)) 163 | self.songslider.setValue(self.newtime) 164 | search.PlayMusic('{}.mp3'.format(self.nowmusic[0])) 165 | self.SetMaxTime(self.nowmusic[1]) 166 | self.SetFL(self.nowmusic[0]) 167 | except(AttributeError): 168 | pass 169 | def ChangeSound(self): 170 | sound=self.soundslider.value()/100 171 | pygame.mixer.music.set_volume(sound) 172 | def ShowSound(self,press): 173 | if press: 174 | self.soundslider.show() 175 | else: 176 | self.soundslider.close() 177 | #单音乐窗口 178 | def ShowMusicForm(self): 179 | self.mainLayout.addWidget(self.musicform,0,0) 180 | if not self.musicpress: 181 | self.searchform.songlist.close() 182 | self.musicform.show() 183 | self.musicpress = True 184 | else: 185 | self.musicform.close() 186 | self.searchform.songlist.show() 187 | self.musicpress = False 188 | 189 | #搜索按钮 190 | def search(self): 191 | self.mainLayout.addWidget(self.searchform.songlist,0,0) 192 | self.musicform.close() 193 | self.musicpress = False 194 | self.searchform.show() 195 | def download(self): 196 | pass 197 | def player(self): 198 | pass 199 | def SetPlayButton(self): 200 | if self.playpress: 201 | self.playbutton.setIcon(QIcon('./icon/play.png')) 202 | self.playpress = False 203 | pygame.mixer.music.pause() 204 | # self.timer.stop() 205 | else: 206 | self.playbutton.setIcon(QIcon('./icon/pause.png')) 207 | self.playpress = True 208 | pygame.mixer.music.unpause() 209 | class SearchForm(QWidget, Ui_searchForm): 210 | def __init__(self): 211 | super(SearchForm, self).__init__() 212 | self.setupUi(self) 213 | self.songlist = SongList() 214 | self.mtype = 1 215 | self.pushButton.clicked.connect(self.enter) 216 | self.exitbutton.clicked.connect(self.close) 217 | def enter(self): 218 | self.songlist.listWidget.clear() 219 | self.searchname = self.lineEdit.text() 220 | if self.songbutton.isChecked(): 221 | self.mtype = 1 222 | if self.artbutton.isChecked(): 223 | self.mtype = 100 224 | if self.playlistbutton.isChecked(): 225 | self.mtype = 1000 226 | if self.playerbutton.isChecked(): 227 | self.mtype = 1002 228 | self.songlist.mtype = self.mtype 229 | self.getdata = search.GetData(self.mtype,self.searchname) 230 | self.message = self.getdata.Search() 231 | self.songlist.AddConsole(self.message,self.mtype) 232 | self.songlist.show() 233 | self.close() 234 | def paintEvent(self,event): 235 | painter = QPainter(self) 236 | pixmap = QPixmap("./icon/back2.jpg") 237 | painter.drawPixmap(self.rect(), pixmap) 238 | class SongList(QWidget, Ui_SongList): 239 | def __init__(self): 240 | super(SongList, self).__init__() 241 | self.setupUi(self) 242 | self.mtype = 1 #列表类型 243 | self.num = 0 244 | self.listWidget.itemClicked.connect(self.ClickPlaylist) 245 | def ClickPlaylist(self,item): 246 | if self.mtype == 1000: 247 | for i in range(self.listWidget.count()): 248 | if(item == self.listWidget.item(i)): 249 | self.message = search.GetData.ShowSongList(self.message[i][1]) 250 | self.AddConsole(self.message,1) 251 | self.show() 252 | self.mtype = 1 253 | if self.mtype == 1002: 254 | for i in range(self.listWidget.count()): 255 | if(item == self.listWidget.item(i)): 256 | self.message = search.GetData.ShowPlayerList(self.message[i][1]) 257 | self.AddConsole(self.message,1000) 258 | self.show() 259 | self.mtype = 1000 260 | if self.mtype == 100: 261 | for i in range(self.listWidget.count()): 262 | if(item == self.listWidget.item(i)): 263 | self.message = search.GetData.ShowArtList(self.message[i][1]) 264 | self.AddConsole(self.message,1) 265 | self.show() 266 | self.mtype = 1 267 | #子函数将一行的内容加入栅栏 268 | def AddLayout(self,*parameter): 269 | self.gridlayout = QtWidgets.QGridLayout() 270 | for i in range(len(parameter)): 271 | self.gridlayout.addWidget(parameter[i],0,i) 272 | #子函数将栅栏与窗口进行连接 273 | def ShowLayout(self): 274 | self.widget2 = QtWidgets.QWidget() 275 | self.widget2.setLayout(self.gridlayout) 276 | self.listwidgetitem = QtWidgets.QListWidgetItem() 277 | self.listwidgetitem.setSizeHint(QSize(40,40)) 278 | self.listWidget.addItem(self.listwidgetitem) 279 | self.listWidget.setItemWidget(self.listwidgetitem,self.widget2) 280 | #音乐列表窗口增加控件(搜索) 281 | def AddSongList(self,mlist): 282 | self.num += 1 283 | self.number = QtWidgets.QLabel(str(self.num).zfill(2)) 284 | self.play = QtWidgets.QToolButton() 285 | self.play.setToolButtonStyle(Qt.ToolButtonIconOnly) 286 | self.play.setIconSize(QSize(20,20)) 287 | self.play.setIcon(QIcon('./icon/play.png')) 288 | self.play.setStyleSheet('background-color:transparent') 289 | self.play.setCursor(QCursor(Qt.PointingHandCursor)) 290 | self.download = QtWidgets.QToolButton() 291 | self.download.setToolButtonStyle(Qt.ToolButtonIconOnly) 292 | self.download.setIconSize(QSize(20,20)) 293 | self.download.setIcon(QIcon('./icon/download.png')) 294 | self.download.setStyleSheet('background-color:transparent') 295 | self.download.setCursor(QCursor(Qt.PointingHandCursor)) 296 | self.addlist = QtWidgets.QToolButton() 297 | self.addlist.setToolButtonStyle(Qt.ToolButtonIconOnly) 298 | self.addlist.setIconSize(QSize(20,20)) 299 | self.addlist.setIcon(QIcon('./icon/addlist.png')) 300 | self.addlist.setStyleSheet('background-color:transparent') 301 | self.addlist.setCursor(QCursor(Qt.PointingHandCursor)) 302 | self.songlabel = QtWidgets.QLabel(mlist[0]) 303 | self.artlabel = QtWidgets.QLabel(mlist[2]) 304 | self.albumlabel = QtWidgets.QLabel(mlist[4]) 305 | self.number.setFixedSize(30,20) 306 | self.songlabel.setFixedSize(270,20) 307 | self.artlabel.setFixedSize(180,20) 308 | self.albumlabel.setFixedSize(180,20) 309 | 310 | Stime = int(mlist[-2]/1000) 311 | stime = Stime%60 312 | mtime = int((Stime-stime)/60) 313 | 314 | self.songtimelabel = QtWidgets.QLabel(str(mtime)+':'+str(stime).zfill(2)) 315 | self.download.clicked[bool].connect(self.SDownload) 316 | self.play.clicked.connect(self.SPlay) 317 | self.addlist.clicked.connect(self.SAddList) 318 | # self.play.clicked.connect(PlaySignal.my_signal().em) 319 | def AddPlaylist(self,mlist): 320 | self.num += 1 321 | self.pname = QtWidgets.QLabel(mlist[0]) 322 | self.pcount = QtWidgets.QLabel(str(mlist[3])+'首') 323 | self.nickname = QtWidgets.QLabel('by '+mlist[2]) 324 | self.pname.setFixedSize(360,20) 325 | self.pcount.setFixedSize(80,20) 326 | self.nickname.setFixedSize(180,20) 327 | def AddPlayer(self,mlist): 328 | self.num += 1 329 | self.nicknames = QtWidgets.QLabel(mlist[0]) 330 | self.signature = QtWidgets.QLabel(mlist[3]) 331 | self.description = QtWidgets.QLabel(mlist[2]) 332 | self.nicknames.setFixedSize(180,20) 333 | self.description.setFixedSize(150,20) 334 | self.signature.setFixedSize(360,20) 335 | def AddArt(self,mlist): 336 | self.num += 1 337 | self.artname = QtWidgets.QLabel(mlist[0]) 338 | self.alias = QtWidgets.QLabel(mlist[2]) 339 | def SDownload(self): 340 | sender = self.sender() 341 | if not sender: 342 | return 343 | for i in range(self.listWidget.count()): 344 | if(sender.parentWidget() == self.listWidget.itemWidget(self.listWidget.item(i+1))): 345 | search.Download(self.message[i],1) 346 | sender.setIcon(QIcon('./icon/ok.png')) 347 | def SPlay(self): 348 | sender = self.sender() 349 | for i in range(self.listWidget.count()): 350 | if(sender.parentWidget() == self.listWidget.itemWidget(self.listWidget.item(i+1))): 351 | ND = search.PlayMusic('{} - {}.mp3'.format(self.message[i][0],self.message[i][2])) 352 | if ND == -1: 353 | search.Download(self.message[i]) 354 | search.PlayMusic('{} - {}.mp3'.format(self.message[i][0],self.message[i][2])) 355 | PlaySignal.my_signal().em(self.message[i],1) 356 | # self.playsender = 1 357 | def SAddList(self): 358 | sender = self.sender() 359 | for i in range(self.listWidget.count()): 360 | if(sender.parentWidget() == self.listWidget.itemWidget(self.listWidget.item(i+1))): 361 | ND = search.JudgeMusic('{} - {}.mp3'.format(self.message[i][0],self.message[i][2])) 362 | if ND == -1: 363 | search.Download(self.message[i]) 364 | PlaySignal.my_signal().em(self.message[i],0) 365 | def AddConsole(self,message,mtype): 366 | self.num = 0 367 | self.message = message 368 | self.listWidget.clear() 369 | if mtype == 1: 370 | a1 = QtWidgets.QLabel(' ') 371 | aplay = QtWidgets.QToolButton() 372 | aplay.setToolButtonStyle(Qt.ToolButtonIconOnly) 373 | aplay.setIconSize(QSize(20,20)) 374 | aplay.setIcon(QIcon('./icon/play.png')) 375 | aplay.setStyleSheet('background-color:transparent') 376 | adownload = QtWidgets.QToolButton() 377 | adownload.setToolButtonStyle(Qt.ToolButtonIconOnly) 378 | adownload.setIconSize(QSize(20,20)) 379 | adownload.setIcon(QIcon('./icon/download.png')) 380 | adownload.setStyleSheet('background-color:transparent') 381 | aaddlist = QtWidgets.QToolButton() 382 | aaddlist.setToolButtonStyle(Qt.ToolButtonIconOnly) 383 | aaddlist.setIconSize(QSize(20,20)) 384 | aaddlist.setIcon(QIcon('./icon/addlist.png')) 385 | aaddlist.setStyleSheet('background-color:transparent') 386 | a3 = QtWidgets.QLabel('音乐标题') 387 | a4 = QtWidgets.QLabel('歌手') 388 | a5 = QtWidgets.QLabel('专辑') 389 | a6 = QtWidgets.QLabel('时长') 390 | a1.setFixedSize(30,20) 391 | a3.setFixedSize(270,20) 392 | a4.setFixedSize(180,20) 393 | a5.setFixedSize(180,20) 394 | a6.setFixedSize(40,20) 395 | a3.setAlignment(Qt.AlignCenter) 396 | a4.setAlignment(Qt.AlignCenter) 397 | a5.setAlignment(Qt.AlignCenter) 398 | a3.setStyleSheet('border-width: 1px;border-style: solid;') 399 | a4.setStyleSheet('border-width: 1px;border-style: solid;') 400 | a5.setStyleSheet('border-width: 1px;border-style: solid;') 401 | a6.setStyleSheet('border-width: 1px;border-style: solid;') 402 | self.AddLayout(a1,aplay,adownload,aaddlist,a3,a4,a5,a6) 403 | self.ShowLayout() 404 | for mlist in message: 405 | self.AddSongList(mlist) 406 | self.AddLayout(self.number,self.play,self.download,self.addlist,self.songlabel,self.artlabel,self.albumlabel,self.songtimelabel) 407 | self.ShowLayout() 408 | for mlist in message: 409 | if mtype == 1000: 410 | self.AddPlaylist(mlist) 411 | self.AddLayout(self.pname,self.pcount,self.nickname) 412 | self.ShowLayout() 413 | if mtype == 1002: 414 | self.AddPlayer(mlist) 415 | self.AddLayout(self.nicknames,self.signature,self.description) 416 | self.ShowLayout() 417 | if mtype == 100: 418 | self.AddArt(mlist) 419 | self.AddLayout(self.artname,self.alias) 420 | self.ShowLayout() 421 | 422 | 423 | 424 | 425 | class MusicForm(QWidget, Ui_MusicForm): 426 | def __init__(self): 427 | super(MusicForm, self).__init__() 428 | self.setupUi(self) 429 | if __name__ == "__main__": 430 | app = QtWidgets.QApplication(sys.argv) 431 | ui = Widget() 432 | ui.show() 433 | sys.exit(app.exec_()) 434 | -------------------------------------------------------------------------------- /musicform.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'musicform.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.6 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_MusicForm(object): 12 | def setupUi(self, MusicForm): 13 | MusicForm.setObjectName("MusicForm") 14 | MusicForm.resize(871, 511) 15 | MusicForm.setStyleSheet("") 16 | self.artimg = QtWidgets.QLabel(MusicForm) 17 | self.artimg.setGeometry(QtCore.QRect(40, 60, 300, 300)) 18 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 19 | sizePolicy.setHorizontalStretch(0) 20 | sizePolicy.setVerticalStretch(0) 21 | sizePolicy.setHeightForWidth(self.artimg.sizePolicy().hasHeightForWidth()) 22 | self.artimg.setSizePolicy(sizePolicy) 23 | self.artimg.setText("") 24 | self.artimg.setPixmap(QtGui.QPixmap("icon/music.png")) 25 | self.artimg.setScaledContents(True) 26 | self.artimg.setObjectName("artimg") 27 | self.songlabel = QtWidgets.QLabel(MusicForm) 28 | self.songlabel.setGeometry(QtCore.QRect(460, 30, 321, 61)) 29 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 30 | sizePolicy.setHorizontalStretch(0) 31 | sizePolicy.setVerticalStretch(0) 32 | sizePolicy.setHeightForWidth(self.songlabel.sizePolicy().hasHeightForWidth()) 33 | self.songlabel.setSizePolicy(sizePolicy) 34 | self.songlabel.setStyleSheet("font-family : 黑体;\n" 35 | "font-size : 15pt;") 36 | self.songlabel.setTextFormat(QtCore.Qt.AutoText) 37 | self.songlabel.setAlignment(QtCore.Qt.AlignCenter) 38 | self.songlabel.setWordWrap(True) 39 | self.songlabel.setObjectName("songlabel") 40 | self.artlabel = QtWidgets.QLabel(MusicForm) 41 | self.artlabel.setGeometry(QtCore.QRect(460, 90, 321, 30)) 42 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 43 | sizePolicy.setHorizontalStretch(0) 44 | sizePolicy.setVerticalStretch(0) 45 | sizePolicy.setHeightForWidth(self.artlabel.sizePolicy().hasHeightForWidth()) 46 | self.artlabel.setSizePolicy(sizePolicy) 47 | self.artlabel.setAlignment(QtCore.Qt.AlignCenter) 48 | self.artlabel.setObjectName("artlabel") 49 | self.lyric = QtWidgets.QTextEdit(MusicForm) 50 | self.lyric.setGeometry(QtCore.QRect(390, 130, 441, 341)) 51 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) 52 | sizePolicy.setHorizontalStretch(0) 53 | sizePolicy.setVerticalStretch(0) 54 | sizePolicy.setHeightForWidth(self.lyric.sizePolicy().hasHeightForWidth()) 55 | self.lyric.setSizePolicy(sizePolicy) 56 | font = QtGui.QFont() 57 | font.setFamily("微软雅黑") 58 | font.setPointSize(12) 59 | self.lyric.setFont(font) 60 | self.lyric.setStyleSheet("background-color:transparent;\n" 61 | "text-align:cente;") 62 | self.lyric.setLineWidth(1) 63 | self.lyric.setReadOnly(True) 64 | self.lyric.setObjectName("lyric") 65 | 66 | self.retranslateUi(MusicForm) 67 | QtCore.QMetaObject.connectSlotsByName(MusicForm) 68 | 69 | def retranslateUi(self, MusicForm): 70 | _translate = QtCore.QCoreApplication.translate 71 | MusicForm.setWindowTitle(_translate("MusicForm", "Form")) 72 | self.songlabel.setText(_translate("MusicForm", "歌曲")) 73 | self.artlabel.setText(_translate("MusicForm", "歌手")) 74 | self.lyric.setHtml(_translate("MusicForm", "\n" 75 | "
\n" 78 | "