How to create downloading progress bar in ttk? How to create downloading progress bar in ttk? tkinter tkinter

How to create downloading progress bar in ttk?


For determinate mode you do not want to call start. Instead, simply configure the value of the widget or call the step method.

If you know in advance how many bytes you are going to download (and I assume you do since you're using determinate mode), the simplest thing to do is set the maxvalue option to the number you are going to read. Then, each time you read a chunk you configure the value to be the total number of bytes read. The progress bar will then figure out the percentage.

Here's a simulation to give you a rough idea:

import tkinter as tkfrom tkinter import ttkclass 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()

For this to work you're going to need to make sure you don't block the GUI thread. That means either you read in chunks (like in the example) or do the reading in a separate thread. If you use threads you will not be able to directly call the progressbar methods because tkinter is single threaded.

You might find the progressbar example on tkdocs.com to be useful.


I simplified the code for you.

import sysimport ttkfrom Tkinter import *mGui = Tk()mGui.geometry('450x450')mGui.title('Hanix Downloader')mpb = ttk.Progressbar(mGui,orient ="horizontal",length = 200, mode ="determinate")mpb.pack()mpb["maximum"] = 100mpb["value"] = 50mGui.mainloop()

Replace 50 with the percentage of the download.


If you just want a progress bar to show that the program is busy/working just change the mode from determinate to indeterminate

pb = ttk.Progressbar(root,orient ="horizontal",length = 200, mode ="indeterminate")