问题
I wish to know how is the best method to use the same progressbar (determinate and indeterminate). In this example the same progressbar is used for a indeterminate, for a determinate, and function-indeterminate computation. When i run the code only the last progressbar is showed.
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 - my not elegant solution is:
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)
回答1:
If you put all widgets in one cell
- they have the same column
and row
- then you put them one over another. Last one is on the top and you see it.
You can use only one Progressbar
widget - for all computation.
You can have few Progressbar
s and use grid/grid_forget
to show one and hide anothers.
You can put Progressbar
s in different cells and have all on the screen.
EDIT:
example with grid_forget
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()
来源:https://stackoverflow.com/questions/24764575/using-the-same-progressbar-in-tkinter-for-several-computation