Если вы заранее знаете, сколько байтов вы собираетесь загрузить (и я предполагаю, что вы это сделаете, поскольку знаете размер файла), самое простое, что нужно сделать, - установить для параметра 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 , который будет полезен.
Кредит этой записи.