Python GUI编程之tkinter入门案例--简单的自动文件下载器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN_wujian/article/details/82928339

利用Python3.6开发了一个简易版的文件批量下载软件demo,使用的GUI工具是tkinter。默认打开桌面的文件夹,可以实现自动读取文本文件中的文件超链接,实现自动下载到桌面。

最近在整理自己磁盘文件时,发现很多下载的文件,如果只保留一个下载的超链接,这样就可以把超链接放在一个txt文本文件中,需要用到的时候,如果有一个软件能自动读取,自动下载其中的链接文件,想想多方便,减少了磁盘的存储空间。
下面是简单的界面:
在这里插入图片描述
代码如下:

# encoding:utf-8
import os
from tkinter import *
from tkinter import filedialog
import urllib.request


class FileDownload:
    def __init__(self, master):
        self.filename=StringVar()
        self.filename.set('选择要打开的文件信息')
        self.src_dir=''
        self.urls=[]
        # tkinter刚开始不熟悉,布局麻烦,这里使用的网格布局,row,column 的index,定位cell
        open_btn=Button(master, text="打开文件",width=15,height=3,borderwidth=2,
                                  command=self.openfile)
        download_btn=Button(master, text="开始下载",width=15,height=3,borderwidth=2,
                                  command=self.download)
        open_btn.grid(row=0,column=0,ipadx=5,ipady=3,padx=10,pady=3)
        download_btn.grid(row=1,column=0,ipadx=5,ipady=3,padx=10,pady=3)
        self.file_label=Label(master,textvariable=self.filename,wraplength=250,fg='green',bg='white',)
        self.file_label.grid(row=0,column=1,rowspan=2,ipadx=200,ipady=15,padx=10,pady=2)#,padx=20,pady=10,
        self.text=Text(master,width=100,height=50,bg='grey',fg='blue')
        self.text.grid(row=2,columnspan=2,ipadx=10,ipady=10)

    def openfile(self):
        # 系统默认打开用户的桌面文件
        default_dir=os.path.join(os.path.expanduser("~"), 'Desktop')
        fname = filedialog.askopenfilename(title='选择打开的文件', filetypes=[('txt文本','*.txt'), ('All Files', '*')],
                                    initialdir=(os.path.expanduser(default_dir)))
        print('打开的文件',fname)
        self.src_dir=fname[0:fname.rindex('/')]
        self.filename.set(fname)
        self.urls=self.read_urls(fname)

    # 读取urls
    def read_urls(self,fname):
        urls=[]
        with open(fname) as f:
            urls=f.readlines()
        urls=[url.replace('\n','') for url in urls]
        for i in urls:
            print(i)
        return urls

    def print_schedule(self,a,b,c):
        '''
        打印进度条信息
        a:已经下载的数据块
        b:数据块的大小
        c:远程文件的大小
        '''
        per = 100.0 * a * b / c
        if per > 100 :
            per = 100
        print('下载进度%.1f%%' % per)

    def download(self):
        i=1
        urls_nums=len(self.urls)
        for url in self.urls:
            print('正在下载:%s'%url)
            # 在界面上显示下载的日志信息
            self.text.insert(END,'正在下载%d/%d:%s\n'%(i,urls_nums,url))
            self.text.see(END)
            self.text.update()# 这个很关键,更新页面text信息
            filename = url.split('/')[-1]
            # 文件明太长,或者含有'=,%,&'这些非法字符windows无法识别,会报错,
            # 这里简单的截取了url的后20个字符作为名字
            if len(filename)>20:
                filename=filename[-20:]
            local = os.path.join(self.src_dir,filename)
            urllib.request.urlretrieve(url,local,self.print_schedule)
            i+=1
        self.text.insert(END,'下载结束')
        self.text.see(END)
        self.text.update()


if __name__=='__main__':
    tker = Tk()
    tker.title("自动文件下载器")
    tker.columnconfigure(0, weight=3)
    tker.columnconfigure(1, weight=7)
    tker.rowconfigure(0, weight=1)
    tker.rowconfigure(1, weight=1)
    tker.rowconfigure(2, weight=8)
    tker.geometry('640x480') # 设置主窗口的初始大小640x480
    app = FileDownload(tker)
    tker.mainloop()


txt文档如下:
在这里插入图片描述
运行的过程如图所示:
在这里插入图片描述
有兴趣的可以不断地完善下去,做成一个下载器
写好代码以后,在用pyinstaller将代码打包成一个exe文件(简单的软件随处可以使用的)
Python3.6打包py文件成exe文件的方式如下:

  • 首先安装pyinstaller这个插件: pip install pyinstaller
  • 在cmd命令行中将当前工作目录切换至要打包的py文件的目录下:例如你的py文件存放在桌面的test文件夹中:cd desktop/test
  • 使用pyinstaller的命令开始打包,–icon用于指定可执行文件的图标,和py文件存放在同一个文件夹下,-F表示只生成一个exe文件,-w表示不使用windows的控制台,直接打开就是GUI界面
pyinstaller --icon=my.ico -F -w download.py

如果不需要指定icon图标,可以如下这样:

pyinstaller  -F -w download.py

在这里插入图片描述
最后成功生成了一个与py文件同名的exe文件,该exe可执行文件存放在与py文件同级的dist文件夹中。
这样就可以把exe可执行程序放在任意地方运行ok,大功告成!!!

猜你喜欢

转载自blog.csdn.net/CSDN_wujian/article/details/82928339