# -*- coding: utf-8 -*-
# @Time : 2018/3/28 11:58
# @Author : Song_Nan
# @Email : 910976007@qq.com
# @Software: PyCharm
import sys,glob
import Queue,time
import shelve,json
import requests,os,random
import codecs,Queue,mp3play
import gevent,threading
from Tkinter import *
from gevent import monkey
from lxml import etree
from PIL import Image, ImageTk
#类网页内容查找
class Html_Xpath():
def __init__(self,url):
self.html=r'Not Find'
self.headers=dict()
self.info=dict()
self.headers['User-Agent']= 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'
try:
req=requests.get(url,headers=self.headers,timeout=5)
req.encoding='utf-8'
if req.status_code==200:
self.html=etree.HTML(req.text)
else:return self.html
except requests.ConnectionError:return self.html
except requests.ConnectTimeout:return self.html
except requests.exceptions.ReadTimeout:return self.html
def xpathstr(self,xpathstr=''):
xpathlist=[]
try:
xpathlist=self.html.xpath(xpathstr)
if xpathlist==[]:
xpathlist= self.html.xpath('*//text()')[0]
print xpathlist
return xpathlist
except etree.XPathDocumentEvaluator:return xpathlist
except etree.XPathElementEvaluator:return xpathlist
except etree.XPathError:return xpathlist
except etree.XPathFunctionError:return xpathlist
except UnicodeEncodeError:return xpathlist
#类:数据库操作
class Shelve():
#参数引用数据库路径,并进行初始化操作
def __init__(self,shelve_file_name):
#公共属性接受数据库路径
self.shelve_file_name=shelve_file_name
#判断数据库文件是否存在:存在跳过,不存在创建新的数据库
file_dir = os.path.split(self.shelve_file_name)[0]
if not os.path.isdir(file_dir):
os.makedirs(file_dir)
if not os.path.exists(self.shelve_file_name):
os.system(r'touch %s' % self.shelve_file_name)
pickle_file = shelve.open(self.shelve_file_name, writeback=True)
pickle_file.close()
return
#数据库字段功能
#
#增,改
def add_items(self,items,key={}):
File_shelve = shelve.open(self.shelve_file_name, writeback=True)
File_shelve[items]=key
File_shelve.close()
return True
#删
def delete_items(self,items):
File_shelve = shelve.open(self.shelve_file_name, writeback=True)
#判断参数是否存在于数据库,存在:进行删除操作,不存在返回False
if File_shelve.has_key(items):
del File_shelve[items]
return_list = True
else:return_list=False
File_shelve.close()
return return_list
#查
def inquire_items(self,items):
File_shelve = shelve.open(self.shelve_file_name, flag='r')
# 判断参数是否存在于数据库,存在:进行查询操作,不存在返回None
if items in File_shelve.keys():
return_lsit=File_shelve[items]
else:return_lsit=None
File_shelve.close()
return return_lsit
#数据库字段下功能
#增,改
def add_items_key(self,items,key,value=''):
File_shelve = shelve.open(self.shelve_file_name, writeback=True)
File_shelve[items][key] =value
File_shelve.close()
return True
#删
def delete_items_key(self,items,key):
File_shelve = shelve.open(self.shelve_file_name, writeback=True)
if File_shelve.has_key(items)==True:
del File_shelve[items][key]
File_shelve.close()
return True
#查
def inquire_items_key(self,items,key):
File_shelve = shelve.open(self.shelve_file_name, flag='r')
# 判断参数items是否存在于数据库,存在:继续判断key,不存在返回None
if File_shelve.has_key(items)==True:
# 判断参数key是否存在于数据库items条目内,存在:返回数据,不存在返回None
if key in File_shelve[items]:
return_list=File_shelve[items][key]
else:return_list=None
else:return_list=None
File_shelve.close()
return return_list
#在线歌曲信息查找,返回字典格式数据(包含歌曲专辑图片网址,发行时间,歌唱者)---(资源引用QQ音乐)
#变量TEXT为搜索歌曲名称
class web_Song_Search():
def __init__(self,TEXT):
url='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?'
data={'ct':'24','qqmusic_ver':'1298','new_json':'1','remoteplace':'txt.yqq.center','searchid':'47353711014539436','t':'0','aggr':'1','cr':'1','catZhida':'1','lossless':'0','flag_qc':'0','p':'1','n':'20','w':r'%E7%A9%BA%E7%A9%BA','g_tk':'5381','jsonpCallback':'MusicJsonCallback08562790864064684','loginUin':'0','hostUin':'0','format':'jsonp','inCharset':'utf8','outCharset':'utf-8','notice':'0','platform':'yqq','needNewCode':'0'}
data['w']=TEXT
self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}
re=requests.get(url,headers=self.headers,params=data)
a=re.text.lstrip('MusicJsonCallback08562790864064684(').strip(')')
self.b=json.loads(a)
try:
Song_dict=self.b['data']['song']['list'][0]
self.url='https://y.qq.com/n/yqq/song/{}.html'.format(Song_dict['mid'])
except IndexError: self.url=None
return
def down(self):
if self.url==None:
song_name = 'None'
song_songer = 'None'
song_albums_name = 'None'
song_pic_url = 'None'
song_dict = {'song_pic_url': song_pic_url, 'song_name': song_name, 'song_songer': song_songer,'song_albums_name': song_albums_name}
return song_dict
else:
try:
html=Html_Xpath(self.url)
song_name=html.xpathstr('/html/body/div[2]/div[1]/div/div[1]/h1/@title')
song_songer=html.xpathstr('/html/body/div[2]/div[1]/div/div[2]/a/@title')
song_albums_name =html.xpathstr('/html/body/div[2]/div[1]/div/ul/li[1]/a/@title')
song_pic_url=html.xpathstr('/html/body/div[2]/div[1]/span/img/@src')
self.pic_url=song_pic_url[0]
self.song_dict={'song_pic_url':song_pic_url[0],'song_name':song_name[0], 'song_songer':song_songer[0], 'song_albums_name':song_albums_name[0]}
except TypeError:
song_name='None'
song_songer='None'
song_albums_name ='None'
song_pic_url='None'
self.pic_url=song_pic_url
self.song_dict={'song_pic_url':song_pic_url,'song_name':song_name, 'song_songer':song_songer, 'song_albums_name':song_albums_name}
return self.song_dict
# 类:图形界面构造,及功能函数绑定,待开发
class Application(object):
# 类构造函数
def __init__(self, object):
#变量初始化
#FLOG,播放线程结束标志符
self.flog =True
self.flog1 = False
#播放列表
self.mp3_song_list=list()
#播放列表映射
self.mp3_dict=dict()
#播放列表索引,用于上下曲播放
self.i=-1
self.song=''
# 创建容器Frame:
#面板容器创建
self.Frame_play = LabelFrame(object, width=220, height=90, text='播放台')
self.Frame_list=LabelFrame(object, width=350, height=270, text='歌曲列表')
self.Frame_pic = LabelFrame(object, width=350, height=90, text='歌曲信息')
self.Frame_lrc = LabelFrame(object, width=200, height=270, text='歌曲歌词')
# 容器下部件创建
self.Frame_play_CreateWidgets()
self.Frame_list_CreateWidgets()
self.Frame_pic_CreateWidgets()
self.Frame_lrc_CreateWidgets()
# 容器布局:
self.Frame_play.grid(row=0, column=0,padx=5, pady=5)
self.Frame_list.grid(rows=1, column=0, padx=5, pady=5)
self.Frame_pic.grid(row=0,column=1 , pady=5, padx=5)
self.Frame_lrc.grid(row=1, column=1, pady=5, padx=5)
self.updata_list()
self.Mp3_Pic_Updata()
self.Lrc_updata()
return
# 方法:容器创建部件及界面功能绑定
#播放功能及进度条区域部件创建(进度条区域功能未开发完毕)
def Frame_play_CreateWidgets(self):
#上层播放按钮区域
self.up_playbuttun=Button(self.Frame_play, text='上一曲', height=1,width=6,command=self.up_play, font=("Times", 8))
self.playbuttun=Button(self.Frame_play, text='停止',height=1,command=self.stop_play,width=6, font=("Times", 9))
self.down_playbuttun=Button(self.Frame_play, text='下一曲',height=1,width=6, command=self.down_play, font=("Times", 8))
self.up_playbuttun.grid(row=2,rowspan=3 ,column=5,columnspan=3, sticky=S, padx=10, pady=15)
self.down_playbuttun.grid(row=1,rowspan=5, column=10, columnspan=5,sticky=S, padx=10, pady=15)
self.playbuttun.grid(row=2,rowspan=3, column=15,columnspan=3, sticky=S,padx=10, pady=15)
#下层进度条区域
self.Progress_bar=Canvas(self.Frame_play,width=180, height=20,bg='#EEEEEE')
self.Progress_bar.create_rectangle(0, 16, 180, 20, fill="red", width=4)
self.Progress_bar.create_text(3, 7, text='00:00:00', font=("Times", 8), anchor=W, fill='red')
self.Progress_bar.create_text(135, 7, text='00:00:00', font=("Times", 8), anchor=W, fill='red')
self.Progress_bar.grid(row=6,rowspan=2, column=0,columnspan=20, sticky=S, padx=10, pady=11)
return
#歌曲播放方法(传入参数:播放音乐路径)
def Song_play(self,file_name):
def play(i):
self.hh=0
time_now="00:00:00|00:00:00"
try:
Voice_play = mp3play.load(file_name)
Voice_play.play()
start_time=time.time()
mp3_time=self.seconds_toMinutes_and_seconds(Voice_play.seconds())
bb=180/float(Voice_play.seconds())
play_time=0
while True:
time.sleep(0.5)
play_time = time.time() - start_time
self.hh = int(int(play_time) * bb)
if play_time>Voice_play.seconds():
play_time=Voice_play.seconds()
play_now_time = self.seconds_toMinutes_and_seconds(play_time)
time_now = ' | '.join([play_now_time, mp3_time])
self.Progress_bar_updata(time_now)
if play_time>Voice_play.seconds or self.flog == True:
self.Progress_bar_updata("00:00:00|00:00:00")
self.flog = False
return
except ValueError:
self.flog = False
self.Progress_bar_updata("00:00:00|00:00:00")
print '播放失败'
My_Thread = threading.Thread(target=play, args=(1,))
My_Thread.setDaemon(False)
My_Thread.start()
self.flog = False
return
#上一曲播放
def up_play(self):
if self.i<0:
self.i=self.mp3list.size()
self.i -= 1
if self.flog1==True:
self.i=random.randint(0,self.mp3list.size())
self.hh = 0
self.flog=True
self.mp3list.select_set(self.i)
self.mp3list.select_clear(self.i-1)
self.mp3_name=self.mp3list.get(self.i)
self.Mp3_name_Updata(self.mp3_name)
sh = Shelve('F:\mp3\Shelve\mp3_shelve.db')
a=self.song_file_name=sh.inquire_items_key(self.mp3_name,'File')
print self.mp3_name,a,self.song_file_name
self.Mp3_Information_songer(sh.inquire_items_key(self.mp3_name,'song_songer'))
self.Mp3_Information_albums(sh.inquire_items_key(self.mp3_name,'song_albums_name'))
self.Mp3_Pic_Updata(sh.inquire_items_key(self.mp3_name,'song_pic_file'))
print sh.inquire_items_key(self.mp3_name, 'lrc_file')
self.Lrc_updata(sh.inquire_items_key(self.mp3_name,'lrc_file'))
time.sleep(1.4)
self.Song_play(self.song_file_name)
return
#下一曲播放
def down_play(self):
if self.i>self.mp3list.size():self.i=-1
self.i += 1
if self.flog1==True:
self.i=random.randint(0,self.mp3list.size())
self.hh = 0
self.flog=True
self.mp3list.select_set(self.i)
self.mp3list.select_clear(self.i-1)
self.mp3_name=self.mp3list.get(self.i)
self.Mp3_name_Updata(self.mp3_name)
sh = Shelve('F:\mp3\Shelve\mp3_shelve.db')
self.song_file_name=sh.inquire_items_key(self.mp3_name,'File')
self.Mp3_Information_songer(sh.inquire_items_key(self.mp3_name,'song_songer'))
self.Mp3_Information_albums(sh.inquire_items_key(self.mp3_name,'song_albums_name'))
self.Mp3_Pic_Updata(sh.inquire_items_key(self.mp3_name,'song_pic_file'))
print sh.inquire_items_key(self.mp3_name, 'lrc_file')
self.Lrc_updata(sh.inquire_items_key(self.mp3_name,'lrc_file'))
time.sleep(1.4)
self.Song_play(self.song_file_name)
return
#随机播放设置
def tt(self):
self.flog1=True
return
#顺序播放设置
def tt1(self):
self.flog1=False
return
#停止播放
def stop_play(self):
self.flog = True
return
#列表框双击播放nag
def list_play(self,event):
self.hh = 0
self.flog=True
sh = Shelve('F:\mp3\Shelve\mp3_shelve.db')
self.song_name = self.mp3list.get(self.mp3list.curselection())
self.i=self.mp3list.curselection()[0]
self.song_file_name=sh.inquire_items_key(self.song_name,'File')
self.Mp3_name_Updata(self.song_name)
self.Mp3_Information_songer(sh.inquire_items_key(self.song_name,'song_songer'))
self.Mp3_Information_albums(sh.inquire_items_key(self.song_name,'song_albums_name'))
self.Mp3_Pic_Updata(sh.inquire_items_key(self.song_name,'song_pic_file'))
print sh.inquire_items_key(self.mp3_name, 'lrc_file')
self.Lrc_updata(sh.inquire_items_key(self.mp3_name, 'lrc_file'))
time.sleep(2)
self.Song_play(self.song_file_name)
return
#播放时间转换(秒转化为时分秒形式:h:m:s),用于刷新进度条播放进度显示已播放时间
def seconds_toMinutes_and_seconds(self,seconds):
if type(seconds)==type(int(0)):
m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
else:
m, s = divmod(int(seconds), 60)
h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s)
#播放进度条更新
def Progress_bar_updata(self,text):
def updata(i):
time1=text.split('|')[0]
time2=text.split('|')[1]
if self.hh>180:
self.hh=180
self.Progress_bar.create_rectangle(0, 0, 300, 25, fill='#EEEEEE')
self.Progress_bar.grid(row=6, rowspan=2, column=0, columnspan=20, sticky=S, padx=10, pady=10)
self.Progress_bar.create_text(3, 7, text=time1, font=("Times", 8), anchor=W, fill='blue')
self.Progress_bar.grid(row=6, rowspan=2, column=0, columnspan=20, sticky=S, padx=10, pady=10)
self.Progress_bar.create_text(135, 7, text=time2, font=("Times", 8), anchor=W, fill='red')
self.Progress_bar.grid(row=6, rowspan=2, column=0, columnspan=20, sticky=S, padx=10, pady=10)
self.Progress_bar.create_rectangle(0, 16, 180, 20, fill="red", width=4)
self.Progress_bar.grid(row=6, rowspan=2, column=0, columnspan=20, sticky=S, padx=10, pady=10)
self.Progress_bar.create_line(4, 18, self.hh, 18, fill="green", width=4)
self.Progress_bar.grid(row=6, rowspan=2, column=0, columnspan=20, sticky=S, padx=10, pady=10)
return
updata(1)
return
#歌曲列表区域部件创建
def Frame_list_CreateWidgets(self):
self.var=StringVar()
#歌词列表
self.buttun1=Button(self.Frame_list, text='随机播放', height=1,width=10,command=self.tt, font=("Times", 8))
self.buttun2 = Button(self.Frame_list, text='顺序播放', height=1, width=10, command=self.tt1, font=("Times", 8))
self.mp3list=Listbox(self.Frame_list,listvariable = self.var,width=30, height=16)
self.mp3list.grid(row=1, columnspan=4, sticky=S, padx=9, pady=2)
self.mp3list.bind('',self.list_play)
self.buttun1.grid(row=0, column=2, sticky=S, padx=9, pady=2)
self.buttun2.grid(row=0, column=3, sticky=S, padx=9, pady=2)
return
#歌曲列表框数据插入(参数:列表形式数据)
def add_item1(self,song_list):
for itmes in song_list:
self.mp3list.insert(song_list.index(itmes),itmes)
return
#播放列表初始化
def updata_list(self):
mp3_list=[]
for file_name in glob.glob(r'F:\mp3\mp3\*.mp3'):
mp3_name = file_name.split('\\')[-1]
mp3_list.append(mp3_name)
for items in mp3_list:
self.mp3list.insert(mp3_list.index(items),items)
return
#歌曲图片及详情区域部件创建(详情功能未开发完毕)
def Frame_pic_CreateWidgets(self):
#歌曲详情
#左侧区域:图片
self.mp3_pic=Canvas(self.Frame_pic,width=80, height=80,bg='#EEEEEE')
self.mp3_pic.grid(row=1,rowspan=7, column=0, sticky=S, padx=10, pady=10)
#右侧区域:信息
self.mp3_name_Canvas = Canvas(self.Frame_pic, width=215, height=15, bg='#EEEEEE')
self.mp3_name_Canvas.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_name_Canvas.create_text(2, 11, text='歌曲名称:', font=("Times", 8), anchor=W, fill='red')
self.mp3_name_Canvas.grid(row=1, column=2, sticky=S, padx=5, pady=10)
self.mp3_songer = Canvas(self.Frame_pic, width=215, height=15, bg='#EEEEEE')
self.mp3_songer.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_songer.create_text(2, 11, text='演唱者:', font=("Times", 8), anchor=W, fill='red')
self.mp3_songer.grid(row=2, column=2, sticky=S, padx=5, pady=1)
self.mp3_albums = Canvas(self.Frame_pic, width=215, height=15, bg='#EEEEEE')
self.mp3_albums.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_albums.create_text(2, 11, text='专辑信息:', font=("Times", 8), anchor=W, fill='red')
self.mp3_albums.grid(row=3, column=2, sticky=S, padx=5, pady=1)
return
#歌曲图片刷新(后期引入本Mp3_Pic_Updata地数据库内容,动态加载图片,预留参数self.Pic_File,图片地址)
def Mp3_Pic_Updata(self,path=r'F:\mp3\pic\not_pic.jpg'):
global im
image = Image.open(path)
print_image = image
image.thumbnail((80, 80))
im = ImageTk.PhotoImage(image)
self.mp3_pic.create_image(42, 42, image=im)
self.mp3_pic.grid(row=1,rowspan=7, column=0, sticky=S, padx=10, pady=10)
return
#播放歌曲详细信息更新
def Mp3_Information_songer(self,text):
def updata2(i):
self.mp3_songer.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_songer.grid(row=2, column=2, sticky=S, padx=5, pady=1)
self.mp3_songer.create_text(2, 11, text='演唱者:'+text, font=("Times", 8), anchor=W, fill='red')
self.mp3_songer.grid(row=2, column=2, sticky=S, padx=5, pady=1)
return
My_Thread=threading.Thread(target=updata2,args=(1,))
My_Thread.start()
return
#歌曲名称刷新(参数text,打印参数值到画布,后期引用数据库歌曲名称信息接口)
def Mp3_name_Updata(self,text):
def updata(i):
title=text.split('.')[0]
self.mp3_name_Canvas.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_name_Canvas.grid(row=1, column=2, sticky=S, padx=5, pady=10)
self.mp3_name_Canvas.create_text(2, 11, text='歌曲名称:'+title, font=("Times", 8), anchor=W, fill='red')
self.mp3_name_Canvas.grid(row=1, column=2, sticky=S, padx=5, pady=10)
return
My_Thread=threading.Thread(target=updata,args=(1,))
My_Thread.start()
return
#播放详细信息:专辑名称更新
def Mp3_Information_albums(self, text):
def updata1(i):
self.mp3_albums.create_rectangle(0, 0, 250, 20, fill='#EEEEEE')
self.mp3_albums.grid(row=3, column=2, sticky=S, padx=5, pady=1)
self.mp3_albums.create_text(2, 11, text='专辑信息:'+text, font=("Times", 8), anchor=W, fill='red')
self.mp3_albums.grid(row=3, column=2, sticky=S, padx=5, pady=1)
return
My_Thread = threading.Thread(target=updata1, args=(1,))
My_Thread.start()
return
#歌曲歌词显示区域部件创建(待开发)
def Frame_lrc_CreateWidgets(self):
#歌词面板
self.lrc=Listbox(self.Frame_lrc,width=51, height=18, bg='#EEEEEE')
self.lrc.grid(row=0, column=0, sticky=S, padx=10, pady=1)
return
def Lrc_updata(self,file=r'F:\mp3\lrc\1.lrc'):
lrc_list=list()
with open(file,'rb') as f:
for line in f:
a=line
lrc_list.append(a)
self.lrc.delete(0, END)
for i in range(len(lrc_list)):
self.lrc.insert(i,lrc_list[i])
def frist():
sh = Shelve('F:\mp3\Shelve\mp3_shelve.db')
for file_name in glob.glob(r'F:\mp3\mp3\*.mp3'):
mp3_name = file_name.split('\\')[-1]
key = mp3_name
Song_Search = web_Song_Search(key)
Search_song_html_list = Song_Search.down()
if sh.inquire_items(key) == None:
sh.add_items(key)
sh.add_items_key(key, 'File', file_name)
sh.add_items_key(key, 'mp3_name', mp3_name)
if sh.inquire_items_key(key,'song_pic_url')==None:
value=Search_song_html_list['song_pic_url']
value=value.encode('utf-8')
print value
sh.add_items_key(key,'song_pic_url',value)
if sh.inquire_items_key(key,'song_name')==None:
value=Search_song_html_list['song_name']
value=value.encode('utf-8')
print value
sh.add_items_key(key,'song_name',value)
if sh.inquire_items_key(key,'song_songer')==None:
value=Search_song_html_list['song_songer']
value=value.encode('utf-8')
print value
sh.add_items_key(key,'song_songer',value)
if sh.inquire_items_key(key,'song_albums_name')==None:
value=Search_song_html_list['song_albums_name']
value=value.encode('utf-8')
print value
sh.add_items_key(key,'song_albums_name',value)
if sh.inquire_items_key(key,'lrc_file')==None:
lrc_file=lrc_down(key,sh.inquire_items_key(key,'song_name'))
sh.add_items_key(key, 'lrc_file', lrc_file)
if sh.inquire_items_key(key,'song_pic_file')==None:
path=r'F:\mp3\pic\{}.jpg'.format(mp3_name.strip('.mp3'))
if Search_song_html_list['song_pic_url'] != 'None':
url=Search_song_html_list['song_pic_url']
Pic_Content = requests.get('https:' + url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}).content
print path
try:
with open(path, 'wb') as f:
f.write(Pic_Content)
f.flush()
f.close()
except IOError:path=r'F:\mp3\pic\not_pic.jpg'
else:path=r'F:\mp3\pic\not_pic.jpg'
sh.add_items_key(key, 'song_pic_file', path)
return
def lrc_down(key,text):
te = text.replace(' ', '+')
sh = Shelve('F:\mp3\Shelve\mp3_shelve.db')
url = 'http://www.xiami.com/search/?&key={}'.format(te)
try:
a = Html_Xpath(url)
b = a.xpathstr('//*[@id="wrapper"]/div[2]/div[1]/div/div[2]/div[1]/div[1]/table/tbody/tr[1]/td[2]/a/@href')
c = Html_Xpath(b[0])
D = c.xpathstr('//*[@id="lrc"]//text()')
lrc_file ='F:\mp3\lrc\{}.lrc'.format(text)
with codecs.open(lrc_file , 'wb', encoding='utf-8') as f:
for i in D[:-2]:
if i in ['\n', '\r\n', '']:
pass
else:
f.write(i.replace('\n', '') + '\n')
f.flush()
except requests.RequestException:
lrc_file = r'F:\mp3\lrc\no.lrc'
return lrc_file
#数据库刷新
#frist()
#程序启动
ROOT=Tk()
###################
app = Application(ROOT)
# 设置窗口标题:
ROOT.title('音乐播放器')
#设置图标
#ROOT.iconbitmap('F:\mp3\pic\ico.ico')
# 设置窗口大小:
ROOT.geometry('570x400')
# 设置窗口大小(不可变):
ROOT.resizable(width=False, height=False)
# 主消息循环:
ROOT.mainloop()
###############################################