如何在ttk中创建下载进度栏?

发布于 2021-01-29 16:32:15

我想在使用该urllib.urlretrive方法从网上下载文件时显示进度条。

如何使用ttk.Progressbar来执行此任务?

到目前为止,这是我所做的:

from tkinter import ttk
from tkinter import *

root = Tk()

pb = ttk.Progressbar(root, orient="horizontal", length=200, mode="determinate")
pb.pack()
pb.start()

root.mainloop()

但是它一直循环播放。

关注者
0
被浏览
192
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    对于确定模式,您不想调用start。相反,只需配置value小部件的或调用step方法。

    如果您事先知道要下载多少个字节(并且我假设您这样做是因为您正在使用确定模式),那么最简单的事情就是将maxvalue选项设置为要读取的数字。然后,每次读取块时,将设置value为读取的字节总数。然后,进度条将计算出百分比。

    这是一个模拟,可以让您大致了解:

    import tkinter as tk
    from tkinter import ttk
    
    
    class SampleApp(tk.Tk):
    
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            self.button = ttk.Button(text="start", command=self.start)
            self.button.pack()
            self.progress = ttk.Progressbar(self, orient="horizontal",
                                            length=200, mode="determinate")
            self.progress.pack()
    
            self.bytes = 0
            self.maxbytes = 0
    
        def start(self):
            self.progress["value"] = 0
            self.maxbytes = 50000
            self.progress["maximum"] = 50000
            self.read_bytes()
    
        def read_bytes(self):
            '''simulate reading 500 bytes; update progress bar'''
            self.bytes += 500
            self.progress["value"] = self.bytes
            if self.bytes < self.maxbytes:
                # read more bytes after 100 ms
                self.after(100, self.read_bytes)
    
    app = SampleApp()
    app.mainloop()
    

    为此,您需要确保不阻塞GUI线程。这意味着您可以分块读取(如示例中所示)或在单独的线程中进行读取。如果使用线程,则将无法直接调用progressbar方法,因为tkinter是单线程的。

    您可能会在tkdocs.com上发现Progressbar示例很有用。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看