0

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!

jon_groth34
  • 43
  • 1
  • 2
  • 6

1 Answers1

0

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()
Masoud
  • 1,270
  • 7
  • 12