成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 自己用python做的一款超炫酷音樂播放器

自己用python做的一款超炫酷音樂播放器

熱門標(biāo)簽:企業(yè)微信地圖標(biāo)注 地圖標(biāo)注多個(gè) B52系統(tǒng)電梯外呼顯示E7 高德地圖標(biāo)注收入咋樣 銀川電話機(jī)器人電話 沈陽防封電銷電話卡 萊蕪電信外呼系統(tǒng) 怎么辦理400客服電話 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)違法嗎

前言

晚上坐在電腦面前,想著一邊擼代碼,一邊聽音樂。搜了搜自己想聽的歌,奈何好多歌曲都提示需要版權(quán),無法播放!

沒辦法,想聽歌還是得靠自己解決!今天就一起用python自制一款炫酷的音樂播放器吧~

首先一起來看看最終實(shí)現(xiàn)的音樂播放器效果:

下面,我們開始介紹這個(gè)音樂播放器的制作過程。

一、核心功能設(shè)計(jì)

總體來說,我們首先需要設(shè)計(jì)UI界面,對播放器的畫面布局進(jìn)行排版設(shè)計(jì);其次我們的這款音樂播放器的主要功能包括根據(jù)關(guān)鍵字搜索自動(dòng)爬取音樂,獲取音樂列表,能進(jìn)行音樂播放。

當(dāng)然還少不了一些附加功能,例如播放方式列表循環(huán)、單曲循環(huán)、隨機(jī)播放,當(dāng)前上一首下一首播放,播放暫停開始,音量增加減少,播放歷史查看等。

拆解需求,大致可以整理出核心功能如下:

UI設(shè)計(jì)排版布局

  • 頭部主要包括關(guān)鍵字搜索和音樂來源選擇,以及窗體最小化,最大化,關(guān)閉功能
  • 中間主體包含左右兩側(cè),左側(cè)用來顯示播放音樂封面圖,右側(cè)用來進(jìn)行音樂列表顯示
  • 底部主要來顯示當(dāng)前播放音樂,播放進(jìn)度條,音量控制,上一首/下一首,暫停/開始,播放方式等附加功能

關(guān)鍵字音樂列表爬蟲

  • 通過輸入的搜索關(guān)鍵字和選擇的音樂來源,自動(dòng)爬取對應(yīng)的音樂數(shù)據(jù)
  • 將爬取獲取的音樂名進(jìn)行列表顯示,顯示在中間主體搜索頁

音樂播放

  • 音樂列表中我們需要雙擊某一首歌,對爬取的歌曲封面圖和歌曲進(jìn)行下載
  • 下載成功,對音樂文件根據(jù)播放進(jìn)度條進(jìn)行播放

附加功能

  • 播放音樂時(shí),我們還需要有播放暫停和啟動(dòng)功能
  • 音量控制提高或者降低
  • 當(dāng)前播放歌曲上一首、下一首
  • 音樂列表播放方式,列表循環(huán)、單曲循環(huán)、隨機(jī)播放

二、實(shí)現(xiàn)步驟

1. UI設(shè)計(jì)排版布局

基于功能點(diǎn),我們首先考慮進(jìn)行簡單的UI布局設(shè)計(jì),這里我們使用的是pyqt5。核心設(shè)計(jì)代碼如下:

def init_ui(self):
    global type
    self.setFixedSize(1025, 750)
    self.main_widget = QWidget()  # 創(chuàng)建窗口主部件
    self.main_layout = QGridLayout()  # 創(chuàng)建主部件的網(wǎng)格布局
    self.main_widget.setLayout(self.main_layout)  # 設(shè)置窗口主部件布局為網(wǎng)格布局

    self.close_widget = QWidget()  # 創(chuàng)建關(guān)閉側(cè)部件
    self.close_widget.setObjectName('close_widget')
    self.close_layout = QGridLayout()  # 創(chuàng)建左側(cè)部件的網(wǎng)格布局層
    self.close_widget.setLayout(self.close_layout)  # 設(shè)置左側(cè)部件布局為網(wǎng)格

    self.left_widget = QWidget()  # 創(chuàng)建左邊側(cè)部件
    self.left_widget.setObjectName('left_widget')
    self.left_layout = QGridLayout()  # 創(chuàng)建左側(cè)部件的網(wǎng)格布局層
    self.left_widget.setLayout(self.left_layout)  # 設(shè)置左側(cè)部件布局為網(wǎng)格

    self.right_widget = QWidget()  # 創(chuàng)建右側(cè)部件
    self.right_widget.setObjectName('right_widget')
    self.right_layout = QGridLayout()
    self.right_widget.setLayout(self.right_layout)  # 設(shè)置右側(cè)部件布局為網(wǎng)格

    self.down_widget = QWidget()  # 創(chuàng)建下面部件
    self.down_widget.setObjectName('down_widget')
    self.down_layout = QGridLayout()
    self.down_widget.setLayout(self.down_layout)  # 設(shè)置下側(cè)部件布局為網(wǎng)格

    self.up_widget = QWidget()  # 創(chuàng)建下面部件
    self.up_widget.setObjectName('up_widget')
    self.up_layout = QGridLayout()
    self.up_widget.setLayout(self.up_layout)  # 設(shè)置下側(cè)部件布局為網(wǎng)格

    self.label = QLabel(self)
    self.label.setText("還沒有播放歌曲呢╰(*°▽°*)╯")
    self.label.setStyleSheet("color:white")
    self.label.setMaximumSize(310, 20)

    self.main_layout.addWidget(self.up_widget, 0, 0, 1, 115)

    self.main_layout.addWidget(self.left_widget, 1, 0, 90, 25)
    self.main_layout.addWidget(self.right_widget, 1, 25, 90, 90)  # 22右側(cè)部件在第0行第3列,占8行9列
    self.main_layout.addWidget(self.down_widget, 100, 0, 10, 115)
    self.main_layout.addWidget(self.close_widget, 0, 110, 1, 5)  # 左側(cè)部件在第0行第0列,占1行3列

    self.down_layout.addWidget(self.label, 1, 0, 1, 1)
    self.setCentralWidget(self.main_widget)  # 設(shè)置窗口主部件

    self.tabWidget = QTabWidget(self)
    self.tabWidget.setGeometry(QRect(33, 20, 716, 471))
    self.tab = QWidget()
    self.tab.setObjectName("tab")
    self.tab_layout = QGridLayout()
    self.tab.setLayout(self.tab_layout)
    self.listwidget = QListWidget(self.tab)
    self.listwidget.doubleClicked.connect(lambda: self.change_func(self.listwidget))
    self.listwidget.setContextMenuPolicy(Qt.CustomContextMenu)
    self.listwidget.customContextMenuRequested[QPoint].connect(self.myListWidgetContext)
    self.listwidget.setObjectName("listWidget")
    self.tab_layout.addWidget(self.listwidget, 0, 0, 1, 1)
    self.tabWidget.addTab(self.tab, "      搜索頁      ")

    self.tab2 = QWidget()
    self.tab2.setObjectName("tab")
    self.tab2_layout = QGridLayout()
    self.tab2.setLayout(self.tab2_layout)
    self.listwidget2 = QListWidget(self.tab2)
    self.listwidget2.doubleClicked.connect(lambda: self.change_funcse(self.listwidget2))
    self.listwidget2.setContextMenuPolicy(Qt.CustomContextMenu)
    self.listwidget2.customContextMenuRequested[QPoint].connect(self.myListWidgetContext2)
    self.listwidget2.setObjectName("listWidget2")
    self.listwidget2.setContextMenuPolicy(3)
    self.tab2_layout.addWidget(self.listwidget2, 0, 0, 1, 1)
    self.tabWidget.addTab(self.tab2, "      最近播放      ")

    self.right_layout.addWidget(self.tabWidget, 3, 0, 100, 90)

    self.left_close = QPushButton("")  # 關(guān)閉按鈕
    self.left_close.clicked.connect(self.close)
    self.left_visit = QPushButton("")  # 空白按鈕
    self.left_visit.clicked.connect(self.big)
    self.left_mini = QPushButton("")  # 最小化按鈕
    self.left_mini.clicked.connect(self.mini)
    self.close_layout.addWidget(self.left_mini, 0, 0, 1, 1)
    self.close_layout.addWidget(self.left_close, 0, 2, 1, 1)
    self.close_layout.addWidget(self.left_visit, 0, 1, 1, 1)
    self.left_close.setFixedSize(15, 15)  # 設(shè)置關(guān)閉按鈕的大小
    self.left_visit.setFixedSize(15, 15)  # 設(shè)置按鈕大小
    self.left_mini.setFixedSize(15, 15)  # 設(shè)置最小化按鈕大小
    self.left_close.setStyleSheet(
        '''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
    self.left_visit.setStyleSheet(
        '''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
    self.left_mini.setStyleSheet(
        '''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')


    self.button_123 = QLabel("")
    self.left_layout.addWidget(self.button_123, 0, 2, 2, 2)
    self.label2 = QLabel(self)
    self.label2.setText("當(dāng)前為順序播放")
    self.label2.setStyleSheet("color:green")
    self.left_layout.addWidget(self.label2, 4, 0, 2, 1)
    self.button_1234 = QPushButton(icon('fa.download', color='#3FC89C', font=24), "")
    self.button_1234.clicked.connect(self.down)
    self.button_1234.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')
    self.left_layout.addWidget(self.button_1234, 4, 2, 2, 1)
    self.button_1234 = QPushButton(icon('fa.heart', color='#3FC89C', font=24), "")
    self.button_1234.clicked.connect(self.lovesong)
    self.button_1234.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')
    self.left_layout.addWidget(self.button_1234, 4, 3, 2, 2)
    self.label3 = QLabel(self)
    self.label3.setText("")
    self.label3.setStyleSheet("color:white")
    self.down_layout.addWidget(self.label3, 1, 3, 1, 1)

    self.label7 = QLabel(self)
    self.label7.setText("")
    self.label7.setStyleSheet("color:white")
    self.label5 = QLabel(self)
    pix_img = QPixmap(str(data + '/backdown.png'))
    pix = pix_img.scaled(300, 300, Qt.KeepAspectRatio)
    self.label5.setPixmap(pix)
    # self.label5.setMaximumSize(1,1)
    self.left_layout.addWidget(self.label5, 2, 0, 2, 8)
    self.label6 = QLabel(self)
    self.label6.setText("")
    self.label6.setStyleSheet("color:#6DDF6D")
    self.left_layout.addWidget(self.label6, 2, 0, 2, 2)

    self.label23 = QLabel(self)
    self.label23.setText("                 ")
    self.label23.setStyleSheet("color:#6DDF6D")
    self.up_layout.addWidget(self.label23, 0, 100, 1, 20)

    self.shuru = QLineEdit("")
    self.up_layout.addWidget(self.shuru, 0, 120, 1, 40)
    self.shuru.returnPressed.connect(self.correct)

    self.label23 = QLabel(self)
    self.label23.setText("     軟件")
    self.label23.setStyleSheet("color:#6DDF6D")
    self.up_layout.addWidget(self.label23, 0, 160, 1, 10)

    self.label61 = QLabel(self)
    self.label61.setText("")
    self.label61.setStyleSheet("color:#6DDF6D")
    self.up_layout.addWidget(self.label61, 0, 200, 1, 50)

    self.cb = QComboBox(self)
    self.cb.addItems(['網(wǎng)易云', '酷狗',  'qq'])
    self.up_layout.addWidget(self.cb, 0, 180, 1, 30)
    self.cb.currentIndexChanged[int].connect(self.print)
    self.button_1 = QPushButton(icon('fa.search', color='white'), "")
    self.button_1.clicked.connect(self.correct)
    self.button_1.setStyleSheet(
        '''
        QPushButton{color:white;border-radius:5px;}QPushButton:hover{background:green;}
        ''')
    self.up_layout.addWidget(self.button_1, 0, 155, 1, 5)

    self.right_process_bar = QProgressBar()  # 播放進(jìn)度部件
    self.right_process_bar.setValue(49)
    self.right_process_bar.setFixedHeight(3)  # 設(shè)置進(jìn)度條高度
    self.right_process_bar.setTextVisible(False)  # 不顯示進(jìn)度條文字
    self.right_process_bar.setRange(0, 10000)

    self.right_playconsole_widget = QWidget()  # 播放控制部件
    self.right_playconsole_layout = QGridLayout()  # 播放控制部件網(wǎng)格布局層
    self.right_playconsole_widget.setLayout(self.right_playconsole_layout)

    self.console_button_1 = QPushButton(icon('fa.backward', color='#3FC89C'), "")
    self.console_button_1.clicked.connect(self.last)
    self.console_button_1.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_2 = QPushButton(icon('fa.forward', color='#3FC89C'), "")
    self.console_button_2.clicked.connect(self.nextion)
    self.console_button_2.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_3 = QPushButton(icon('fa.pause', color='#3FC89C', font=18), "")
    self.console_button_3.clicked.connect(self.pause)
    self.console_button_3.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_4 = QPushButton(icon('fa.volume-down', color='#3FC89C', font=18), "")
    self.console_button_4.clicked.connect(self.voicedown)
    self.console_button_4.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_5 = QPushButton(icon('fa.volume-up', color='#3FC89C', font=18), "")
    self.console_button_5.clicked.connect(self.voiceup)
    self.console_button_5.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_6 = QPushButton(icon('fa.align-center', color='#3FC89C', font=18), "")
    self.console_button_6.clicked.connect(self.playmode)
    self.console_button_6.setStyleSheet(
        '''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#3684C8;}''')

    self.console_button_3.setIconSize(QSize(30, 30))

    self.right_playconsole_layout.addWidget(self.console_button_4, 0, 0)

    self.right_playconsole_layout.addWidget(self.console_button_1, 0, 1)
    self.right_playconsole_layout.addWidget(self.console_button_3, 0, 2)

    self.right_playconsole_layout.addWidget(self.console_button_2, 0, 3)

    self.right_playconsole_layout.addWidget(self.console_button_5, 0, 4)

    self.right_playconsole_layout.addWidget(self.console_button_6, 0, 5)
    self.right_playconsole_layout.setAlignment(Qt.AlignCenter)  # 設(shè)置布局內(nèi)部件居中顯示
    self.down_layout.addWidget(self.right_process_bar, 0, 0, 1, 4)  # 第0行第0列,占8行3列
    # 第0行第0列,占8行3列
    self.down_layout.addWidget(self.label7, 1, 2, 1, 1)
    self.down_layout.addWidget(self.right_playconsole_widget, 1, 0, 1, 4)
    self.setWindowOpacity(0.95)  # 設(shè)置窗口透明度
    self.setAttribute(Qt.WA_TranslucentBackground)
    self.setWindowFlag(Qt.FramelessWindowHint)  # 隱藏邊框
    self.main_layout.setSpacing(0)

實(shí)現(xiàn)效果如下:

2. 關(guān)鍵字音樂列表爬蟲

我們可以根據(jù)輸入的關(guān)鍵字和音樂來源進(jìn)行音樂爬取。這里我們需要通過多線程,將歌曲、歌手、歌曲url地址全都獲取。核心代碼如下:

def run(self):
  qmut.lock()
  try:
      global paing
      global stop
      global lrcs
      global urls
      global songs
      global name
      global songid
      global proxies
      global pic
      global tryed
      paing = True

      print('搜索軟件{}'.format(type))
      print('開始搜索')
      name = name
      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.110.430.128 Safari/537.36',
          'X-Requested-With': 'XMLHttpRequest'

      }
      urls = []
      songs = []
      pic = []
      lrcs = []
      pages = 5
      print(pages)
      for a in range(0, pages):
          if not stop:

              urlss = ['http://music.9q4.cn/', 'https://defcon.cn/dmusic/','http://www.xmsj.org/',
                      'http://music.laomao.me/']
              print (tryed)
              if tryed >3:

                  tryed = 0
                  url = urlss[tryed]
              else:
                  url = urlss[tryed]
              print (urlss[tryed])

              params = {'input': name,
                        'filter': 'name',
                        'type': type,
                        'page': a
                        }
              if not stop:
                  try:
                      res = post(url, params, headers=headers, proxies=proxies)
                      html = res.json()

                      for i in range(0, 10):

                              try:
                                  title = jsonpath(html, '$..title')[i]
                                  author = jsonpath(html, '$..author')[i]
                                  url1 = jsonpath(html, '$..url')[i]  # 取下載網(wǎng)址
                                  pick = jsonpath(html, '$..pic')[i]  # 取歌詞
                                  lrc = jsonpath(html, '$..lrc')[i]
                                  print(title, author)
                                  lrcs.append(lrc)
                                  urls.append(url1)
                                  pic.append(pick)
                                  songs.append(str(title) + ' - ' + str(author))
                              except:
                                  pass
                  except:
                      stop = False
                      paing = False
                  self.trigger.emit(str('finish'))
              else:
                  self.trigger.emit(str('finish'))
          else:
              self.trigger.emit(str('clear'))
              pass

      stop = False
      paing = False
  except:
      print('爬取歌曲出錯(cuò)')
      self.trigger.emit(str('unfinish'))
      stop = False
      paing = False
  qmut.unlock()

爬取代碼寫好了,我們還需要將爬取的這些音樂數(shù)據(jù)列表顯示到畫面中搜索頁面中。代碼如下:

def repite(self, name, type):
    global tryed
    global paing
    global stop
    self.listwidget.clear()
    self.listwidget.addItem('搜索中')
    self.listwidget.item(0).setForeground(Qt.white)
    try:
        if paing:
            stop = True

            self.listwidget.clear()
            self.work2 = PAThread()
            self.work2.start()
            self.work2.trigger.connect(self.seafinish)
        else:
            self.work2 = PAThread()
            self.work2.start()
            self.work2.trigger.connect(self.seafinish)
    except:
        tryed = tryed + 1
        get_info('https://www.kuaidaili.com/free/inha')
        self.listwidget.addItem('貌似沒網(wǎng)了呀`(*>﹏*)′,再試一遍吧~')
        self.listwidget.item(0).setForeground(Qt.white)

效果如下:

3. 音樂播放

關(guān)鍵字搜索音樂列表完成之后,接下來我們需要實(shí)現(xiàn)音樂播放功能。首先需要從爬取的url下載待播放的歌曲,這里還是通過多線程進(jìn)行。核心代碼如下:

class WorkThread(QThread):
    trigger = pyqtSignal(str)

    def __int__(self):
        # 初始化函數(shù)
        super(WorkThread, self).__init__()
    
    # 進(jìn)度條
    def cbk(self, a, b, c):
        '''''回調(diào)函數(shù)
        @a:已經(jīng)下載的數(shù)據(jù)塊
        @b:數(shù)據(jù)塊的大小
        @c:遠(yuǎn)程文件的大小
        '''
        per = 100.0 * a * b / c
        if per > 100:
            per = 100
        # print   ('%.2f%%' % per)
        self.trigger.emit(str('%.2f%%' % per))

    def run(self):
        try:
            global number
            global path
            global downloading
                        try:
                proxies = {
                    'http': 'http://124.72.109.183:8118',
                    ' Shttp': 'http://49.85.1.79:31666'

                }
                headers = {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
                    'X-Requested-With': 'XMLHttpRequest'}
                try:
                    try:
                        try:
                            aq = pic[num]
                            aqq = aq.split('/')

                        except:
                            pass

                        if type == 'kugou' and len(aqq) - 1 == 6:
                            aqqe = str(aqq[0]) + str('//') + str(aqq[2]) + str('/') + str(aqq[3]) + str('/') + str(
                                '400') + str('/') + str(aqq[5]) + str('/') + str(aqq[6])
                            print(aqqe)
                        elif type == 'netease' and len(aqq) - 1 == 4:
                            aqn = aq.split('?')
                            b = '?param=500x500'
                            aqqe = (str(aqn[0]) + str(b))
                            print(aqqe)
                        else:
                            aqqe = pic[num]
                        req = get(aqqe)

                        checkfile = open(str(data + '/ls1.png'), 'w+b')
                        for i in req.iter_content(100000):
                            checkfile.write(i)

                        checkfile.close()
                        lsfile = str(data + '/ls1.png')
                        safile = str(data + '/back.png')
                        draw(lsfile, safile)
                    except:
                        pass
                    url1 = urls[num]
                    print(url1)
                    number = number + 1
                    path = str(data + '\{}.臨時(shí)文件'.format(number))
                    headers = {
                        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.110.430.128 Safari/537.36',
                        'X-Requested-With': 'XMLHttpRequest'
                    }
                    with get(url1, stream=True, headers=headers) as r, open(path, 'wb') as file:
                        total_size = int(r.headers['content-length'])
                        content_size = 0
                        for content in r.iter_content(chunk_size=1024):
                            file.write(content)
                            content_size += len(content)
                            plan = (content_size / total_size) * 100
                            # print(int(plan))
                            develop = str(int(plan)) + str('%')
                            self.trigger.emit(str(develop))
                    to = 'downloadmusic\{}.mp3'.format(songs[num])
                    makedirs('downloadmusic', exist_ok=True)
                except:
                    pass
                try:
                    copyfile(path, to)
                except:
                    pass
                downloading = False
                self.trigger.emit(str('finish'))
            except:
                self.trigger.emit(str('nofinish'))

音樂播放模塊:

    def bofang(self, num, bo):
        print('嘗試進(jìn)行播放')
        try:
            import urllib
            global pause
            global songs
            global music
            global downloading
            downloading = True
            self.console_button_3.setIcon(icon('fa.pause', color='#F76677', font=18))
            pause = False
            try:
                mixer.stop()
            except:
                pass
            mixer.init()
            try:
                self.Timer = QTimer()
                self.Timer.start(500)
            except:
                pass
            try:
                self.label.setText('正在尋找文件...')
                self.work = WorkThread()
                self.work.start()
                self.work.trigger.connect(self.display)
            except:
                print('無法播放,歌曲下載錯(cuò)誤')
                downloading = False
                pass
        except:
            sleep(0.1)
            print('播放系統(tǒng)錯(cuò)誤')
            # self.next()
            pass

    def display(self, sd):
        global pause
        global songed
        global urled
        global lrcd
        global timenum
        if sd == 'finish':
            try:
                if bo == 'boing':
                    self.label.setText(songs[num])
                elif bo == 'boed':
                    self.label.setText(songed[num])
                elif bo == 'love':
                    self.label.setText(loves[num])
                try:
                    pix_img = QPixmap(str(data + '/back.png'))
                    pix = pix_img.scaled(300, 300, Qt.KeepAspectRatio)
                    self.label5.setPixmap(pix)
                except:
                    pix_img = QPixmap(str(data + '/backdown.png'))
                    pix = pix_img.scaled(300, 300, Qt.KeepAspectRatio)
                    self.label5.setPixmap(pix)
                print(str(data + '\{}.臨時(shí)文件'.format(number)))
                mixer.music.load(str(data + '\{}.臨時(shí)文件'.format(number)))  # 載入音樂
                mixer.music.play()
                self.console_button_3.setIcon(icon('fa.pause', color='#F76677', font=18))
                pause = False
                try:
                    mp3 = str(data + '\{}.臨時(shí)文件'.format(number))
                    xx = load(mp3)
                    timenum = xx.info.time_secs
                    global start
                    start = True
                except:
                    print('MP3錯(cuò)誤,播放失敗')

                if bo == 'boing':
                    songed.append(songs[num])
                    urled.append(urls[num])
                    picd.append(pic[num])
                    lrcd.append(lrcs[num])
                    r = 0
                    self.listwidget2.clear()
                    for i in songed:
                        # self.listwidget.addItem(i)#將文件名添加到listWidget

                        self.listwidget2.addItem(i)
                        self.listwidget2.item(r).setForeground(Qt.white)
                        r = r + 1
                else:
                    pass
                # 播放音樂
            except:
                pass
        elif sd == 'nofinish':
            self.label.setText('下載錯(cuò)誤')
        elif sd == 'lrcfinish':
            r = 0
            for i in lrct:
                if not i == '\r':
                    r = r + 1
                else:
                    pass
        elif sd == 'lrcnofinish':
            pass
        else:
            self.label.setText('加速下載中,已完成{}'.format(sd))

至此,我們的音樂播放器已經(jīng)可以正常播放音樂了。

4. 附加功能

主要功能已經(jīng)完成了,下面我們還可以添加一些附加功能,例如播放方式列表循環(huán)、單曲循環(huán)、隨機(jī)播放,當(dāng)前上一首下一首播放,播放暫停開始,音量增加減少等等。

播放模式:

(1)隨機(jī)播放:

def shui(self):
    global num
    global songs
    if bo == 'boing':
        q = int(len(songs) - 1)
        num = int(randint(1, q))
    elif bo == 'love':
        q = int(len(loves) - 1)
        num = int(randint(1, q))
    else:
        q = int(len(songed) - 1)
        num = int(randint(0, q))

    try:
        print('隨機(jī)播放下一首')
        mixer.init()
        self.Timer = QTimer()
        self.Timer.start(500)
        # self.Timer.timeout.connect(self.timercontorl)#時(shí)間函數(shù),與下面的進(jìn)度條和時(shí)間顯示有關(guān)
        if bo == 'boing':
            self.label.setText(songs[num])
        elif bo == 'love':
            self.label.setText(loves[num])
        else:
            self.label.setText(songed[num])
        self.bofang(num, bo)  # 播放音樂
    except:
        pass

(2) 上一首、下一首:

def last(self):
    global num
    global songs
    if num == 0:
        print('冇')
        num = len(songs) - 1
    else:
        num = num - 1
    try:
        self.bofang(num)
        self.label.setText(songs[num])
    except:
        pass

#下一首
def next(self):
    print ('nexting')
    global num
    global songs
    if num == len(songs) - 1:
        print('冇')
        num = 0
    else:
        num = num + 1
    try:
        self.label.setText(songs[num])
        self.bofang(num)
    except:
        print ('next error')
        pass

(3)單曲循環(huán):

def always(self):
    try:
        if bo == 'boing':
            self.label.setText(songs[num])
        else:
            self.label.setText(songed[num])
        self.bofang(num, bo)  # 播放音樂

    except:
        pass

(4) 播放模式選擇:

def playmode(self):
    global play
    try:
        if play == 'shun':
            play = 'shui'
            print('切換到隨機(jī)播放')
            self.label2.setText("當(dāng)前為隨機(jī)播放")
            try:
                self.console_button_6.setIcon(icon('fa.random', color='#3FC89C', font=18))
                print('done')
            except:
                print('none')
                pass
            # self.left_shui.setText('切換為單曲循環(huán)')
        elif play == 'shui':
            play = 'always'
            print('切換到單曲循環(huán)')
            self.label2.setText("當(dāng)前為單曲循環(huán)")
            try:
                self.console_button_6.setIcon(icon('fa.retweet', color='#3FC89C', font=18))
                print('done')
            except:
                print('none')

            # self.left_shui.setText('切換為順序播放')
        elif play == 'always':
            play = 'shun'
            print('切換到順序播放')
            self.label2.setText("當(dāng)前為順序播放")
            try:
                self.console_button_6.setIcon(icon('fa.align-center', color='#3FC89C', font=18))
                print('done')
            except:
                print('none')

            # self.left_shui.setText('切換為隨機(jī)播放')
    except:
        print('模式選擇錯(cuò)誤')
        pass

播放暫停/開始:

def pause(self):
    global pause
    if pause:
        try:
            mixer.music.unpause()
        except:
            pass
        self.console_button_3.setIcon(icon('fa.pause', color='#3FC89C', font=18))
        pause = False
    else:
        try:
            mixer.music.pause()
        except:
            pass
        self.console_button_3.setIcon(icon('fa.play', color='#F76677', font=18))
        pause = True

音量提高/降低:

def voiceup(self):
    try:
        print('音量加大')
        global voice
        voice += 0.1
        if voice > 1:
            voice = 1
        mixer.music.set_volume(voice)
        k = Decimal(voice).quantize(Decimal('0.00'))
        self.label3.setText('音量:{}'.format(str(k * 100) + '%'))
    except:
        pass

def voicedown(self):
    try:
        print('音量減少')
        global voice
        voice -= 0.1
        if voice  0:
            voice = 0
        mixer.music.set_volume(voice)
        k = Decimal(voice).quantize(Decimal('0.00'))
        self.label3.setText('音量:{}'.format(str(k * 100) + '%'))
    except:
        pass

至此,這款音樂播放器就基本完成啦~ 一起來看看效果吧!

三、結(jié)束語

當(dāng)然這款音樂播放器還有待完善的功能尚未完成:

  • 音樂本地下載保存
  • 播放本地音樂
  • 添加我喜愛的音樂功能
  • 歌詞播放
  • 音樂進(jìn)度跳播

后面有時(shí)間這些功能也會(huì)繼續(xù)完善下!今天我們就到這里,明天繼續(xù)努力!

如果本篇博客有任何錯(cuò)誤,請批評指教,不勝感激 !

到此這篇關(guān)于自己用python做的一款超炫酷音樂播放器的文章就介紹到這了,更多相關(guān)python音樂播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python 制作簡單的音樂播放器
  • python實(shí)現(xiàn)音樂播放器 python實(shí)現(xiàn)花框音樂盒子
  • Python實(shí)現(xiàn)在線音樂播放器
  • python實(shí)現(xiàn)可下載音樂的音樂播放器
  • 基于python實(shí)現(xiàn)音樂播放器代碼實(shí)例
  • python實(shí)現(xiàn)簡易云音樂播放器
  • Python編程實(shí)現(xiàn)簡易的音樂播放器基本操作

標(biāo)簽:湘西 葫蘆島 安慶 銀川 烏魯木齊 三亞 呼倫貝爾 呼倫貝爾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《自己用python做的一款超炫酷音樂播放器》,本文關(guān)鍵詞  自己,用,python,做,的,一款,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《自己用python做的一款超炫酷音樂播放器》相關(guān)的同類信息!
  • 本頁收集關(guān)于自己用python做的一款超炫酷音樂播放器的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    日本久久中文字幕| 欧美激情视频网址| 国产性做久久久久久| 国产精品免费网站| 国产美女被遭强高潮免费网站| 性伦欧美刺激片在线观看| 亚洲视频 欧美视频| 狠狠色综合色综合网络| 先锋av资源网| 亚洲精品一区国产| 欧美精品videosbestsex另类| 中文字幕有码热在线视频| 91xxxxx| 你懂的视频在线看| 午夜在线a亚洲v天堂网2018| 波多野结衣乳巨码无在线| 91麻豆精品一区二区三区| 精品伦精品一区二区三区视频| 久操视频免费在线观看| 国产高潮又爽又无遮挡又免费| 日韩中文影院| 精选一区二区三区四区五区| 精品欧美一区免费观看α√| 欧美性受xxxx黑人xxxx| 精品综合久久久| 成人av网站免费| 精品国产一区二区三区四区vr| 国产精品短视频| 综合蜜桃精品| 啊啊啊啊啊好爽| 国内精品免费在线观看| 欧美日本一区二区高清播放视频| 日韩电影免费网站| www.精品视频| av电影中文字幕| 一区二区三区入口| 在线亚洲电影| 亚洲福利精品| 国产精品观看| 天天综合天天添夜夜添狠狠添| 色婷婷久久久久swag精品| 日韩精品三区四区| 久久日文中文字幕乱码| av影音在线| 亚洲国产精品日韩| 91精品久久久久久久久久久| julia一区二区中文久久94| 午夜不卡影院| 国产精品无码久久久久一区二区| 污网站免费看| 亚洲av无码一区二区三区在线| 国产欧美精品一区二区三区介绍| 欧美wwwwxxxx| 欧美成人手机在线视频| 日本免费高清不卡| 国产欧美一区二区精品性| 悠悠资源av网站| 自拍视频一区二区| 噜噜噜久久亚洲精品国产品麻豆| 永久免费的av网站| 亚洲精品蜜桃久久久久久| 日韩欧美在线一区| 少妇高潮 亚洲精品| 日日狠狠久久偷偷四色综合免费| 韩国精品一区二区三区六区色诱| 亚洲欧美影院| 高清日韩中文字幕| 在线观看av黄网站永久| 视频一区二区欧美| 91在线九色porny| 国产精品视频精品视频| 69174成人网| 欧美午夜免费影院| 人妻久久一区二区| 奇米色欧美一区二区三区| 91高清在线视频| 一级少妇精品久久久久久久| 欧美福利在线视频| 性感美女久久精品| 日韩视频在线观看一区| 人妻无码一区二区三区免费| 亚洲最黄网站| 97超碰免费在线| 精品伦理一区二区| 亚洲伊人久久综合| 日韩国产欧美精品在线| 亚洲精品国产精品国自产网站| 黄色三级电影网站| 99热这里只有精品在线播放| 最新天堂在线视频| 中文字幕日韩精品有码视频| 免费视频一区二区| 黑人乱码一区二区三区av| 97久久伊人激情网| 日韩中文字幕区一区有砖一区| 国产精品久久夜| 国产精品嫩草在线观看| 中文字幕在线观看视频免费| 久久精品女人天堂av免费观看| 国产精品黄页免费高清在线观看| 黄色毛片视频| 国产精品午夜av| 久久精品中文字幕免费mv| 久久久久久久电影一区| 国产精品拍拍拍| 国产成人久久精品77777最新版本| 亚洲天堂免费在线观看视频| 亚洲毛片在线观看| 91超碰在线电影| 成年人免费在线播放| 丰满少妇在线观看| 久久精品国产99国产| 美国一区二区三区在线播放| 国产精品第一国产精品| 粉嫩精品久久99综合一区| 欧洲一级视频| 成年女人免费又黄又爽视频| 奇米影视首页 狠狠色丁香婷婷久久综合| 狠狠色狠狠色合久久伊人| 国产91精品在线观看| 久久久久国产精品一区二区| 激情久久久久久久久久久久久久久久| 天堂在线一区二区三区| 在线精品国产欧美| 91亚洲精品丁香在线观看| 亚洲激情电影在线| 欧美超碰在线观看| 爱啪视频在线观看视频免费| 日本不卡的三区四区五区| 韩国理伦片一区二区三区在线播放| 全亚洲第一av番号网站| 风流少妇一区二区| 国内性生活视频| 欧美精品在线极品| 久久视频这里只有精品| 91国内精品视频| 无码久久精品国产亚洲av影片| 亚洲国产精久久久久久| 欧美综合一区二区三区| 秋霞福利视频| 国产精品毛片久久久久久久av| 三级a三级三级三级a十八发禁止| 欧美福利电影在线观看| 久久综合999| av综合网址| 玉足女爽爽91| 99久久伊人精品影院| 亚洲高清不卡在线| 91精品久久久久久9s密挑| 97精品国产97久久久久久春色| 色婷五月综激情亚洲综合| 中文字幕乱码一区二区三区| 欧美日韩在线中文字幕| 中文字幕制服丝袜| 中文乱码字幕高清一区二区| hd100%videos日本| 国产欧美日韩视频在线观看| 欧美私人网站| 日日碰狠狠丁香久燥| 一女三黑人理论片在线| 亚洲男人天堂2020| 亚洲国产日韩精品在线| 日韩午夜电影在线观看| 久久国产日本精品| 亚洲天堂一区二区三区| 黄色污网站在线免费观看| 亚洲欧美久久久久一区二区三区| 成人高清dvd| 欧美日韩国产高清视频| 欧美成人第一页| 成人影欧美片| 国产精品白丝喷水在线观看| 欧美性猛交xxxxx免费看| 国产91大片| 欧美日韩国产美女| 一区在线中文字幕| 91久久视频| 男人揉女人奶房视频60分| 黑人巨大精品欧美一区二区小视频| 女人被狂躁到高潮视频免费网站| 成人精品一二三区| 国产精品久久久毛片| 亚洲精品第一区二区三区| 亚洲高清免费观看高清完整版在线观看| 亚洲一区 视频| 欧美日夜夜逼| 国产精品av在线| 大胆国模一区二区三区| 欧美华人在线视频| 欧美在线观看禁18| 日韩一级片av| av片免费观看| 亚洲成人性视频| 日韩中文字幕国产精品| 亚洲欧洲一区二区天堂久久| 亚洲区一区二区三| 欧美三级电影网| 97香蕉久久| 四虎国产精品永久地址998| 日本新janpanese乱熟| 91直播在线观看| 久草在线在线精品观看| 在线看片日韩| aa在线免费观看| 日本免费网站视频| 老司机99精品99| jk漫画禁漫成人入口| 欧美美乳视频网站在线观看| 九色porn| 999久久久精品国产| 亚洲欧美三级在线| 久久综合亚洲社区| 欧美久草视频| 欧美精品hd| 一本大道伊人av久久综合| 欧美怡红院视频一区二区三区| 国产av无码专区亚洲a∨毛片| 久久蜜桃一区二区| 免费黄色网网址| 国产伦子伦对白视频| 麻豆精品91| 极品少妇一区二区| 第一中文字幕在线| 激情在线视频| 久久久久久久毛片| 秋霞影院午夜丰满少妇在线视频| 亚洲电影激情视频网站| 国产情侣自拍av| 国产日韩欧美麻豆| 日韩av在线资源| 欧美巨胸大乳hitomi| 99sesese| 日本免费精品视频| 丁香花高清视频完整版在线观看| 久久国产精品亚洲va麻豆| 黄网站在线免费| 国产极品粉嫩福利姬萌白酱| 日本久久黄色| 午夜小视频在线观看| 青春娱乐分类视频精品2动漫| 欧美超强性xxxxx| 日本一区午夜艳熟免费| 久久都是精品| 成人免费视频观看视频| 好吊操视频这里只有精品| 成人亚洲成人影院| 黄色高清无遮挡| 精品无人乱码一区二区三区| 日本中文字幕免费观看| 国产传媒一区二区三区| 婷婷在线观看视频| 91免费在线视频网站| 国产免费内射又粗又爽密桃视频| 国产成人午夜精品| 18禁免费观看网站| 中文在线资源观看视频网站免费不卡| 精品久久久久久久久久| 久久er99热精品一区二区三区| 亚洲国产精品第一区二区三区| 国产精品久久久久久妇女| 国产aⅴ爽av久久久久| 久久网一区二区| 欧洲国产精品| 久久久久久久久一区| 一道本无吗一区| 国产亚洲欧美日韩在线观看一区二区| 国产一区二区三区高清视频| 麻豆av免费观看| 国产精品久久久久影视| 国产午夜精品福利视频| 亚洲福中文字幕伊人影院| 新67194成人永久网站| av一区二区在线播放| 又嫩又硬又黄又爽的视频| 美女翘臀白浆直流视频| 国产人成亚洲第一网站在线播放| 三上悠亚国产精品一区二区三区| 日本精品视频一区二区三区| 偷窥少妇高潮呻吟av久久免费| 日韩69视频在线观看| 亚洲福利av在线| 91久久精品www人人做人人爽| 黄视频网站免费看| 影音先锋导航| jlzzjlzz国产精品久久| 日韩午夜激情视频| 欧美日韩午夜精品| 51久久精品夜色国产麻豆| 综合五月婷婷| 97超级碰在线看视频免费在线看| www.成人精品免费网站青椒| 亚洲国产精品久久艾草纯爱| 美女欧美视频在线观看免费| 中文字幕亚洲欧洲| 日本成熟性欧美| 欧美亚洲国产日韩2020| 黄页网站在线播放| 特黄aaaaaaaaa毛片免费视频| 成人涩涩视频| 自拍偷拍激情视频| 日本少妇xxxx| 婷婷社区五月天| 2019中文字幕在线视频| 久久久久久久久久久久久久久久久久久久| 性欧美大战久久久久久久免费观看| 国产精品一区电影| 蜜桃传媒一区二区| 亚洲精一区二区三区| 日韩dvd碟片| 成人免费一级视频| 97视频在线观看免费高清完整版在线观看| 国产成人综合欧美精品久久| 日韩有码中文字幕在线| 国产精品精品国产一区二区| 欧美福利网址| 日本中文字幕视频| 免费成人黄色网| 亚洲欧美怡红院| 写真福利精品福利在线观看| 青青草国产精品视频| 久久99久久精品| 国产日韩欧美视频在线| 久久午夜影院| 男男受被啪到高潮自述| 中文字幕欧美在线观看| 日韩大片在线观看| 日韩一级片在线播放| 大香一本蕉伊线亚洲网|