Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

tkinter progressbar - linked to function?

I'm having some trouble understanding the Progressbar widget in tkinter (python 2.7) I went here and here but I still don't understand how to link the Progressbar itself (in "determinate" mode) to my functions.

Does anyone have any examples on how to link the completion of functions to the progress-bar updating? I did research this, I just can't find any helpful information. A note on my (already working) code - a .txt file is created as the code runs that prints the total number of functions and the current function that is being run. I would like to link the progressbar with the information in these .txt files.

Edit

More specifically, how do I get value to change to be the correct number?

like image 532
Isa Avatar asked Dec 25 '22 06:12

Isa


1 Answers

Working example - you can see current value and max value in both types progressbars.

--

You can use self.var_ind.set() or self.var_det.set() in your function (inside class MainWindow) to update progressbar.

--

If your function is outside class you have to call it with self.var_ind or self.var_det as argument.

 your_function(self.var_det)

and inside function use it

 def your_function(progress):
     progress.set(10) # set new value
     progress.set( progress.get() + 23 ) # add 23 to current value

I use var_ind.set() and self.var_det.set() in BEGIN, SET 23, END to set new value.

--

If you have to set max in progressbar you will need add self.pbar_ind or self.pbar_det as argument too.

 your_function(self.var_det, self.pbar_det)

and inside function use it

 def your_function(progress, bar):

     bar.config(maximum=200) # set max to 200

     bar.step() # add 1 to current value
     bar.step(23) # add 23 to current value

     progress.set(10) # set new value
     progress.set( progress.get() + 23 ) # add 23 to current value

EDIT: new example with more buttons:

from Tkinter import *
import ttk

class MainWindow(Frame):

    def __init__(self):
        Frame.__init__(self)
        self.master.title("ProgressBar example")
        #self.master.minsize(400, 100)
        self.grid(sticky=E+W+N+S)

        #-----

        self.var_ind = IntVar(self)

        self.pbar_ind = ttk.Progressbar(self, orient="horizontal", length=400, mode="indeterminate", variable=self.var_ind, maximum=100)
        self.pbar_ind.grid(row=0, column=0, pady=2, padx=2, sticky=E+W+N+S, columnspan=3)

        Label(self, text="indeterminate").grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S)

        self.lab_ind_var = Label(self, text="VAR:")
        self.lab_ind_var.grid(row=1, column=1, pady=2, padx=2, sticky=E+W+N+S)

        self.lab_ind_max = Label(self, text="MAX:")
        self.lab_ind_max.grid(row=1, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        self.var_det = IntVar(self)

        self.pbar_det = ttk.Progressbar(self, orient="horizontal", length=400, mode="determinate", variable=self.var_det, maximum=100)
        self.pbar_det.grid(row=2, column=0, pady=2, padx=2, sticky=E+W+N+S, columnspan=3)

        Label(self, text="determinate").grid(row=3, column=0, pady=2, padx=2, sticky=E+W+N+S)

        self.lab_det_var = Label(self, text="VAR:")
        self.lab_det_var.grid(row=3, column=1, pady=2, padx=2, sticky=E+W+N+S)

        self.lab_det_max = Label(self, text="MAX:")
        self.lab_det_max.grid(row=3, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="ANIMATION:").grid(row=4, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='START', command=self.animation_start).grid(row=4, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='STOP', command=self.animation_stop).grid(row=4, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="SET:").grid(row=5, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='BEGIN', command=self.set_begin).grid(row=5, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='END', command=self.set_end).grid(row=5, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="SET:").grid(row=6, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='23', command=lambda:self.set(23)).grid(row=6, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='77', command=lambda:self.set(77)).grid(row=6, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="SET:").grid(row=7, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='+23', command=lambda:self.set_plus(23)).grid(row=7, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='-77', command=lambda:self.set_plus(-77)).grid(row=7, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="STEP:").grid(row=8, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='+1', command=lambda:self.step(1)).grid(row=8, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='-10', command=lambda:self.step(-10)).grid(row=8, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        Label(self, text="MAX:").grid(row=9, column=0, pady=2, padx=2, sticky=E+W+N+S)

        Button(self, text='100', command=lambda:self.max(100)).grid(row=9, column=1, pady=2, padx=2, sticky=E+W+N+S)
        Button(self, text='200', command=lambda:self.max(200)).grid(row=9, column=2, pady=2, padx=2, sticky=E+W+N+S)

        #-----

        self.update_labels_after = False
        self.update_labels()

    #-----          

    def animation_start(self):
        self.update_labels_after = True

        self.pbar_ind.start() # .start(1)
        self.pbar_det.start() # .start(1)

        self.update_labels()

    def animation_stop(self):
        self.update_labels_after = False

        self.pbar_ind.stop()
        self.pbar_det.stop()

        self.update_labels()

    #-----          

    def set_begin(self):
        self.var_ind.set( 0 )
        self.var_det.set( 0 )

        self.update_labels()

    def set_end(self):
        self.var_ind.set( self.pbar_ind.cget('maximum') )
        self.var_det.set( self.pbar_det.cget('maximum') )

        self.update_labels()

    #-----          

    def set(self, val):
        self.var_ind.set( val )
        self.var_det.set( val )

        self.update_labels()

    #-----          

    def set_plus(self, val):
        self.var_ind.set( self.var_ind.get() + val )
        self.var_det.set( self.var_det.get() + val )

        self.update_labels()

    #-----          

    def step(self, val=1):
        self.pbar_ind.step(val) # .step()
        self.pbar_det.step(val) # .step()

        self.update_labels()

    #-----          

    def max(self, val=1):
        self.pbar_ind.config(maximum=val)
        self.pbar_det.config(maximum=val)

        self.update_labels()

    #-----          

    def update_labels(self):

        self.lab_ind_var.config(text='VAR: %d' % (self.var_ind.get()))
        self.lab_ind_max.config(text='MAX: %d' % (self.pbar_ind.cget('maximum')))

        self.lab_det_var.config(text='VAR: %d' % (self.var_det.get()))
        self.lab_det_max.config(text='MAX: %d' % (self.pbar_det.cget('maximum')))

        if self.update_labels_after:
            self.after(50, self.update_labels)

if __name__=="__main__":
   MainWindow().mainloop()

(To create example I used part of code from Gianni Spear question Using the same progressbar in tkinter for several computation in Python)

enter image description here

like image 76
furas Avatar answered Feb 02 '23 01:02

furas