【问题标题】:Download progress bar not working, Python 3下载进度条不起作用,Python 3
【发布时间】:2017-06-23 12:26:13
【问题描述】:

我正在尝试制作一个 GUI,用户单击一个按钮,应用程序从互联网下载一个文件。我想要一个进度条显示文件下载完成的时间。为了实现这一点,我实现了一个线程来在单击下载按钮时运行进度条的功能。这是我正在使用的代码:

def progthread():
    threading.Thread(target=download).start()

def download():
    blocknum = 0
    blocksize = 0
    url = "https://www.python.org/static/img/python-logo.png"
    filename = "C:\My Python Apps\MyFile.png"
    response = requests.get(url, stream=True)
    total_length = response.headers.get('content-length')

    with open(filename, "wb") as f:
        for data in response.iter_content(chunk_size=10000):
            f.write(data)
            percent = int(blocknum * blocksize / int(total_length))

            progress['value'] = percent 

当我运行应用程序时,它会下载文件并且不会出现错误。但是进度条没有做任何事情。我尝试使用progress.update()progress.update_idletask(),但进度条仍然无法正常工作。

如何让进度条显示文件的下载进度?

【问题讨论】:

  • 你没有在循环中给blocknum和blocksize赋值,所以它们总是停留在0。

标签: multithreading python-3.x tkinter progress-bar download


【解决方案1】:

问题是你的循环阻塞了 tkinter 的主循环,所以整个 GUI 被锁定了。对于这样的事情,您应该在单独的线程中启动下载循环,以便它可以与 tkinter 主循环同时运行。您可以使用 tkinter IntVar 从另一个线程更新进度条。

如果您使用Minimal, Complete, and Verifiable example 更新您的问题,那么我可以帮助您实施。

【讨论】:

  • 我不知道如何使它比这更小。我尝试并使用的此代码的另一个版本使用 urllib 包,但我知道很多网站在使用时会触发 403 错误,所以我在问题中提供的示例是我已经适应不使用 @987654323 @。但是如何将下载循环放在单独的线程中?
  • 好的,我想出了如何进行线程化并更新了我的问题,但问题仍然存在。老实说,我不知道如何使我的示例比这更小,但我现在只是在想,我认为下载时获取块大小可能是个问题,因为在我的 urllib 代码中它得到了那个值并返回它,但是在使用 requests 包时我无法以相同的方式实现它。
  • 我不希望你只把它最小化,但 make 也是完整且可验证的。阅读链接。这在在线寻求帮助时很常见。制作一个我可以运行的完整程序,包括导入,这样我就可以告诉你问题出在哪里。当然我可以自己做;但我有比编写样板代码更好的事情要做。
  • 我有点让它工作,但它给了我一个完全不同的问题,我今天将在一个单独的问题中发布。但是您使用线程的建议确实有所帮助,并且至少让进度条至少可以做一些事情:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2018-01-08
  • 2013-03-16
  • 2016-01-03
  • 1970-01-01
相关资源
最近更新 更多