from time import sleep
from mutagen.mp3 import MP3
from pygame import mixer
from tkinter.filedialog import askdirectory
from conf import *
from tools.img.imgresize import image_resize
from ttkbootstrap import *
from glob import glob
from ttkbootstrap.dialogs import Messagebox
import threading
import inspect
import ctypes
def _async_raise(tid, exctype):
"""raises the exception, performs cleanup if needed"""
tid = ctypes.c_long(tid)
if not inspect.isclass(exctype):
exctype = type(exctype)
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
if res == 0:
raise ValueError("invalid thread id")
elif res != 1:
# """if it returns a number greater than one, you're in trouble,
# and you should call it again with exc=NULL to revert the effect"""
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(thread):
_async_raise(thread.ident, SystemExit)
def handler_adaptor(fun, **kwds):
"""事件处理函数的适配器,相当于中介,那个event是从那里来的呢,我也纳闷,这也许就是python的伟大之处吧"""
return lambda event, fun=fun, kwds=kwds: fun(event, **kwds)
class MusicWindows:
def __init__(self):
self.root = Window(size=(1000, 700))
w, h = self.get_win_size()
self.root.geometry(f'1000x700+{w}+{h}')
mixer.init()
self.music_list = []
self.volume_num = 0.5
self.music_num = 0
self.frame = Frame(self.root)
self.frame.pack(side=LEFT, anchor=CENTER, fill=BOTH, expand=YES)
self.canvas = Canvas(self.frame)
self.canvas.pack(side=LEFT, anchor=CENTER, fill=BOTH, expand=YES)
self.canvas.bind('<Configure>', lambda event: self.bj_canvas(event))
self.root.mainloop()
def get_win_size(self):
self.root.update()
return (self.root.winfo_screenwidth() - 1000) // 2, (
self.root.winfo_screenheight() - 700) // 2
def bj_canvas(self, event):
global bj_png, list_image, on_image, next_image, suspended_image, restore_image, high_volume_image
self.w, self.h = event.width, event.height
bj_png = ImageTk.PhotoImage(image_resize(image=bg_png, win_size=(self.w, self.h)))
self.canvas.create_image(self.w // 2, self.h // 2, image=bj_png)
self.create_progress_meter()
self.c_text = self.canvas.create_text(self.w // 2, self.h // 2, text='歌曲', font=('黑体', 30), fill='#771a25')
# 文件夹
dir_image = ImageTk.PhotoImage(dir_png.resize(size=(50, 50)))
self.ldir_image = self.canvas.create_image(self.w // 2 - 400, self.h - 100, image=dir_image)
self.dir_image = dir_image
# 列表
list_image = ImageTk.PhotoImage(list_png.resize(size=(50, 50)))
self.list_image = self.canvas.create_image(self.w // 2 - 300, self.h - 100, image=list_image)
self.llist_image = list_image
# 上一首
on_image = ImageTk.PhotoImage(on_png.resize(size=(50, 50)))
self.lon_image = self.canvas.create_image(self.w // 2 - 200, self.h - 100, image=on_image)
self.on_image = on_image
# 暂停
suspended_image = ImageTk.PhotoImage(suspended_png.resize(size=(50, 50)))
self.lsuspended_image = self.canvas.create_image(self.w // 2 - 100, self.h - 100, image=suspended_image)
self.suspended_image = suspended_image
# 继续
restore_image = ImageTk.PhotoImage(restore_png.resize(size=(50, 50)))
self.lrestore_image = self.canvas.create_image(self.w // 2, self.h - 100, image=restore_image)
self.restore_image = restore_image
# 下一首
next_image = ImageTk.PhotoImage(next_png.resize(size=(50, 50)))
self.lnext_image = self.canvas.create_image(self.w // 2 + 100, self.h - 100, image=next_image)
self.next_image = next_image
# 音量
high_volume_image = ImageTk.PhotoImage(high_volume.resize(size=(50, 50)))
self.lhigh_volume_image = self.canvas.create_image(self.w // 2 + 200, self.h - 100, image=high_volume_image)
self.high_volume_image = high_volume_image
self.volume_frame()
# 关联鼠标经过事件
self.canvas.bind('<Motion>', lambda event: self.motion(event))
# 关联鼠标点击事件
self.canvas.bind('<Button-1>', lambda event: self.buttons(event))
def motion(self, event):
global new_dir_image, new_list_image, new_on_image, new_suspended_image, new_restore_image, new_next_image, new_high_volume_image
self.canvas.update()
w, h = self.canvas.winfo_width(), self.canvas.winfo_height()
# 打开文件
if w // 2 - 432 <= event.x <= w // 2 - 368 and h - 132 <= event.y <= h - 68:
new_dir_image = ImageTk.PhotoImage(dir_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.ldir_image, image=new_dir_image)
# 列表
elif w // 2 - 332 <= event.x <= w // 2 - 268 and h - 132 <= event.y <= h - 68:
new_list_image = ImageTk.PhotoImage(list_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.list_image, image=new_list_image)
# 上一首
elif w // 2 - 232 <= event.x <= w // 2 - 168 and h - 132 <= event.y <= h - 68:
new_on_image = ImageTk.PhotoImage(on_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.lon_image, image=new_on_image)
# 暂停
elif w // 2 - 132 <= event.x <= w // 2 - 68 and h - 132 <= event.y <= h - 68:
new_suspended_image = ImageTk.PhotoImage(suspended_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.lsuspended_image, image=new_suspended_image)
# 继续
elif w // 2 - 32 <= event.x <= w // 2 + 32 and h - 132 <= event.y <= h - 68:
new_restore_image = ImageTk.PhotoImage(restore_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.lrestore_image, image=new_restore_image)
# 下一首
elif w // 2 + 68 <= event.x <= w // 2 + 132 and h - 132 <= event.y <= h - 68:
new_next_image = ImageTk.PhotoImage(next_png.resize(size=(60, 60)))
self.canvas.itemconfigure(self.lnext_image, image=new_next_image)
# 音量
elif w // 2 + 168 <= event.x <= w // 2 + 232 and h - 132 <= event.y <= h - 68:
new_high_volume_image = ImageTk.PhotoImage(high_volume.resize(size=(60, 60)))
self.canvas.itemconfigure(self.lhigh_volume_image, image=new_high_volume_image)
else:
self.canvas.itemconfigure(self.ldir_image, image=self.dir_image)
self.canvas.itemconfigure(self.list_image, image=self.llist_image)
self.canvas.itemconfigure(self.lon_image, image=self.on_image)
self.canvas.itemconfigure(self.lsuspended_image, image=self.suspended_image)
self.canvas.itemconfigure(self.lrestore_image, image=self.restore_image)
self.canvas.itemconfigure(self.lnext_image, image=self.next_image)
self.canvas.itemconfigure(self.lhigh_volume_image, image=self.high_volume_image)
def buttons(self, event):
self.canvas.update()
w, h = self.canvas.winfo_width(), self.canvas.winfo_height()
# 打开文件
if w // 2 - 432 <= event.x <= w // 2 - 368 and h - 132 <= event.y <= h - 68:
music_file = askdirectory()
self.get_music(music_file)
# 列表
elif w // 2 - 332 <= event.x <= w // 2 - 268 and h - 132 <= event.y <= h - 68:
if len(self.music_list) == 0:
Messagebox.show_error(title='错误', message='没有找到数据!!!',
评论0