Search code examples
pythontkinterttk

How to update the ttk progress bar on tkinter


I've got a program that does some simple webscraping. I'm working on giving it to my coworkers to use, but they are unfamiliar with code so I'd like to make a GUI. I've started using tkinter, and I'm currently working on making a progress bar showing where the program is at (it can take up to a couple hours to run). My problem is that I can't seem to get the progress bar to update, and all the online sources use Tkinter, which is an old version. Here is my code:

I've tried updating progressBar['value'] to whatever number I want, but that hasn't been working.

from tkinter import *
from tkinter import ttk
import time


def clicked(progressBar): # runs a couple functions and updates the progress bar when the button is clicked
    num = 0
    for item in range(5):
        # functions go here
        num += 10
        progressBar['value'] = num
        time.sleep(2)

window = Tk()
window.title("Welcome to my app")
window.geometry('600x400')

progressBar = ttk.Progressbar(window, orient='horizontal', length=300, mode='determinate', maximum=100, value=0)
progressBar.grid(columnspan=3, row=2, sticky=(W, E))

btn = Button(window, text="Click me!", command=clicked(progressBar))
btn.grid(column=1, row=1)

window.mainloop()

The tkinter window doesn't open up until 10 seconds after I run the program, and it has the progress bar already at 50% full. I'd like for the bar to slowly increment up, AFTER the button has been clicked. Any advice would be helpful! Thank you!


Solution

  • There are two problems with the code:

    1. command=clicked(progressBar) indeed calls the function promptly.So simply use command=clicked. There is no need to pass progressBar as the argument since the function gets it from global scope.
    2. while the function clicked() is running, GUI freezes. After 5*2sec, progressBar updates to 5*10 abruptly. To update the widgets in a loop, use update_idletastk method:
    import tkinter as tk
    from tkinter import ttk
    import time
    
    
    def clicked():
        num = 0
        for item in range(5):
            num += 10
            progressBar['value'] = num
            window.update_idletasks()
            time.sleep(2)
    
    window = tk.Tk()
    
    progressBar = ttk.Progressbar(window, orient='horizontal', length=300, mode='determinate', maximum=100, value=0)
    progressBar.grid(columnspan=3, row=2, sticky=(tk.W, tk.E))
    
    btn = tk.Button(window, text="Click me!", command=clicked)
    btn.grid(column=1, row=1)
    
    window.mainloop()