Python 在tkinter中使用相同的progressbar进行多次计算

Python 在tkinter中使用相同的progressbar进行多次计算,python,tkinter,progress-bar,Python,Tkinter,Progress Bar,我想知道如何使用相同的progressbar(确定和不确定)的最佳方法。在本例中,相同的progressbar用于不确定、确定和函数不确定计算。当我运行代码时,只显示最后一个进度条 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

我想知道如何使用相同的progressbar(确定和不确定)的最佳方法。在本例中,相同的progressbar用于不确定、确定和函数不确定计算。当我运行代码时,只显示最后一个进度条

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()
更新-我的非优雅解决方案是:

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)

如果您将所有小部件放在一个
单元格中
——它们具有相同的
——那么您可以将它们一个放在另一个上。最后一个在上面,你看到了

对于所有计算,您只能使用一个
Progressbar
小部件

您可以使用几个
Progressbar
s,并使用
grid/grid\u-forget
显示一个,隐藏另一个

您可以将
Progressbar
s放在不同的单元格中,并在屏幕上显示所有内容


编辑:

带有
网格的示例\u忘记

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()
从Tkinter导入*
#-----------------------------------
def on_press():
全球可见
如果可见==1:
l1.grid_忘记()
l3.网格(行=0,列=3)
可见=3
其他:
l1.网格(行=0,列=0)
l3.网格_忘记()
可见=1
#-----------------------------------
master=Tk()
l1=按钮(主控,text='press there>>')
l1.网格(行=0,列=0)
l2=按钮(主控,文本='change',命令=按下)
l2.网格(行=0,列=1)

l3=按钮(master,text='Hi@furas.您认为创建一个弹出式进度条窗口更好吗?或者我可以用第一个pb更新单元格,在第二个pb之后,最后用最后一个pb更新单元格吗?我只会用一个
progressbar
进行所有计算。
grid\u-forget()
隐藏小部件,但您必须始终使用`grid(…)和以前一样使用参数来再次显示。好吧,我为另一个问题做了示例。也许我可以找到它。请参见答案中的示例。我在回答问题时使用了部分代码:)