python3 进度条_下载Python 3的进度条

有一个urlretrieve()可以将url下载到文件中,并允许指定reporthook回调来报告progess:

#!/usr/bin/env python3

import sys

from urllib.request import urlretrieve

def reporthook(blocknum, blocksize, totalsize):

readsofar = blocknum * blocksize

if totalsize > 0:

percent = readsofar * 1e2 / totalsize

s = "%5.1f%% %*d / %d" % (

percent, len(str(totalsize)), readsofar, totalsize)

sys.stderr.write(s)

if readsofar >= totalsize: # near the end

sys.stderr.write("

")

else: # total size is unknown

sys.stderr.write("read %d

" % (readsofar,))

urlretrieve(url, 'downloaded_file.py', reporthook)

这是一个GUI进度条:

import sys

from threading import Event, Thread

from tkinter import Tk, ttk

from urllib.request import urlretrieve

def download(url, filename):

root = progressbar = quit_id = None

ready = Event()

def reporthook(blocknum, blocksize, totalsize):

nonlocal quit_id

if blocknum == 0: # started downloading

def guiloop():

nonlocal root, progressbar

root = Tk()

root.withdraw() # hide

progressbar = ttk.Progressbar(root, length=400)

progressbar.grid()

# show progress bar if the download takes more than .5 seconds

root.after(500, root.deiconify)

ready.set() # gui is ready

root.mainloop()

Thread(target=guiloop).start()

ready.wait(1) # wait until gui is ready

percent = blocknum * blocksize * 1e2 / totalsize # assume totalsize > 0

if quit_id is None:

root.title('%%%.0f %s' % (percent, filename,))

progressbar['value'] = percent # report progress

if percent >= 100: # finishing download

quit_id = root.after(0, root.destroy) # close GUI

return urlretrieve(url, filename, reporthook)

download(url, 'downloaded_file.py')

在Python 3.3上,urlretrieve()具有不同的reporthook接口(see issue 16409).要解决此问题,您可以通过FancyURLopener访问以前的界面:

from urllib.request import FancyURLopener

urlretrieve = FancyURLopener().retrieve

要更新同一线程中的进度条,您可以内联urlretrieve()代码:

from tkinter import Tk, ttk

from urllib.request import urlopen

def download2(url, filename):

response = urlopen(url)

totalsize = int(response.headers['Content-Length']) # assume correct header

outputfile = open(filename, 'wb')

def download_chunk(readsofar=0, chunksize=1 << 13):

# report progress

percent = readsofar * 1e2 / totalsize # assume totalsize > 0

root.title('%%%.0f %s' % (percent, filename,))

progressbar['value'] = percent

# download chunk

data = response.read(chunksize)

if not data: # finished downloading

outputfile.close()

root.destroy() # close GUI

else:

outputfile.write(data) # save to filename

# schedule to download the next chunk

root.after(0, download_chunk, readsofar + len(data), chunksize)

# setup GUI to show progress

root = Tk()

root.withdraw() # hide

progressbar = ttk.Progressbar(root, length=400)

progressbar.grid()

# show progress bar if the download takes more than .5 seconds

root.after(500, root.deiconify)

root.after(0, download_chunk)

root.mainloop()

download2(url, 'downloaded_file.py')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值