作品演示


简易音乐播放器.gif


python代码


pygame是第三方游戏制作库 需要安装 pip insatll pygame 

import os
from pygame import mixer
import tkinter as tk
import tkinter.messagebox as msgbox
from tkinter.filedialog import askdirectory  # 选取文件夹



class MusicAPP(object):
   '''
   用tkinter和pygame制作音乐播放器
   选择文件夹 自动识别文件夹中的音乐文件
   功能:上一首 下一首 暂停 播放
   '''

   
def __init__(self, width=600, height=400):
       self.w = width
       self.h = height
       self.title = '自制音乐播放器'
       
# 软件名称
       
self.root = tk.Tk(className=self.title)
       # 音乐播放源 当前序号 音量 0<volume<1
       
self.music_source, self.music_no, self.volume = [], 0, 0.2
       
# 播放/暂停开关初始化为0
       
self.k = 0
       
frame_1 = tk.Frame(self.root)
       frame_2 = tk.Frame(self.root)
       frame_3 = tk.Frame(self.root)
       # 定义界面的控件

       
b_select_path = tk.Button(frame_1, text='选择音乐存放的文件夹',
                                 
font=('楷体,8'),
                                 
fg='Purple',
                                 
command=self.select_path)
       self.text = tk.Text(frame_1, font=('宋体', 8), width=30, heigh=2)
       b_play = tk.Button(frame_1, text='播放/暂停',
                         
font=('楷体,8'),
                         
command=self.play)
       b_unpause = tk.Button(frame_1, text='继续播放',
                             
font=('楷体,8'),
                             
command=self.unpause)
       # 控件显示
       
b_before = tk.Button(frame_2, text='上一首',
                           
font=('楷体,8'),
                           
command=self.before)
       b_next = tk.Button(frame_2, text='下一首',
                         
font=('楷体,8'),
                         
command=self.next)
       # 显示正在播放的歌曲
       
label = tk.Label(frame_3, font=('楷体', 12), text='正在播放:')
       self.text1 = tk.Text(frame_3, font=('宋体', 12), width=30, heigh=1)

       # 显示控件
       
frame_1.pack()
       frame_2.pack()
       frame_3.pack()

       # 确定控件位置row行,column列
       
b_select_path.grid(row=0, column=0)
       self.text.grid(row=0, column=1)
       b_play.grid(row=0, column=2)
       b_unpause.grid(row=0, column=3)

       b_before.grid(row=0, column=0)
       b_next.grid(row=0, column=1)

       label.grid(row=0, column=0)
       self.text1.grid(row=0, column=1)
       # ipadx x方向外部填充,ipad y方向内部填充

       # play.grid(row=0, column=3, ipadx=10, ipady=10)

   # 定义选取文件夹路径
   
def select_path(self):
       # 每次选取后清空显示的文件路径
       
self.text.delete(0.0, tk.END)

       def selectPath():
           global path_
           path_ = askdirectory()
           # print(path_)
           
path.set(path_)
           global selects_path
           selects_path = path_
           # 获得路径下的歌曲列表路径
           
self.get_musci_soruce(path_)
           root1.destroy()
           # print(path_)

           
self.text.insert(tk.END, path_)

       root1 = tk.Tk()

       root1.geometry('+550+300')
       path = tk.StringVar()

       tk.Label(root1, text="目标路径:").grid(row=0, column=0)
       tk.Entry(root1, textvariable=path).grid(row=0, column=1)
       tk.Button(root1, text="路径选择", command=selectPath).grid(row=0, column=2)

       root1.mainloop()

   # 获取选择路径下完整歌曲的路径
   
def get_musci_soruce(self, path):
       # 每次选择播放文件夹要先清空一下播放列表
       
self.music_source = []
       # 获取path_路径下的歌曲名称
       
music_names = os.listdir(path)
       print(music_names)
       for music_name in music_names:
           # 判断是否为音频文件
           
if music_name.endswith(('mp3', 'wma', 'MP3', 'wav')):
               # 拼接完整播放路径到列表music_source中
               
music = path_ + r'/' + music_name
               # 解决中文名称歌曲播放不出来的问题编码一下
               # music = music.encode('utf-8')
               
self.music_source.append(music)
       print(self.music_source)
       return self.music_source

   # 播放/暂停
   
def play(self):
       # 播放
       
mixer.init()  # 初始化
       
try:
           if self.k == 0:
               mixer.music.load(self.music_source[self.music_no])
               mixer.music.play()
               self.k += 1
           
else:
               mixer.music.pause()
               self.k -= 1
       
except:
           msgbox.showerror(title='提示', message='当前文件夹中没有音乐可以播放,请重新选择!')
       # 显示当前播放歌曲
       
self.text1.delete(0.0, tk.END)
       self.text1.insert(tk.END, self.music_source[self.music_no].split(r'/')[-1])

   # 继续播放
   
def unpause(self):
       pass
       
mixer.music.unpause()

   # 下一首
   
def next(self):
       self.k = 1
       
if self.music_no < len(self.music_source) - 1:
           self.music_no += 1
       
else:
           self.music_no = 0
       
mixer.music.load(self.music_source[self.music_no])
       mixer.music.play()
       # 显示当前播放歌曲
       
self.text1.delete(0.0, tk.END)
       self.text1.insert(tk.END, self.music_source[self.music_no].split(r'/')[-1])

   # 上一首
   
def before(self):
       self.k = 1
       
if self.music_no > 0:
           self.music_no -= 1
       
else:
           self.music_no = len(self.music_source) - 1
       
mixer.music.load(self.music_source[self.music_no])
       mixer.music.play()
       # 显示当前播放歌曲
       
self.text1.delete(0.0, tk.END)
       self.text1.insert(tk.END, self.music_source[self.music_no].split(r'/')[-1])

   def loop(self):
       self.root.resizable(True, True)
       self.root.mainloop()


if __name__ == '__main__':
   app = MusicAPP()
   app.loop()





0 评论 最近

没有评论!