作品演示
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 评论 最近
没有评论!