如何在ttk中创建下载进度栏?
我想在使用该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()
但是它一直循环播放。
-
对于确定模式,您不想调用
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示例很有用。