1. 程式人生 > >Python GUI程式設計之tkinter入門案例--簡單的自動檔案下載器

Python GUI程式設計之tkinter入門案例--簡單的自動檔案下載器

利用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()


執行的過程如圖所示: 在這裡插入圖片描述 有興趣的可以不斷地完善下去,做成一個下載器 寫好程式碼以後,在用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,大功告成!!!