成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python基于tkinter制作無損音樂下載工具(附源碼)

瀏覽:179日期:2022-06-24 08:06:28

繼續寫GUI,本次依然使用Tkinter設計一款圖形界面,使用Tkinter做一款音樂下載軟件,聽起來聽平常的,但是我這款軟件能夠下載 無損音樂下載軟件,聽起來不錯吧,Let`s go!

一.準備工作

python Tkinter

二.預覽

python基于tkinter制作無損音樂下載工具(附源碼)

1.搜索

python基于tkinter制作無損音樂下載工具(附源碼)

2.下載

python基于tkinter制作無損音樂下載工具(附源碼)

3.結果

無損音樂就這樣下載完了。

python基于tkinter制作無損音樂下載工具(附源碼)

三.詳細設計

這里僅展示我設計的整體思路。

python基于tkinter制作無損音樂下載工具(附源碼)

四.源代碼4.1 Music_Search-v1.0.py

from tkinter import *from tkinter import ttkfrom tkinter import messageboxfrom Music_Search_Engine import Spiderimport threadingfrom tkinter.filedialog import askdirectoryimport os’’’1.加入e1綁定事件,b1=’disable’2. 03.15-使用self.flag判斷當前下載任務是否完成3.實現UI和爬蟲分離,返回實時進度’’’class App: def __init__(self): self.w=Tk() self.w.title(’Music_Search-v1.0’) self.w.resizable(0,0) self.flag=True width=400 height=560 left=(self.w.winfo_screenwidth()-width)/2 top=(self.w.winfo_screenheight()-height)/2 self.w.geometry(’%dx%d+%d+%d’%(width,height,left,top)) self.create_widget() self.set_widget() self.place_widget() self.w.mainloop() def create_widget(self): self.e2_var=StringVar() self.r_choice=IntVar() self.l3_var=StringVar() self.l1=ttk.Label(self.w,text=’關鍵字:’) self.e1=ttk.Entry(self.w) self.b1=ttk.Button(self.w,text=’搜索’) self.l4 = ttk.Label(self.w, text=’存儲路徑:’) self.e2 = ttk.Entry(self.w,textvariable=self.e2_var) self.b2 = ttk.Button(self.w, text=’選擇’) self.l2=ttk.Label(self.w,text=’下載品質:’) self.r1=Radiobutton(self.w,text=’標準’,value=1) self.r2=Radiobutton(self.w,text=’高品’,value=2) self.r3=Radiobutton(self.w,text=’無損’,value=3) self.b3=ttk.Button(self.w,text=’下載’) self.listbox=Listbox(self.w) self.canvas = Canvas(self.w, bg='white') self.l3=ttk.Label(self.w) self.m=Menu(self.w) self.w[’menu’]=self.m self.s1=Menu(self.m,tearoff=False) self.s2=Menu(self.m,tearoff=False) self.s3=Menu(self.m,tearoff=False) def set_widget(self): self.b1.config(command=lambda:self.thread_it(self.search_music)) self.e1.config(justify=’center’) self.b2.config(command=self.open_file_savepath) self.r1.config(variable=self.r_choice,command=self.show_size,state=’disable’) self.r2.config(variable=self.r_choice,command=self.show_size,state=’disable’) self.r3.config(variable=self.r_choice,command=self.show_size,state=’disable’) self.b3.config(command=lambda:self.thread_it(self.pre_download)) self.canvas.config(width=380, height=20) self.w.bind(’<<ListboxSelect>>’,self.show_info) self.e1.bind(’<Return>’,self.do_search) self.w.protocol(’WM_DELETE_WINDOW’,self.quit_window) self.w.bind(’<Escape>’,self.do_escape) self.l3.config(textvariable=self.l3_var,background=’lightblue’,justify=’center’) self.l3_var.set(’請先搜索’) self.listbox.config(state=’disable’) self.abs_path = os.path.abspath(’./’) self.e2_var.set(self.abs_path) self.e2.config(state=’readonly’) self.b3.config(state=’disable’) self.m.add_cascade(label=’文件’,menu=self.s1) self.s1.add_command(label=’打開文件夾’,command=self.open_dir) self.s1.add_separator() self.s1.add_command(label=’退出’,command=self.quit_window) self.m.add_cascade(label=’操作’,menu=self.s2) self.s2.add_command(label=’搜索’,command=lambda:self.thread_it(self.search_music)) self.s2.add_command(label=’下載’,command=lambda:self.thread_it(self.pre_download)) self.s2.entryconfig('下載',state=DISABLED) self.m.add_cascade(label=’關于’,menu=self.s3) self.s3.add_command(label=’說明’,command=self.show_explian) def place_widget(self): self.l1.place(x=10,y=10) self.e1.place(x=80,y=10,width=200) self.b1.place(x=310,y=10,height=25,width=80) self.l2.place(x=10,y=80) self.r1.place(x=80,y=80) self.r2.place(x=160,y=80) self.r3.place(x=240,y=80) self.l4.place(x=10,y=50) self.e2.place(x=80,y=50,width=200) self.b2.place(x=310,y=45,height=25,width=80) self.b3.place(x=310,y=80,height=25,width=80) self.listbox.place(x=10,y=110,width=380,height=380) self.l3.place(x=0,y=520,width=400,height=35) self.canvas.place(x=10,y=492) def thread_it(self,func,*args): t=threading.Thread(target=func,args=args) t.setDaemon(True) t.start() def do_search(self,event): self.thread_it(self.search_music) def search_music(self): self.l3_var.set(’’) self.listbox.delete(0,END) spider=Spider() if self.e1.get(): self.music_list=spider.Get_Music_List(self.e1.get()) if self.music_list: self.listbox.config(state=’normal’) counter=1 for data in self.music_list: song_name = data.get(’song_name’) self.listbox.insert(END,str(counter)+’、’+song_name) self.listbox.update() counter+=1 self.l3_var.set(f’共檢索到了{len(self.music_list)}首歌曲’) self.s2.entryconfig('下載', state=NORMAL) self.b3.config(state=’normal’) else: messagebox.showinfo(’提示’,’沒有找到相關歌曲,請更換關鍵字!’) self.l3_var.set(’沒有找到相關歌曲,請更換關鍵字!’) self.l3.config(background=’lightblue’) else: messagebox.showerror(’錯誤’,’請輸入關鍵字!’) self.l3_var.set(’請輸入關鍵字!’) self.l3.config(background=’red’) def show_info(self, event): self.r1.config(state=’normal’) self.r2.config(state=’normal’) self.r3.config(state=’normal’) self.r_choice.set(0) try: listbox_index = self.listbox.curselection()[0]#獲取選中歌曲索引 data=self.music_list[listbox_index] if data[’FileHash’]==’’and data[’FileSize’]==0: self.r1.config(state=’disable’) self.r1.config(state=’disable’) self.file_size=data[’FileSize’] if data[’HQFileHash’] == ’’and data[’HQFileSize’]==0: self.r2.config(state=’disable’) self.hq_size=data[’HQFileSize’] if data[’SQFileHash’] == ’’and data[’SQFileSize’]==0: self.r3.config(state=’disable’) self.sq_size=data[’SQFileSize’] self.l3_var.set(’歌曲名稱:’+data[’song_name’]) except (IndexError,TclError): pass def show_size(self): try: if self.r_choice.get() == 1: self.l3_var.set(’標準格式文件大?。骸?+ self.process_size(self.file_size)) elif self.r_choice.get() == 2: self.l3_var.set(’高品質格式文件大?。骸?+ self.process_size(self.hq_size)) elif self.r_choice.get() == 3: self.l3_var.set(’無損格式文件大?。骸?+ self.process_size(self.sq_size)) except AttributeError: messagebox.showwarning(’警告’,’請先選擇歌曲’) self.r_choice.set(0) def process_size(self,bytes): try: bytes=float(bytes) kb=bytes/1024 except: return ’error’ if kb>1024: mb=kb/1024 if mb>1024: gb=mb/1024 return ’%.2fGB’%gb else: return ’%.2fMB’%mb else: return ’%.2fKB’%kb def open_file_savepath(self): self.file = askdirectory() if self.file: self.e2_var.set(self.file) def pre_download(self): listbox_index = self.listbox.curselection()[0] # 獲取選中歌曲索引 data = self.music_list[listbox_index] music_name=data[’song_name’] if self.r_choice.get()==1: FileHash=data[’FileHash’] real_link=Spider().get_music_link(FileHash) type=’mp3’ if real_link: self.download_music(real_link,music_name,type) else: messagebox.showwarning(’警告’,’沒有此音樂版權,正在爭取!’) elif self.r_choice.get()==2: HQFileHash=data[’HQFileHash’] type=’mp3’ real_link=Spider().get_music_link(HQFileHash) if real_link: self.download_music(real_link,music_name,type) else: messagebox.showwarning(’警告’,’沒有此音樂版權,正在爭??!’) elif self.r_choice.get()==3: SQFileHash=data[’SQFileHash’] type=’flac’ real_link=Spider().get_music_link(SQFileHash) if real_link: self.download_music(real_link,music_name,type) else: messagebox.showwarning(’警告’,’沒有此音樂版權,正在爭取!’) def download_music(self,music_link,music_name,music_type): if self.flag: self.flag=False file_path=self.e2_var.get() # 先清空進度條,再下載 self.clean_progressbar() try: os.mkdir(file_path+’/My_Music/’) except: pass file = file_path+f’/My_Music/{music_name}.{music_type}’ fill_line = self.canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill='green') self.l3_var.set(f’正在下載{music_name}......’) for process in Spider().download_music(music_link,file_path=file): self.canvas.coords(fill_line, (0, 0, process, 60)) self.w.update() self.l3_var.set(f’{music_name}.{music_type}下載完成!’) messagebox.showinfo(’提示’,f’{music_name}.{music_type}下載完成!’) self.flag=True else: messagebox.showwarning(’警告’,’請等待當前任務完成!’) def clean_progressbar(self): # 清空進度條 fill_line = self.canvas.create_rectangle(1.5, 1.5, 0, 23, width=0, fill='white') x = 500 # 未知變量,可更改 n = 380 / x # 465是矩形填充滿的次數 for t in range(x): n = n + 380 / x # 以矩形的長度作為變量值更新 self.canvas.coords(fill_line, (0, 0, n, 60)) self.w.update() def open_dir(self): file_path=self.e2_var.get() try: os.mkdir(file_path + ’/My_Music/’) except: pass os.startfile(file_path + ’/My_Music/’) def show_explian(self): messagebox.showwarning(’敬告’,’本軟件僅供學習交流!’) def do_escape(self,event): self.quit_window() def quit_window(self): ret=messagebox.askyesno(’退出’,’是否要退出?’) if ret: self.w.destroy()if __name__ == ’__main__’: a=App()4.2 Music_Search_Engine.py

import requestsimport reimport jsonfrom urllib import parseimport hashlibfrom requests.adapters import HTTPAdapterclass Spider(object): def clean_txt(self, title): # 清洗標題中不能用于命名文件的字符 rstr = r'[/:*?'<>|]' # ’/ : * ? ' < > |’ title = re.sub(rstr, '_', title) # 替換為下劃線 return title def get_one_page(self, url): headers = { ’referer’: ’https://www.kugou.com/song/’, ’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36’ } try: s = requests.Session() # 保持會話 s.mount(’http://’, HTTPAdapter(max_retries=3)) # 最大重試 s.mount(’https://’, HTTPAdapter(max_retries=3)) r = s.get(url, headers=headers, timeout=15) # 超時設置 r.raise_for_status() # 狀態碼 如果不是200則報錯 r.encoding = ’utf-8’ # r.apparent_encoding#字符類型 return r.text # 返回頁面 except: pass def Get_Music_List(self, key_word): result_list=[] search_url = ’http://songsearch.kugou.com/song_search_v2?keyword={}&page=1’.format(key_word) total = json.loads(self.get_one_page(search_url))[’data’][’total’] #total值為0就是沒有搜索到相關歌曲 if total != 0: search_total_url = search_url + ’&pagesize=%d’ % total music_list = json.loads(self.get_one_page(search_total_url))[’data’][’lists’] # 歌曲列表 for music in music_list: item = {}#防止字典值覆蓋 item[’song_name’]=self.clean_txt(music[’FileName’].replace(’<em>’, ’’).replace(’</em>’, ’’)) # 歌手—歌曲 item[’FileHash’]=music[’FileHash’] item[’HQFileHash’]=music[’HQFileHash’] item[’SQFileHash’]=music[’SQFileHash’] item[’FileSize’]=music[’FileSize’] item[’HQFileSize’]=music[’HQFileSize’] item[’SQFileSize’]=music[’SQFileSize’] result_list.append(item) return result_list else: return None def v2_md5(self, Hash): # 用于生成key, return hashlib.md5((Hash + ’kgcloudv2’).encode(’utf-8’)).hexdigest() def get_music_link(self, hash): Hash = str.lower(hash) # 小寫哈希值 key_new = self.v2_md5(Hash) # 生成v2系統key Music_api_1 = ’http://trackercdnbj.kugou.com/i/v2/’ params = { ’cmd’: 23, ’pid’: 1, ’behavior’: ’download’, ’hash’: Hash, ’key’: key_new } try: real_music_link=json.loads(self.get_one_page(Music_api_1+’?’+parse.urlencode(params)))[’url’] return real_music_link except KeyError: return None #實時返回當前下載進度 def download_music(self,music_link,file_path): headers = { ’sec-fetch-dest’: ’document’, ’user-agent’: ’Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36’ } r = requests.get(music_link, headers=headers, stream=True) chunk_size = 1024 # 每一塊的大小,每次下載塊的大小 file_size = int(r.headers[’Content-Length’]) # 提取出來的文件大小為string格式,使用int()強制轉化 raise_data = 380 / (file_size / chunk_size) # 增量大小,380為進度條的長度 _size = 0 # 已經下載文件的大小 with open(file_path, 'wb') as f: n = 0 for data in r.iter_content(chunk_size): # inter_content:用于邊下載邊存硬盤,每次下載chunk_size大小的塊 f.write(data) n += raise_data yield n五.總結

本次使用TKinter制作一款無損音樂下載軟件,工具打包好放在了藍奏云,請自取。思路、代碼方面有什么不足歡迎各位大佬指正、批評!如果覺得軟件還可以,點個贊吧。

以上就是python基于tkinter制作無損音樂下載工具(附源碼)的詳細內容,更多關于python制作音樂下載工具的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品av综合导航| 久久久久久久久久看片| 精品人在线二区三区| 另类综合日韩欧美亚洲| 久久一区欧美| 午夜国产不卡在线观看视频| 国产日韩欧美一区| 一区二区三国产精华液| 黄色一区三区| 中文字幕一区视频| 国产综合视频| 久久精品夜夜夜夜久久| 成人18精品视频| 欧美成人性战久久| 国产成人99久久亚洲综合精品| 欧美日韩一区高清| 久久99精品久久久久久国产越南| 一本色道久久综合亚洲精品按摩| 婷婷亚洲久悠悠色悠在线播放| 久久精品人人| 日韩成人免费电影| 色婷婷久久久久swag精品 | 色哦色哦哦色天天综合| 亚洲自拍偷拍图区| 亚洲少妇一区| 亚洲成人av免费| 一本久久精品一区二区| 日韩精品免费视频人成| 日本乱码高清不卡字幕| 日本视频一区二区三区| 色94色欧美sute亚洲线路一ni | 国产精品18久久久久久久久久久久| 欧美精品 日韩| 国产福利91精品| 56国语精品自产拍在线观看| 国产一二三精品| 日韩精品一区二区三区在线观看| 成人sese在线| 国产精品素人视频| 国产日韩综合| 麻豆精品视频在线观看| 欧美精品色一区二区三区| 国产精品亚洲专一区二区三区 | 在线免费一区三区| 精品一区二区三区的国产在线播放| 欧美精品tushy高清| 成人精品视频一区二区三区| 2023国产精品| 亚洲国产欧美国产综合一区 | 成人午夜视频在线观看| 久久精品欧美日韩精品| 激情久久一区| 亚洲福利视频一区| 欧美亚洲动漫另类| 成人爽a毛片一区二区免费| 久久精品男人的天堂| 一区视频在线| 天天综合日日夜夜精品| 91麻豆精品国产91久久久 | 欧美在线观看禁18| 国产成人亚洲精品狼色在线| 久久色.com| 99在线精品免费视频九九视| 日韩激情视频网站| 日韩欧美aaaaaa| 黑丝一区二区| 婷婷开心久久网| 欧美一区国产二区| 欧美日韩免费精品| 亚洲成人av一区二区三区| 欧美精品第1页| 欧美日韩国产在线一区| 亚洲精品乱码久久久久久| 日本大香伊一区二区三区| 国产成a人亚洲精| 最新久久zyz资源站| 久久国产日韩| 国产精品18久久久久久久久久久久| 日本一二三不卡| 久热精品在线| av色综合久久天堂av综合| 亚洲男人的天堂在线aⅴ视频| 日本久久精品电影| 色综合天天综合网天天狠天天 | 五月天婷婷综合| 欧美一级爆毛片| 一区二区三区四区五区视频| 国产一区视频在线看| 中文一区二区在线观看| 色婷婷久久久综合中文字幕| 99热精品一区二区| 婷婷成人激情在线网| 精品电影一区二区三区 | 久久国产精品亚洲va麻豆| 国产91精品久久久久久久网曝门| 最新国产成人在线观看| 欧美另类高清zo欧美| 欧美日韩岛国| 久久精品国产99国产精品| 久久综合久色欧美综合狠狠| 一区二区毛片| 成人av资源站| 日韩av电影免费观看高清完整版 | 欧美精品一卡二卡| 日韩亚洲国产欧美| 福利一区二区在线观看| 一区二区三区在线免费播放| 日韩欧美电影一区| 美女精品网站| 欧美日韩一区二区三区四区在线观看| 日本sm残虐另类| 中文字幕人成不卡一区| 欧美乱妇20p| 亚洲在线不卡| 欧美久久视频| 久久99国产精品久久99| 亚洲女人小视频在线观看| 日韩欧美激情在线| 狂野欧美一区| 亚洲午夜精品久久| 国产精品18久久久久| 亚洲超碰精品一区二区| 国产精品视频看| 56国语精品自产拍在线观看| 免费欧美在线| 极品裸体白嫩激情啪啪国产精品| 国产真实乱子伦精品视频| 亚洲国产一区二区三区青草影视| 国产午夜一区二区三区| 欧美日韩午夜在线| 久久av在线| 激情综合自拍| 91美女在线视频| 国产乱码字幕精品高清av| 午夜婷婷国产麻豆精品| 成人免费小视频| 久久综合999| 制服视频三区第一页精品| 久久五月天婷婷| 亚洲国产精品综合| 欧美国产专区| 成人在线视频一区| 精品一区二区三区欧美| 日韩高清在线观看| 亚洲一区二区在线观看视频| 中文字幕在线免费不卡| wwwwxxxxx欧美| 日韩三级在线免费观看| 欧美影视一区二区三区| 久久久精品动漫| 在线综合视频| 精品动漫3d一区二区三区免费版| 成人avav影音| 国产一区二区精品久久| 日本va欧美va精品| 亚洲一区二区美女| 亚洲色欲色欲www| 中文字幕av在线一区二区三区| 久久无码av三级| 欧美电影免费观看高清完整版在线观看| 在线看国产日韩| 一本色道a无线码一区v| 国产农村妇女毛片精品久久莱园子| 激情综合自拍| 一区在线免费| 黄色精品网站| 国产一区再线| 激情亚洲网站| 国产精品xnxxcom| 欧美色综合网| 国产综合欧美| 好吊色欧美一区二区三区视频| 欧美日韩在线一二三| 欧美午夜精品| 亚洲承认在线| 伊人精品在线| 一本色道久久综合亚洲精品婷婷| 亚洲精品在线免费| 国产精品欧美日韩一区| 亚洲尤物在线| 一本一道久久a久久精品综合蜜臀| 久久国产88| 老妇喷水一区二区三区| 色视频一区二区| 欧美伊人久久大香线蕉综合69| 欧美亚洲国产bt| 欧美视频一区在线| 欧美二区在线观看| 91精品久久久久久久久99蜜臂| 91精品综合久久久久久| 日韩女优毛片在线| 久久久久久亚洲综合影院红桃| 国产日韩欧美麻豆| 成人欧美一区二区三区白人| 亚洲毛片av在线| 亚洲电影一级黄| 美女视频黄久久| 成人综合在线视频| 欧美精品不卡| 亚洲精品美女久久7777777|