Development environment:
Windows 7 64-bit, Python 3.6.2
Implementation features:
progress bar, download speed and download progress display, breakpoint continuation (pause resume download function), cancel the download and other functions
Download interface,
Click on ' New Task ' to pop up the window to enter the download link.
Click ' Start download ' to automatically get the download file name and select a storage path:
Key code:
Because the breakpoint continues to be appended in the previous file, so open (filename, ' ab ')
The mode to open the file here is AB
The code to implement the breakpoint continuation is as follows:
headers={‘Range‘: ‘bytes=%d-‘ %os.path.getsize(filename) }r = requests.get(self.url,stream=True,headers=headers)with open(filename, ‘ab‘) as code: for chunk in r.iter_content(chunk_size=1024): #边下载边存硬盘 if chunk : code.write(chunk)
The code that displays the progress bar (the download progress is displayed by changing the value of the Self.value, which is a range of 0-100):
from tkinter import ttkself.value=IntVar()pb=ttk.Progressbar(self.fm4,length=200,variable=self.value)pb.grid(row=0,column=1)
Attach the key code for the downloaded file:
Import osimport requestsimport timeimport reimport urllibclass Getfile (): #下载文件 def __init__ (self,url): Self.ur L=url self.flag=true #当self. Flag=false, pause or cancel the download, that is, end the download thread Self.header_flag=false #当为True时, set the header, resume the breakpoint Self.re=requests.head (url,allow_redirects=true,timeout=20) #运行head方法时重定向 def getsize (self): try: Self.file_total=int (self.re.headers[' content-length ')) #获取下载文件大小 return self.file_total except: return 0 def getfilename (self): #获取默认下载文件名 if ' content-disposition ' in Self.re.headers:n=sel F.re.headers.get (' Content-disposition '). Split (' name= ') [1] filename=urllib.parse.unquote (n,encoding= ' UTF8 ') Else:filename=os.path.basename (Self.re.url.split ('? ') [0]) if filename== ': Filename= ' index.html ' return filename def downfile (self,filename): #下载文 Piece self.headers={} self.mode= ' WB ' If Os.path.exists (filenAME) and self.header_flag:self.headers={' Range ': ' bytes=%d-'%os.path.getsize (filename)} Self.mode = ' ab ' SELF.R = Requests.get (self.url,stream=true,headers=self.headers) with open (filename, self.mode) as Cod E:for Chunk in Self.r.iter_content (chunk_size=1024): #边下载边存硬盘 if Chunk and Self.flag: Code.write (Chunk) Else:break Time.sleep (1) def cancel (self,filename ): #取消下载 self.flag=false time.sleep (1) if os.path.isfile (filename): os.remove (filename)
There's a bit more code to implement the interface, and it's not given here. All the source code has been uploaded to http://down.51cto.com/data/2445977, there is a need to download.
Thinking and summarizing
Cancel the download there spent a lot of time, has been tangled in how to force quit the download file thread, and finally found not forced to quit, directly in the download file function to increase the SELF.FLAG flag bit, when false can cause the thread to exit.
This small project also learned a lot of multithreading knowledge.
Python implementation Download interface (with progress bar, breakpoint resume, multi-threaded multi-task download, etc.)