一、添加功能
? ? ? ? ?歌曲自动随机循环播放,动态显示歌曲剩余时间和总时间,显示歌曲名字。
? ? ? ? 结局总是不尽人意,点完退出会以报错形式退出,但也算是成功退出了吧;而且程序可能有很多bug,在运行几次循环播放之后界面会变得很卡,而且tk的界面设计太不智能了,就像是在做底层!把tkinter学差不多了就学opencv+qt,听某人说这个更强大。
二、代码实现
import os
import random
from pygame import mixer
import time
import tkinter as tk
from tkinter import Button #按钮控件;在程序中显示按钮
from tkinter import Label #标签控件;可以显示文本和位图
from tkinter import Entry #输入控件;用于显示简单的文本内容
from tkinter import Scale #范围控件;显示一个数值刻度,为输出限定范围的数字区间
from tkinter import PhotoImage #用于插入图片
from tkinter import messagebox #用于显示你应用程序的消息框
from tkinter import Toplevel #容器控件;用来提供一个单独的对话框,和Frame比较类似
from tkinter import StringVar #字符串变量
from pymediainfo import MediaInfo #用于读取歌曲时长
from PIL import ImageTk #图像处理库
import re #正则表达式
import threading #子线程
def name(): #检索文件夹下所有mp3文件名称
filename = os.listdir(r"F:\python\project\assignment\music") #利用os.listdir检索文件夹下所有文件名称
# print(filename)
global music
music = []
for music_name in filename:
if '.mp3' in music_name:
music.append(music_name) #检索出mp3文件名字
return music
###音乐加载、播放、暂停、声音大小等操作
def music_begin(i):
mixer.init()
mixer.music.load(music[int(i)])
#数据过大,不用多线程会崩溃
class time_music(threading.Thread):
def __init__(self):
super(time_music,self).__init__()
self.daemon=False
def run(self):
global i,flag
media_info = MediaInfo.parse(music[int(i)])
tk.Label(top,text=music[int(i)],font=("Helvetica", 16)).place(x=230,y=10)
data = media_info.to_json() # medio到json()这两行是获取文件的所有属性
rst = re.search('other_duration.*?(.*?)min(.*?)s.*?', data) # 扫描数据流
t = int(rst.group(0)[19:20])
r = int(rst.group(0)[-4:-2])
m = (t * 60 + r) * 1000
musictime = str(t) + ':' + str(r)
tk.Label(top, text=musictime, font=("Helvetica", 16)).place(x=170, y=10)
lbTime = tk.Label(top, anchor='w', font=("Helvetica", 16)) # anchor为方位点,w为西
lbTime.place(x=110, y=10)
for j in range(m // 1000):
lbTime['text'] = '-{} /'.format((m // 1000) - j)
time.sleep(1)
while flag == 1:
time.sleep(1)
top.after(1000, music_random)
def resume():
global flag
flag = 0
def pause():
global flag
flag = 1
def music_random(): #随机播放显示
global i,top,loop
i = random.randint(1, len(music))
music_begin(i)
mixer.music.play()
thread = time_music()
thread.start()
def music_stop():
global loop
mixer.music.stop()
mixer.music.unload()
top.quit()
def music_next():
global i
i += 1
music_begin(i)
mixer.music.play()
thread = time_music()
thread.start()
def music_last():
global i
i -= 1
music_begin(i)
mixer.music.play()
thread = time_music()
thread.start()
def music_louder():
global loud
loud += 0.1
mixer.music.set_volume(loud)
return loud
def music_lower():
global loud
loud -= 0.1
mixer.music.set_volume(loud)
return loud
def music_pause():
mixer.music.pause()
pause()
def music_unpause():
mixer.music.unpause()
resume()
###以上函数实现对音乐的操作,编程需注意全局变量在每一个函数里面都应该glabal声明
###编辑播放器画面函数
def background(): #编辑画面背景
global top
top = tk.Tk()
# top.geometry() #设置窗口的初始大小
top.title("音乐播放器")
v1 = StringVar() #用tk.StringVar会报错,需要将tkinter中的StringVar调出 透明度变量
def printsrceen(v1): #调画面透明度函数
t = int(v1)
top.attributes("-alpha", t / 100)
# 多线程练手
# def update_time(): #获取当前时间函数
# def auto_update():
# current = time.strftime("%H:%M:%S")
# tk.Label(top, text="{0}".format(current), font=("Helvetica", 16)).place(x=10, y=10)
# time.sleep(1)
#
# t = threading.Thread(target=auto_update,daemon=True) # 创建子线程进行实时显示
# t.start()
# top.after(500,update_time) #500ms进行线程循环,实时性要求较高的话 可以将延时设小
#添加背景图片
photo = ImageTk.PhotoImage(file="背景.png")
Label = tk.Label(top, text='人生不止有酒,还有诗和远方。',justify=tk.LEFT,image=photo,compound=tk.CENTER,
font=("华文行楷",50),fg="white")
Label.pack() #默认字在中间
#添加按钮功能,美化按钮
photo1 = ImageTk.PhotoImage(file="按钮背景.jpg")
Button(top, text="暂停", command=music_pause,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=180, y=130)
Button(top, text="随机播放", command=music_random,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=180, y=50)
Button(top, text="下一首", command=music_next,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=300, y=130)
Button(top, text="上一首", command=music_last,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=300, y=50)
Button(top, text="继续", command=music_unpause,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=180, y=210)
Button(top, text="停止", command=music_stop,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=180, y=290)
Button(top, text="音量增", command=music_louder,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=300, y=210)
Button(top, text="音量减", command=music_lower,width=91,height=51,image=photo1,compound=tk.CENTER,
font=("宋体",15),fg="black").place(x=300, y=290)
#按钮内容编辑函数和Label设置函数内容一致
#设置透明度条
w2 = Scale(top, from_=30, to=100, orient="horizontal", width=20,length=300, variable=v1,
command=printsrceen, label="透明度")
w2.place(x=550,y=700)
# 设置实时时间显示
def update_time():
current = time.strftime("%H:%M:%S")
tk.Label(top, text="{0}".format(current), font=("Helvetica", 16)).place(x=10, y=10)
top.after(50,update_time)
update_time()
tk.mainloop()
music = name()
i = j = l = 1
loud = 0.5
flag = 0
background()
三、个人感受
? ? ? ? 零基础上手做小项目真的挺难,有时间还是得先巩固python第三方库的基本知识,了解什么功能该用哪种库、怎么用等等。编程真的累死了快!!!
? ? ? ? 下次用到tk就来这里找音乐播放器!
|