Python實現多功能音樂播放器

專注的阿熊發表於2022-03-08

# 匯入

import os

import time

import tkinter

import tkinter.filedialog

import threading

import pygame   # pip

root = tkinter.Tk()

root.title(' 音樂播放器 ')

root.geometry('460x600+500+100')

root.resizable(False,False)  # 不能拉伸

folder =''

res = []

num = 0

now_music = ''

def buttonChooseClick():

     """

     新增資料夾

     :return:

     """

     global folder

     global res

     if not folder:

         folder = tkinter.filedialog.askdirectory()

         musics = [folder + '\\' + music

                   for music in os.listdir(folder) \

\

                   if music.endswith(('.mp3','.wav','.ogg'))]

         ret = []

         for i in musics:

             ret.append(i.split('\\')[1:])

             res.append(i.replace('\\','/'))

         var2 = tkinter.StringVar()

         var2.set(ret)

         lb = tkinter.Listbox(root,listvariable=var2)

         lb.place(x=50,y=100,width=260,height=300)

     if not folder:

         return

     global playing

     playing = True

     # 根據情況禁用和啟用相應的按鈕

     buttonPlay['state'] = 'normal'

     buttonStop['state'] = 'normal'

     # buttonPause['state'] = 'normal'

     pause_resume.set(' 播放 ')

def play():

     """

     播放音樂

     :return:

     """

     if len(res):

         pygame.mixer.init()

         global num

         while playing:

             if not pygame.mixer.music.get_busy():

                 netxMusic = res[num]

                 print(netxMusic)

                 print(num)

                 pygame.mixer.music.load(netxMusic.encode())

                 # 播放

                 pygame.mixer.music.play(1)

                 if len(res) -1 == num:

                     num = 0

                 else:

                     num = num + 1

                 netxMusic = netxMusic.split('\\')[1:]

                 musicName.set('playing......' + ''.join(netxMusic))

             else:

                 time.sleep(0.1)

def buttonPlayClick():

     """

     點選播放

     :return:

     """

     buttonNext['state'] = 'normal'

     buttonPrev['state'] = 'normal'

     # 選擇要播放的音樂資料夾

     if pause_resume.get() == ' 播放 ':

         pause_resume.set(' 暫停 ')

         global folder

         if not folder:

             folder = tkinter.filedialog.askdirectory()

         if not folder:

             return

         global playing

         playing = True

         # 建立一個執行緒來播放音樂,當前主執行緒用來接收使用者操作

         t = threading.Thread(target=play)

         t.start()

     elif pause_resume.get() == ' 暫停 ':

         # pygame.mixer.init()

         pygame.mixer.music.pause()

         pause外匯跟單gendan5.com_resume.set(' 繼續 ')

     elif pause_resume.get() == ' 繼續 ':

         # pygame.mixer.init()

         pygame.mixer.music.unpause()

         pause_resume.set(' 暫停 ')

def buttonStopClick():

     """

     停止播放

     :return:

     """

     global playing

     playing = False

     pygame.mixer.music.stop()

def buttonNextClick():

     """

     下一首

     :return:

     """

     global playing

     playing = False

     pygame.mixer.music.stop()

     global num

     if len(res) == num:

         num = 0

     playing = True

     # 建立執行緒播放音樂 , 主執行緒用來接收使用者操作

     t = threading.Thread(target=play)

     t.start()

def closeWindow():

     """

     關閉視窗

     :return:

     """

     # 修改變數,結束執行緒中的迴圈

     global playing

     playing = False

     time.sleep(0.3)

     try:

         # 停止播放,如果已停止,

         # 再次停止時會丟擲異常,所以放在異常處理結構中

         pygame.mixer.music.stop()

         pygame.mixer.quit()

     except:

         pass

     root.destroy()

def control_voice(value=0.5):

     """

     聲音控制

     :param value: 0.0-1.0

     :return:

     """

     pygame.mixer.music.set_volume(float(value))

def buttonPrevClick():

     """

     上一首

     :return:

     """

     global playing

     playing = False

     pygame.mixer.music.stop()

     #

     # pygame.mixer.quit()

     global num

     # num += 1

     # num -= 1

     if num == 0:

         num = len(res) - 2

         # num -= 1

     elif num == len(res) - 1:

         num -= 2

     else:

         num -= 2

         # num -= 1

     print(num)

     playing = True

     # 建立一個執行緒來播放音樂,當前主執行緒用來接收使用者操作

     t = threading.Thread(target=play)

     t.start()

# 視窗關閉

root.protocol('WM_DELETE_WINDOW', closeWindow)

# 新增按鈕

buttonChoose = tkinter.Button(root,text=' 新增 ',command=buttonChooseClick)

# 佈局

buttonChoose.place(x=50,y=10,width=50,height=20)

# 播放按鈕

pause_resume = tkinter.StringVar(root,value=' 播放 ')

buttonPlay = tkinter.Button(root,textvariable=pause_resume,command=buttonPlayClick)

buttonPlay.place(x=190,y=10,width=50,height=20)

buttonPlay['state'] = 'disabled'

# 停止按鈕

buttonStop = tkinter.Button(root, text=' 停止 ',command=buttonStopClick)

buttonStop.place(x=120, y=10, width=50, height=20)

buttonStop['state'] = 'disabled'

# 下一首

buttonNext = tkinter.Button(root, text=' 下一首 ',command=buttonNextClick)

buttonNext.place(x=260, y=10, width=50, height=20)

buttonNext['state'] = 'disabled'

# 上一首

buttonPrev = tkinter.Button(root, text=' 上一首 ',command=buttonPrevClick)

buttonPrev.place(x=330, y=10, width=50, height=20)

buttonPrev['state'] = 'disabled'

# 標籤

musicName = tkinter.StringVar(root, value=' 暫時沒有播放音樂 ...')

labelName = tkinter.Label(root, textvariable=musicName)

labelName.place(x=10, y=30, width=260, height=20)

# 音量控制

# HORIZONTAL 表示為水平放置,預設為豎直 , 豎直為 vertical

s = tkinter.Scale(root, label=' 音量 ', from_=0, to=1, orient=tkinter.HORIZONTAL,

                   length=240, showvalue=0, tickinterval=2, resolution=0.1,command=control_voice)

s.place(x=50, y=50, width=200)

# 顯示

root.mainloop()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2867585/,如需轉載,請註明出處,否則將追究法律責任。

相關文章