摘要:利用python自身的下载功能结合GUI界面设计的相关知识,可以打造属于自己的清新简明的下载界面。
不得不说python的功能非常强大,可以做爬虫,抓取网页数据,可以做web设计,可以写人工智能……
今天我们就来利用python自身的下载功能结合GUI界面设计的相关知识,可以打造属于自己的清新简明的下载界面,博主自己设计的界面在下方,读者可自行修改GUI界面,GUI界面如下图:
下面开始专属下载器的实现:
1、导入需要用到的python包
import requests from tkinter import * import tkinter as tk import tkinter.messagebox import tkinter.filedialog import time import zipfile import random from fake_useragent import UserAgent from configparser import ConfigParser import threading import win32api import win32con
如果运行程序时出现 "ModuleNotFoundError: No module named " 这样的错误提示,表示表示 named 后面的这个包没安装,请先安装模块。
2、设置复制和粘贴的功能函数:
def get_copy(): win32api.keybd_event(17, 0, 0, 0) #ctrl键位码是17 win32api.keybd_event(67, 0, 0, 0) #c键位码是67 win32api.keybd_event(67, 0, win32con.KEYEVENTF_KEYUP, 0) #释放按键 win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) def get_paste(): win32api.keybd_event(17, 0, 0, 0) #ctrl键位码是17 win32api.keybd_event(86, 0, 0, 0) #v键位码是86 win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0) #释放按键 win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
3、设置下载文件的存放位置
# 选择文件安放的位置 def get_wen(): # 使用文件对话框选择文件 # filedialog.askopenfilenames可以返回多个文件名 data_1 = tkinter.filedialog.askdirectory(title="选择文件路径") data = data_1.replace('/' , r'\\') # print(type(data),data) # exit() entry_2.delete(0, END) entry_2.insert(0, data)
4、编写最重要的下载主函数
# 主函数 def get_zhu(): ua = UserAgent() url = str(entry_1.get()) header = {'User-Agent': ua.random} # print(header , url) # exit() """设置代理IP,如果只是本地测试,可以用你自己电脑的ip,不用设置代理IP""" # target = ConfigParser() # target.read('代理IP.ini', encoding='utf-8') # pwd = target.get('IP', 'ip') # ip_list = eval(pwd) # ip = random.choices(ip_list)[0] """设置IP,百度搜索'IP'显示的IP地址""" ip = {'ip':'自己电脑ip'} # 下载的文件名 filename = url.rpartition('/')[-1] response = requests.get(url, headers=header , proxies= ip , stream=True) if response.status_code == 200: # 文件的总长度 zhong_wen = int(response.headers['content-length']) # 下载文件的长度 data_wen = 0 name = entry_2.get() + r"\\" + filename with open(name, 'ab') as fp: for chunk in response.iter_content(chunk_size=512): # 下载中的文件 data_wen += len(chunk) # 将下载文件占下载总文件以百分比的形式显示 now_pross = (data_wen / zhong_wen) * 420 # print(now_pross) # 用进度条来显示下载进度 fill_line = canvas.create_rectangle(1, 1.5, 0, 23, width=0, fill="green") canvas.coords(fill_line, (0, 0, now_pross, 60)) window.update() fp.write(chunk) lable1_4 = Label(window, text="100%", font=('微软雅黑', 15), fg='black', bg="green") lable1_4.place(x=300, y=160) time.sleep(1) tkinter.messagebox.showinfo(title='操作结果', message='文件下载完成') else: print("1") def thread_it(func): '''将函数打包进线程''' # 创建 t = threading.Thread(target=func) # 守护 !!! t.setDaemon(True) # 启动 t.start() # 阻塞--卡死界面! # t.join()
5、设计python的GUI界面
# 布置界面 window = Tk() window.title("博主的下载软件") window.geometry("600x265+490+250") window.config(bg="#FAFAFA") # 设置窗口是否可以变化长宽,默认可变 window.resizable(width=False, height=False) lable1_1 = Label(window, text='下载文件: ', font=('微软雅黑', 20), fg='blue', bg="#FAFAFA") lable1_1.place(x=20, y=20) lable1_2 = Label(window, text="安装目录:", font=('微软雅黑', 20), fg='blue', bg="#FAFAFA") lable1_2.place(x=20, y=72) # 进度条的实现 lable1_3 = Label(text="下载进度:", font=('微软雅黑', 20), bg="#FAFAFA", fg="blue") lable1_3.place(x=20, y=122) canvas = Canvas(window, width=420, height=25, bg="#FFF0F5") canvas.place(x=150, y=130) entry_1 = Entry(window, font=('微软雅黑', 18), width=30, bg='white') entry_1.place(x=150, y=30) entry_2 = Entry(window, font=('微软雅黑', 18), width=30, bg='white') entry_2.place(x=150, y=80) button_1 = Button(window, text="下载", font=("隶书", 20), bg='Snow', activeforeground='gold', activebackground='green', fg="black", command=lambda: thread_it(get_zhu)) button_1.place(x=20, y=200, width=120) button_2 = Button(window, text="退出", font=("隶书", 20), bg='Snow', activeforeground='gold', activebackground='green', fg="black", command=window.quit) button_2.place(x=450, y=200, width=120) button_3 = Button(window, text="...", font=("隶书", 15), bg='Snow', activeforeground='gold', activebackground='green', fg="black", command=get_wen) button_3.place(x=535, y=80, width=40) button_4 = Button(window, text="复制", font=("隶书", 20), bg='Snow', activeforeground='gold', activebackground='green', fg="black", command= get_copy) button_4.place(x=165, y=200, width=120) button_5 = Button(window, text="粘贴", font=("隶书", 20), bg='Snow', activeforeground='gold', activebackground='green', fg="black", command= get_paste) button_5.place(x=310, y=200, width=120) window.mainloop()
自己的专属下载器设计完成。
可以把上面的所有代码都放在一个py文件里面,也可以每一段代码用一个py文件保存,然后在保存GUI界面代码的py文件里导入其他几个py文件。
程序的运行,在命令行用python解释器执行GUI界面python文件,或者所有代码放在一起的py文件,我这是所有代码都放在一个py文件里面,文件名为down.py,保存在桌面
python C:\Users\ASUS\Desktop\down.py