├── .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 | "


")) 79 | 80 | -------------------------------------------------------------------------------- /search.py: -------------------------------------------------------------------------------- 1 | import os 2 | import urllib.request,urllib.parse,json 3 | import pygame 4 | class GetData(): 5 | def __init__(self,mtype,message): 6 | self.limit = 100 7 | self.mtype = mtype 8 | self.message = message 9 | self.ua_header = { 10 | "Host":"music.163.com", 11 | "User-Agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36", 12 | "Referer":"http://music.163.com", 13 | "Cookie":"appver=1.5.0.75771" 14 | } 15 | self.searchurl = 'http://music.163.com/api/search/pc' 16 | self.data={ 17 | "hlpretag":"", 18 | "hlposttag":"", 19 | "s":message, 20 | "offset":0, 21 | "total":"true", 22 | "limit":self.limit, 23 | "type":mtype 24 | } 25 | #调度搜索 26 | def Search(self): 27 | message = '' 28 | try: 29 | self.url ='http://music.163.com/api/search/pc' 30 | self.data=urllib.parse.urlencode(self.data).encode() 31 | request = urllib.request.Request(url=self.url,data=self.data,headers=self.ua_header) 32 | response = urllib.request.urlopen(request) 33 | stexts = response.read().decode("utf8") 34 | stexts = json.loads(stexts) 35 | if self.mtype ==1: 36 | message = self.Song(stexts['result']['songs']) 37 | if self.mtype == 100: 38 | message = self.Art(stexts['result']['artists']) 39 | if self.mtype == 1000: 40 | message = self.Playlist(stexts['result']['playlists']) 41 | if self.mtype == 1002: 42 | message = self.Player(stexts['result']['userprofiles']) 43 | if self.mtype == 1006: 44 | self.Lyric() 45 | except: 46 | pass 47 | return message 48 | #爬取GET并返回message列表 49 | @classmethod 50 | def PGet(self,purl): 51 | ua_header = { 52 | "Host":"music.163.com", 53 | "User-Agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36", 54 | "Referer":"http://music.163.com", 55 | "Cookie":"appver=1.5.0.75771"} 56 | request = urllib.request.Request(url=purl,headers=ua_header) 57 | response = urllib.request.urlopen(request) 58 | stexts = response.read().decode("utf8") 59 | return json.loads(stexts) 60 | @classmethod 61 | def Song(self,texts): 62 | smessage = [] 63 | try: 64 | for i in texts: 65 | if i['hMusic']: 66 | songtime = int(i['hMusic']['playTime']) 67 | elif i['mMusic']: 68 | songtime = int(i['mMusic']['playTime']) 69 | elif i['lMusic']: 70 | songtime = int(i['lMusic']['playTime']) 71 | else: 72 | songtime = int(i['bMusic']['playTime']) 73 | songname = i['name'] 74 | songid = i['id'] 75 | artname = i['artists'][0]['name'] 76 | artid = i['artists'][0]['id'] 77 | arturl = i["album"]["blurPicUrl"] 78 | album = i['album']['name'] 79 | albumid = i['album']['id'] 80 | songname = songname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 81 | artname = artname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 82 | album = album.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 83 | smessage.append([songname,songid,artname,artid,album,albumid,songtime,arturl]) 84 | except: 85 | pass 86 | return smessage 87 | def Art(self,texts): 88 | pmessage = [] 89 | try: 90 | for i in texts: 91 | pname = i['name'] 92 | pid = i['id'] 93 | try: 94 | alias = i['alias'][0] 95 | except: 96 | alias = '' 97 | pname = pname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 98 | alias = alias.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 99 | pmessage.append([pname,pid,alias]) 100 | except: 101 | pass 102 | return pmessage 103 | #提取歌单中的元素 104 | @classmethod 105 | def Playlist(self,texts): 106 | pmessage = [] 107 | try: 108 | for i in texts: 109 | pname = i['name'] 110 | pid = i['id'] 111 | pimgurl = i["coverImgUrl"] 112 | nickname = i['creator']['nickname'] 113 | trackCount = i['trackCount'] 114 | pname = pname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 115 | nickname = nickname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 116 | pmessage.append([pname,pid,nickname,trackCount,pimgurl]) 117 | except: 118 | pass 119 | return pmessage 120 | #用户列表 121 | def Player(self,texts): 122 | pmessage = [] 123 | try: 124 | for i in texts: 125 | nickname = i['nickname'] 126 | userId = i['userId'] 127 | description = i['description'] 128 | signature = i['signature'] 129 | nickname = nickname.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 130 | description = description.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 131 | signature = signature.replace('/','&').replace('<','《').replace('>','》').replace(':',':').replace('*',' ').replace('?','?').replace('|','&').replace('\\','\\') 132 | pmessage.append([nickname,userId,description,signature]) 133 | except: 134 | pass 135 | return pmessage 136 | #显示选取歌单中的列表 137 | @classmethod 138 | def ShowSongList(self,pid): 139 | purl = 'http://music.163.com/api/playlist/detail?id={}&updateTime=-1'.format(str(pid)) 140 | stexts=self.PGet(purl) 141 | return self.Song(stexts['result']['tracks']) 142 | #显示选取用户的歌单 143 | @classmethod 144 | def ShowPlayerList(self,pid): 145 | purl = 'http://music.163.com/api/user/playlist/?offset=0&limit=1001&uid={}'.format(str(pid)) 146 | stexts = self.PGet(purl) 147 | return self.Playlist(stexts['playlist']) 148 | #显示歌手的歌单列表 149 | @classmethod 150 | def ShowArtList(self,pid): 151 | purl = 'http://music.163.com/api/artist/'+str(pid) 152 | stexts = self.PGet(purl) 153 | return self.Song(stexts['hotSongs']) 154 | def Lyric(self): 155 | pass 156 | #下载音乐 157 | def Download(mlist,ftype=0): 158 | url = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(mlist[1]) 159 | header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.138 Safari/537.36"} 160 | name = '{} - {}'.format(mlist[0],mlist[2]) 161 | if ftype == 0: 162 | addr = 'cookie' 163 | else: addr = 'download' 164 | if not os.path.exists('./'+addr): 165 | os.mkdir(addr) 166 | if not os.path.exists('./{}/{}.mp3'.format(addr,name)): 167 | request = urllib.request.Request(url=url,headers=header) 168 | response = urllib.request.urlopen(request) 169 | with open('./{}/{}.mp3'.format(addr,name),'wb') as f: 170 | f.write(response.read()) 171 | if not os.path.exists('./art'): 172 | os.mkdir('./art') 173 | if not os.path.exists('./art/{}.jpg'.format(name)): 174 | artrequest = urllib.request.Request(url=mlist[-1],headers=header) 175 | artresponse = urllib.request.urlopen(artrequest) 176 | with open('./art/{}.jpg'.format(name),'wb') as f1: 177 | f1.write(artresponse.read()) 178 | if not os.path.exists('./lyric'): 179 | os.mkdir('./lyric') 180 | if not os.path.exists('./lyric/{}.txt'.format(name)): 181 | lyricurl="http://music.163.com/api/song/lyric?os=pc&id={}&lv=-1&kv=-1&tv=-1".format(mlist[1]) 182 | lrequest = urllib.request.Request(url=lyricurl,headers=header) 183 | lresponse = urllib.request.urlopen(lrequest) 184 | with open('./lyric/{}.txt'.format(name),"w",encoding="utf8") as f2: 185 | f2.write(lresponse.read().decode("utf8")) 186 | #播放音乐 187 | def PlayMusic(songname): 188 | file = JudgeMusic(songname) 189 | if file == -1: 190 | return -1 191 | track = pygame.mixer.music.load(file) 192 | pygame.mixer.music.play(1) 193 | #选择播放音乐目录 194 | def JudgeMusic(songname): 195 | if os.path.exists('./cookie/'+songname): 196 | return './cookie/'+songname 197 | elif os.path.exists('./download/'+songname): 198 | return './download/'+songname 199 | else: 200 | return -1 201 | #getdata = GetData(1,"难得") 202 | #message = getdata.Search() 203 | #print(message) 204 | -------------------------------------------------------------------------------- /searchform.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'searchform.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_searchForm(object): 12 | def setupUi(self, searchForm): 13 | searchForm.setObjectName("searchForm") 14 | searchForm.setWindowModality(QtCore.Qt.ApplicationModal) 15 | searchForm.resize(400, 300) 16 | icon = QtGui.QIcon() 17 | icon.addPixmap(QtGui.QPixmap("icon/search.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 18 | searchForm.setWindowIcon(icon) 19 | self.layoutWidget = QtWidgets.QWidget(searchForm) 20 | self.layoutWidget.setGeometry(QtCore.QRect(20, 110, 353, 69)) 21 | self.layoutWidget.setObjectName("layoutWidget") 22 | self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget) 23 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 24 | self.verticalLayout.setObjectName("verticalLayout") 25 | self.horizontalLayout = QtWidgets.QHBoxLayout() 26 | self.horizontalLayout.setObjectName("horizontalLayout") 27 | self.label = QtWidgets.QLabel(self.layoutWidget) 28 | self.label.setObjectName("label") 29 | self.horizontalLayout.addWidget(self.label) 30 | self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget) 31 | self.lineEdit.setObjectName("lineEdit") 32 | self.horizontalLayout.addWidget(self.lineEdit) 33 | self.pushButton = QtWidgets.QPushButton(self.layoutWidget) 34 | self.pushButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 35 | self.pushButton.setStyleSheet("background-color:white") 36 | self.pushButton.setObjectName("pushButton") 37 | self.horizontalLayout.addWidget(self.pushButton) 38 | self.verticalLayout.addLayout(self.horizontalLayout) 39 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 40 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 41 | self.songbutton = QtWidgets.QRadioButton(self.layoutWidget) 42 | self.songbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 43 | self.songbutton.setTabletTracking(False) 44 | self.songbutton.setAcceptDrops(False) 45 | self.songbutton.setAutoFillBackground(False) 46 | self.songbutton.setChecked(True) 47 | self.songbutton.setAutoRepeat(False) 48 | self.songbutton.setObjectName("songbutton") 49 | self.horizontalLayout_2.addWidget(self.songbutton) 50 | self.artbutton = QtWidgets.QRadioButton(self.layoutWidget) 51 | self.artbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 52 | self.artbutton.setObjectName("artbutton") 53 | self.horizontalLayout_2.addWidget(self.artbutton) 54 | self.playlistbutton = QtWidgets.QRadioButton(self.layoutWidget) 55 | self.playlistbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 56 | self.playlistbutton.setObjectName("playlistbutton") 57 | self.horizontalLayout_2.addWidget(self.playlistbutton) 58 | self.playerbutton = QtWidgets.QRadioButton(self.layoutWidget) 59 | self.playerbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 60 | self.playerbutton.setObjectName("playerbutton") 61 | self.horizontalLayout_2.addWidget(self.playerbutton) 62 | self.exitbutton = QtWidgets.QPushButton(self.layoutWidget) 63 | self.exitbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 64 | self.exitbutton.setStyleSheet("background-color:white") 65 | self.exitbutton.setObjectName("exitbutton") 66 | self.horizontalLayout_2.addWidget(self.exitbutton) 67 | self.verticalLayout.addLayout(self.horizontalLayout_2) 68 | 69 | self.retranslateUi(searchForm) 70 | QtCore.QMetaObject.connectSlotsByName(searchForm) 71 | 72 | def retranslateUi(self, searchForm): 73 | _translate = QtCore.QCoreApplication.translate 74 | searchForm.setWindowTitle(_translate("searchForm", "搜索")) 75 | self.label.setText(_translate("searchForm", "搜索:")) 76 | self.pushButton.setText(_translate("searchForm", "确认")) 77 | self.songbutton.setText(_translate("searchForm", "歌曲")) 78 | self.artbutton.setText(_translate("searchForm", "歌手")) 79 | self.playlistbutton.setText(_translate("searchForm", "歌单")) 80 | self.playerbutton.setText(_translate("searchForm", "用户")) 81 | self.exitbutton.setText(_translate("searchForm", "退出")) 82 | 83 | -------------------------------------------------------------------------------- /songlist.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'songlist.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_SongList(object): 12 | def setupUi(self, SongList): 13 | SongList.setObjectName("SongList") 14 | SongList.resize(871, 511) 15 | self.listWidget = QtWidgets.QListWidget(SongList) 16 | self.listWidget.setGeometry(QtCore.QRect(0, 0, 871, 511)) 17 | self.listWidget.setObjectName("listWidget") 18 | 19 | self.retranslateUi(SongList) 20 | QtCore.QMetaObject.connectSlotsByName(SongList) 21 | 22 | def retranslateUi(self, SongList): 23 | _translate = QtCore.QCoreApplication.translate 24 | SongList.setWindowTitle(_translate("SongList", "Form")) 25 | 26 | -------------------------------------------------------------------------------- /widget.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'widget.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_widget(object): 12 | def setupUi(self, widget): 13 | widget.setObjectName("widget") 14 | widget.resize(1018, 619) 15 | icon = QtGui.QIcon() 16 | icon.addPixmap(QtGui.QPixmap("icon/music.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 17 | widget.setWindowIcon(icon) 18 | widget.setStyleSheet("") 19 | self.listWidget = QtWidgets.QListWidget(widget) 20 | self.listWidget.setGeometry(QtCore.QRect(0, 50, 151, 441)) 21 | self.listWidget.setObjectName("listWidget") 22 | item = QtWidgets.QListWidgetItem() 23 | self.listWidget.addItem(item) 24 | self.gridLayoutWidget = QtWidgets.QWidget(widget) 25 | self.gridLayoutWidget.setGeometry(QtCore.QRect(140, 40, 891, 521)) 26 | self.gridLayoutWidget.setObjectName("gridLayoutWidget") 27 | self.mainLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) 28 | self.mainLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) 29 | self.mainLayout.setContentsMargins(11, 11, 11, 11) 30 | self.mainLayout.setSpacing(0) 31 | self.mainLayout.setObjectName("mainLayout") 32 | self.layoutWidget = QtWidgets.QWidget(widget) 33 | self.layoutWidget.setGeometry(QtCore.QRect(-20, 490, 171, 71)) 34 | self.layoutWidget.setObjectName("layoutWidget") 35 | self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget) 36 | self.gridLayout.setContentsMargins(11, 11, 11, 11) 37 | self.gridLayout.setSpacing(0) 38 | self.gridLayout.setObjectName("gridLayout") 39 | self.artimglabel = QtWidgets.QToolButton(self.layoutWidget) 40 | self.artimglabel.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 41 | self.artimglabel.setStyleSheet("background-color:transparent") 42 | self.artimglabel.setText("") 43 | self.artimglabel.setIcon(icon) 44 | self.artimglabel.setIconSize(QtCore.QSize(63, 63)) 45 | self.artimglabel.setCheckable(False) 46 | self.artimglabel.setObjectName("artimglabel") 47 | self.gridLayout.addWidget(self.artimglabel, 0, 1, 2, 1) 48 | self.songlabel = QtWidgets.QLabel(self.layoutWidget) 49 | self.songlabel.setText("") 50 | self.songlabel.setObjectName("songlabel") 51 | self.gridLayout.addWidget(self.songlabel, 0, 2, 1, 1) 52 | self.artlabel = QtWidgets.QLabel(self.layoutWidget) 53 | self.artlabel.setText("") 54 | self.artlabel.setObjectName("artlabel") 55 | self.gridLayout.addWidget(self.artlabel, 1, 2, 1, 1) 56 | self.layoutWidget1 = QtWidgets.QWidget(widget) 57 | self.layoutWidget1.setGeometry(QtCore.QRect(620, 0, 295, 31)) 58 | self.layoutWidget1.setObjectName("layoutWidget1") 59 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget1) 60 | self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) 61 | self.horizontalLayout.setContentsMargins(11, 11, 11, 11) 62 | self.horizontalLayout.setSpacing(6) 63 | self.horizontalLayout.setObjectName("horizontalLayout") 64 | self.searchbutton = QtWidgets.QPushButton(self.layoutWidget1) 65 | self.searchbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 66 | self.searchbutton.setStyleSheet("background-color:transparent") 67 | icon1 = QtGui.QIcon() 68 | icon1.addPixmap(QtGui.QPixmap("icon/search.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 69 | self.searchbutton.setIcon(icon1) 70 | self.searchbutton.setObjectName("searchbutton") 71 | self.horizontalLayout.addWidget(self.searchbutton) 72 | self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget1) 73 | self.pushButton_2.setCursor(QtGui.QCursor(QtCore.Qt.ForbiddenCursor)) 74 | self.pushButton_2.setStyleSheet("background-color:transparent") 75 | icon2 = QtGui.QIcon() 76 | icon2.addPixmap(QtGui.QPixmap("icon/download.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 77 | self.pushButton_2.setIcon(icon2) 78 | self.pushButton_2.setObjectName("pushButton_2") 79 | self.horizontalLayout.addWidget(self.pushButton_2) 80 | self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget1) 81 | self.pushButton_3.setCursor(QtGui.QCursor(QtCore.Qt.ForbiddenCursor)) 82 | self.pushButton_3.setStyleSheet("background-color:transparent") 83 | icon3 = QtGui.QIcon() 84 | icon3.addPixmap(QtGui.QPixmap("icon/male.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 85 | self.pushButton_3.setIcon(icon3) 86 | self.pushButton_3.setObjectName("pushButton_3") 87 | self.horizontalLayout.addWidget(self.pushButton_3) 88 | self.layoutWidget2 = QtWidgets.QWidget(widget) 89 | self.layoutWidget2.setGeometry(QtCore.QRect(0, 560, 1021, 61)) 90 | self.layoutWidget2.setObjectName("layoutWidget2") 91 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget2) 92 | self.horizontalLayout_2.setContentsMargins(11, 11, 11, 11) 93 | self.horizontalLayout_2.setSpacing(6) 94 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 95 | self.prevbutton = QtWidgets.QToolButton(self.layoutWidget2) 96 | self.prevbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 97 | self.prevbutton.setStyleSheet("background-color:transparent") 98 | self.prevbutton.setText("") 99 | icon4 = QtGui.QIcon() 100 | icon4.addPixmap(QtGui.QPixmap("icon/prev.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 101 | self.prevbutton.setIcon(icon4) 102 | self.prevbutton.setIconSize(QtCore.QSize(30, 30)) 103 | self.prevbutton.setObjectName("prevbutton") 104 | self.horizontalLayout_2.addWidget(self.prevbutton) 105 | self.playbutton = QtWidgets.QToolButton(self.layoutWidget2) 106 | self.playbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 107 | self.playbutton.setStyleSheet("background-color:transparent") 108 | self.playbutton.setText("") 109 | icon5 = QtGui.QIcon() 110 | icon5.addPixmap(QtGui.QPixmap("icon/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 111 | self.playbutton.setIcon(icon5) 112 | self.playbutton.setIconSize(QtCore.QSize(40, 40)) 113 | self.playbutton.setCheckable(True) 114 | self.playbutton.setObjectName("playbutton") 115 | self.horizontalLayout_2.addWidget(self.playbutton) 116 | self.nextbutton = QtWidgets.QToolButton(self.layoutWidget2) 117 | self.nextbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 118 | self.nextbutton.setStyleSheet("background-color:transparent") 119 | self.nextbutton.setText("") 120 | icon6 = QtGui.QIcon() 121 | icon6.addPixmap(QtGui.QPixmap("icon/next.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 122 | self.nextbutton.setIcon(icon6) 123 | self.nextbutton.setIconSize(QtCore.QSize(30, 30)) 124 | self.nextbutton.setObjectName("nextbutton") 125 | self.horizontalLayout_2.addWidget(self.nextbutton) 126 | self.nowtime = QtWidgets.QLabel(self.layoutWidget2) 127 | self.nowtime.setObjectName("nowtime") 128 | self.horizontalLayout_2.addWidget(self.nowtime) 129 | self.songslider = QtWidgets.QSlider(self.layoutWidget2) 130 | self.songslider.setMaximum(1) 131 | self.songslider.setSingleStep(0) 132 | self.songslider.setOrientation(QtCore.Qt.Horizontal) 133 | self.songslider.setObjectName("songslider") 134 | self.horizontalLayout_2.addWidget(self.songslider) 135 | self.endtime = QtWidgets.QLabel(self.layoutWidget2) 136 | self.endtime.setObjectName("endtime") 137 | self.horizontalLayout_2.addWidget(self.endtime) 138 | self.soundbutton = QtWidgets.QToolButton(self.layoutWidget2) 139 | self.soundbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 140 | self.soundbutton.setStyleSheet("background-color:transparent") 141 | self.soundbutton.setText("") 142 | icon7 = QtGui.QIcon() 143 | icon7.addPixmap(QtGui.QPixmap("icon/vol_medium.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 144 | self.soundbutton.setIcon(icon7) 145 | self.soundbutton.setCheckable(True) 146 | self.soundbutton.setObjectName("soundbutton") 147 | self.horizontalLayout_2.addWidget(self.soundbutton) 148 | self.listbutton = QtWidgets.QToolButton(self.layoutWidget2) 149 | self.listbutton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 150 | self.listbutton.setStyleSheet("background-color:transparent") 151 | self.listbutton.setText("") 152 | icon8 = QtGui.QIcon() 153 | icon8.addPixmap(QtGui.QPixmap("icon/list.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 154 | self.listbutton.setIcon(icon8) 155 | self.listbutton.setCheckable(True) 156 | self.listbutton.setObjectName("listbutton") 157 | self.horizontalLayout_2.addWidget(self.listbutton) 158 | self.songlistform = QtWidgets.QListWidget(widget) 159 | self.songlistform.setEnabled(True) 160 | self.songlistform.setGeometry(QtCore.QRect(775, 158, 231, 421)) 161 | self.songlistform.setStyleSheet("") 162 | self.songlistform.setObjectName("songlistform") 163 | self.soundslider = QtWidgets.QSlider(widget) 164 | self.soundslider.setGeometry(QtCore.QRect(950, 520, 22, 59)) 165 | self.soundslider.setMaximum(100) 166 | self.soundslider.setPageStep(0) 167 | self.soundslider.setProperty("value", 50) 168 | self.soundslider.setOrientation(QtCore.Qt.Vertical) 169 | self.soundslider.setObjectName("soundslider") 170 | 171 | self.retranslateUi(widget) 172 | self.searchbutton.clicked.connect(widget.search) 173 | self.pushButton_2.clicked.connect(widget.download) 174 | self.pushButton_3.clicked.connect(widget.player) 175 | QtCore.QMetaObject.connectSlotsByName(widget) 176 | 177 | def retranslateUi(self, widget): 178 | _translate = QtCore.QCoreApplication.translate 179 | widget.setWindowTitle(_translate("widget", "MusicPlayer")) 180 | __sortingEnabled = self.listWidget.isSortingEnabled() 181 | self.listWidget.setSortingEnabled(False) 182 | item = self.listWidget.item(0) 183 | item.setText(_translate("widget", "播放列表")) 184 | self.listWidget.setSortingEnabled(__sortingEnabled) 185 | self.searchbutton.setText(_translate("widget", "搜索")) 186 | self.pushButton_2.setText(_translate("widget", "下载")) 187 | self.pushButton_3.setText(_translate("widget", "用户")) 188 | self.nowtime.setText(_translate("widget", "0:00")) 189 | self.endtime.setText(_translate("widget", "0:00")) 190 | 191 | --------------------------------------------------------------------------------