Python 音乐播放器

今天给大家分享的是一个音乐播放器

下面为完整代码(音乐自备)

import tkinter

from tkinter import Button

from tkinter import Label

from tkinter import Entry

from tkinter import Scale

from tkinter import Label, PhotoImage

from PIL import Image, ImageTk

from tkinter import messagebox

from tkinter import Toplevel

from pymediainfo import MediaInfo

import re

from tkinter import Message

import threading

import pygame

import time

import os

import sys

import random

from tkinter.filedialog import askopenfilename

from tkinter.filedialog import askdirectory

from tkinter import StringVar

import requests

import json

top = tkinter.Tk()

top.geometry("800x400")

top.title("**的音乐播放器")

top.state("zoomed")


 

def printsrceen(texts):

t = int(texts)

top.attributes("-alpha", t / 100)


 

screenwidth = top.winfo_screenwidth()

screenheight = top.winfo_screenheight() - 100

pygame.init()

path = StringVar()

paths = StringVar()

patht = StringVar()

v = StringVar()

v1 = StringVar()


 

def callback(): # 搜索本地文件

path_ = askopenfilename()

return path_


 

def selectPath(): # 随机播放

folder_path = "D:/音乐"

folder_list = os.listdir(folder_path) # 遍历文件夹里面每个文件

list = []

count = 0

for i in folder_list: # 将文件夹里的文件按顺序传提给变量i 此处区别os.walk()

if os.path.splitext(i)[1] == '.flac': # 提取特定后缀文件'.***'

list.append(i)

# print(type(list))

count = count + 1

# print(count)

s = random.randint(0, (count - 1)) # 获取随机数

file = list[s]

fil = folder_path + "\\" + file

pygame.mixer.music.load(fil)

pygame.mixer.music.play(1, 0)

media_info = MediaInfo.parse(fil)

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)

l2.config(text=file)

l3.config(text=musictime)

lbTime = tkinter.Label(top, anchor='w')

lbTime.place(x=25, y=150)

def autoclose():

for i in range(m // 1000):

lbTime['text'] = '-{} /'.format((m // 1000) - i)

time.sleep(1)

t = threading.Thread(target=autoclose)

t.start()

loopl = top.after(m, selectPath)


 

def printScale(text):

t = int(text)

pygame.mixer.music.set_volume(t / 100)


 

def update_timeText():

# Get the current time, note you can change the format as you wish

current = time.strftime("%H:%M:%S") # 获取当前时间

# Update the timeText Label box with the current time

timeText.configure(text=current)

# Call the update_timeText() function after 1 second

top.after(1000, update_timeText)


 

def remind():

top = Toplevel() # 新建一个tkinter窗口

top.title('使用提示')

top.geometry("200x200")

t = "半分钟后开始播放音乐"

msg = Message(top, text=t)

msg.config(font=('times', 18, 'italic'))

msg.place(x=0, y=0)

lbTime = tkinter.Label(top, fg="red", anchor='w')

lbTime.place(x=100, y=45)

def autoclose():

for i in range(30):

lbTime['text'] = '距离窗口关闭还有{}秒'.format(30 - i)

time.sleep(1)

top.destroy()

t = threading.Thread(target=autoclose)

t.start()

loopl = top.after(60 * 59500, remind)


 

def reminds():

top = Toplevel()

top.title('使用提示')

top.geometry("200x200")

t = "宝贝可以休息一会啦"

msg = Message(top, text=t)

msg.config(font=('times', 24, 'italic'))

msg.place(x=0, y=0)

folder_path = "D:/音乐"

folder_list = os.listdir(folder_path) # 遍历文件夹里面每个文件

list = []

count = 0

for i in folder_list: # 将文件夹里的文件按顺序传提给变量i 此处区别os.walk()

if os.path.splitext(i)[1] == '.flac': # 提取特定后缀文件'.***'

list.append(i)

# print(type(list))

count = count + 1

# print(count)

s = random.randint(0, (count - 1))

file = list[s]

fil = folder_path + "\\" + file

pygame.mixer.music.load(fil)

pygame.mixer.music.play(1, 0)

lbTime = tkinter.Label(top, fg="red", anchor='w')

lbTime.place(x=100, y=45)

def autoclose():

for i in range(300):

lbTime['text'] = '距离窗口关闭还有{}秒'.format(300 - i)

time.sleep(1)

top.destroy()

t = threading.Thread(target=autoclose)

t.start()

loopl = top.after(60 * 60000, reminds)


 

def play(): # 播放音乐

# 拖动音乐文件到程序图标,然后播放音乐

if len(sys.argv) >= 2: # 判断是否通过拖动音频文件打开程序

f = sys.argv[1] # 如果是,则播放拖动的文件

else:

f = callback() # 若不是,则选择制定文件

pygame.mixer.music.load(f)

pygame.mixer.music.play()

path.set(f)

media_info = MediaInfo.parse(f)

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)

l2.config(text=f)

l3.config(text=musictime)

lbTime = tkinter.Label(top, anchor='w')

lbTime.place(x=25, y=150)

def autoclose():

for i in range(m // 1000):

lbTime['text'] = '-{} /'.format((m // 1000) - i)

time.sleep(1)

t = threading.Thread(target=autoclose)

t.start()

loopl = top.after(m, selectPath)


 

def stop():

pygame.mixer.music.stop() # 停止播放

top.after_cancel(loopl)


 

def pause():

pygame.mixer.music.pause() # 暂停


 

def unpause():

pygame.mixer.music.unpause() # 继续播放


 

def refleshpic(): # 保存的路径不能有中文,若需要中文则吧/换成\

global pic_copyright

bing_api_res = requests.get("https://api.no0a.cn/api/bing/0")

bing_api_dic = bing_api_res.json()

print(bing_api_dic)

pic_url = bing_api_dic['bing']['url']

pic_copyright = bing_api_dic['bing']['copyright']

pic_res = requests.get(pic_url)

pic=pic_res.content

f = open("./bing_img_cache.png", 'wb')

f.write(pic)

f.close()

path_s = "./bing_img_cache.png"

paths.set(path_s)

img_open = Image.open(e1.get())

img = ImageTk.PhotoImage(img_open)

l1.config(image=img)

l1.image = img


 

def create():

top = Toplevel()

top.title('使用提示')

top.geometry("400x400")

t = "关于照片,新建一个存放图片的文件,用英文命名,然后存里面的图片也用英文命名。关于音乐: 新建一个名字叫音乐的文件,把歌曲添加到该文件夹。"

msg = Message(top, text=t)

msg.config(font=('times', 24, 'italic'))

msg.place(x=0, y=0)


 

def copyright():

top = Toplevel()

top.title('版权信息')

top.geometry("500x400")

t = """左佳航同学原

创作品未经允许,不得转载"""%(pic_copyright)

msg = Message(top, text=t)

msg.config(font=('times', 24, 'italic'))

msg.place(x=0, y=0)


 

def loop():

top.after(60 * 60000, reminds)

top.after(60 * 59500, remind)


 

def loops():

selectPath()


 

def gettime():

t = time.strftime('%H%M%S')

s = int(t[0:2])

d = int(t[2:4])

f = int(t[4:6])

g = s * 60 * 60 + d * 60 + f

return g


 

errmsg = 'Error!'

# 时间

timeText = Label(top, text="", font=("Helvetica", 15))

timeText.place(x=180, y=370)

update_timeText()

# 选择文件

Button(top, text="选择文件/播放", command=play, width=10, bg="sky blue").place(x=20, y=20)

Entry(top, text=path, width=25, state='readonly').place(x=120, y=20)

# 选择图片

Button(top, text='刷新图片', command=refleshpic, width=10, bg="sky blue").place(x=20, y=55)

e1 = Entry(top, text=paths, state='readonly', width=25)

e1.place(x=120, y=55)

l1 = Label(top) # 图片放置位置

l1.place(x=320, y=0)

# 随机播放

Button(top, text="随机播放", command=selectPath, width=7, bg="sky blue").place(x=20, y=225)

l2 = Label(top, text='', width=25, font=("Helvetica", 16)) # 音乐名

l2.place(x=0, y=100)

Button(top, text="下一首", command=loops, width=5, bg="sky blue").place(x=100, y=225)

l3 = Label(top, text='', width=15) # 音乐时长

l3.place(x=24, y=150)

# 暂停,继续播放,结束播放

Button(top, text="暂停", command=pause, width=7, bg="sky blue").place(x=170, y=245)

Button(top, text="继续播放", command=unpause, width=7, bg="sky blue").place(x=170, y=205)

Button(top, text="结束播放", command=stop, width=7, bg="sky blue").place(x=240, y=225)

# 提醒功能

Button(top, text='提醒功能', command=loop, width=10, bg="sky blue").place(x=20, y=325)

# 使用说明

Button(top, text="使用说明", command=create, width=10, bg="sky blue").place(x=20, y=370)

#版权信息

Button(top, text="版权信息", command=copyright, width=10, bg="sky blue").place(x=20, y=415)

# 音量

w1 = Scale(top, from_=0, to=100, orient="horizontal", length=75, variable=v, command=printScale, label="音量")

w1.place(x=240, y=145)

w2 = Scale(top, from_=30, to=100, orient="horizontal", length=100, variable=v1, command=printsrceen, label="透明度")

w2.place(x=150, y=290)

if len(sys.argv) >= 2: # 初步判断是否通过拖动音频文件打开程序

play() # 如果是,则直接运行play()函数

refleshpic()

top.mainloop()


 

上一篇:python tkinter 入门教程


下一篇:tkinter grid