Using the same progress in tkinter for multiple calculations in Python

I want to know how best to use the same progress (definite and indefinite). In this example, the same progress bar is used for indefinite, for deterministic and indefinite calculation of functions. When I run the code, only the last progress indicator is displayed.

from Tkinter import * import ttk import tkFileDialog import time def foo(m, n, self_from_class): for i in xrange(m): i * n self_from_class.pbar_f.step(1) self_from_class.update() time.sleep(0.1) return i class MainWindow(Frame): def __init__(self): Frame.__init__(self) self.master.title("ProgressBar example") self.master.minsize(200, 100) self.grid(sticky=E+W+N+S) top = self.winfo_toplevel() top.rowconfigure(0, weight=1) top.columnconfigure(0, weight=1) self.start = Button(self, text='Start', command=self.start, activeforeground="red") self.start.grid(row=0, column=0, pady=2, padx=2, sticky=E+W+N+S) self.pbar_ind = ttk.Progressbar(self, orient="horizontal", length=300, mode="indeterminate") self.pbar_ind.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) self.pbar_det = ttk.Progressbar(self, orient="horizontal", length=300, mode="determinate") self.pbar_det.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) self.pbar_f = ttk.Progressbar(self, orient="horizontal", length=300, mode="indeterminate") self.pbar_f.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) def start(self): for i in xrange(10): self.pbar_ind.step(1) self.update() # Busy-wait time.sleep(0.1) for i in xrange(10): self.pbar_ind.step(1) self.update() # Busy-wait time.sleep(0.1) res = foo(10, 2, self) if __name__=="__main__": d = MainWindow() d.mainloop() 

UPDATE is my elegant solution:

 class MainWindow(Frame): def __init__(self): Frame.__init__(self) self.master.title("ProgressBar example") self.master.minsize(200, 100) self.grid(sticky=E+W+N+S) top = self.winfo_toplevel() top.rowconfigure(0, weight=1) top.columnconfigure(0, weight=1) self.start = Button(self, text='Start', command=self.start, activeforeground="red") self.start.grid(row=0, column=0, pady=2, padx=2, sticky=E+W+N+S) self.pbar_f = ttk.Progressbar(self, orient="horizontal", length=300, mode="indeterminate") self.pbar_det = ttk.Progressbar(self, orient="horizontal", length=300, mode="determinate") self.pbar_ind = ttk.Progressbar(self, orient="horizontal", length=300, mode="indeterminate") self.pbar_ind.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) def start(self): for i in xrange(10): self.pbar_ind.step(1) self.update() # Busy-wait time.sleep(0.1) self.pbar_ind.grid_forget() self.pbar_det.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) for i in xrange(10): self.pbar_det.step(1) self.update() # Busy-wait time.sleep(0.1) self.pbar_det.grid_forget() self.pbar_f.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S) res = foo(10, 2, self) 
0
source share
1 answer

If you put all the widgets in one cell - they have the same column and row - then you put them one on top of the other. The latter is on top, and you see it.

You can use only one Progressbar widget for all calculations.

You can have multiple Progressbar and use grid/grid_forget to show them and hide others.

You can put the Progressbar in different cells and everything on the screen.


EDIT:

grid_forget example

 from Tkinter import * #----------------------------------- def on_press(): global visible if visible == 1: l1.grid_forget() l3.grid(row=0,column=3) visible = 3 else: l1.grid(row=0,column=0) l3.grid_forget() visible = 1 #----------------------------------- master = Tk() l1 = Button(master, text='press there >>') l1.grid(row=0,column=0) l2 = Button(master, text='change', command=on_press) l2.grid(row=0,column=1) l3 = Button(master, text='<< press there') #l3.grid(row=0,column=3) visible = 1 master.mainloop() 
+1
source

All Articles