如何在Python中的函数中嵌入Tkinter进度条

时间:2014-07-15 04:05:49

标签: python tkinter progress-bar

我想通过一个简单的例子来理解如何在一个函数(例如:foo)中嵌入一个Tkinter的progessbar。我写了这段代码,其中第一个按钮是一个不确定的progessbar,第二个是确定的progessbar,第三个按钮是我尝试插入progessbar的函数。我尝试使用错误消息在self.pbar_ind.step(1)

中插入self.update()foo
**res = foo(self, 5)
NameError: global name 'foo' is not defined**

from Tkinter import *
import ttk
import tkFileDialog
import time

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_ind = Button(self, text='Start indeterminate', command=self.start_ind, activeforeground="red")
        self.start_ind.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.start_det = Button(self, text='Start determinate', command=self.start_det, activeforeground="red")
        self.start_det.grid(row=2, 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=3, column=0, pady=2, padx=2, sticky=E+W+N+S)

        self.inside_f = Button(self, text='Start function', command=self.start_fun, activeforeground="red")
        self.inside_f.grid(row=4, column=0, pady=2, padx=2, sticky=E+W+N+S)

        self.pbar_f = ttk.Progressbar(self, orient="horizontal", length=300, mode="determinate")
        self.pbar_f.grid(row=5, column=0, pady=2, padx=2, sticky=E+W+N+S)

    def foo(self, m):
        for i in xrange(m):
            i * 2
            self.pbar_det.step(1)
            self.update()
            time.sleep(0.1)
        return i


    def start_ind(self):
        for i in xrange(500):
            self.pbar_ind.step(1)
            self.update()
            # Busy-wait
            time.sleep(0.1)

    def start_det(self):
        for i in xrange(500):
            self.pbar_det.step(1)
            self.update()
            # Busy-wait
            time.sleep(0.1)

    def start_fun(self):
        res = foo(500)


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

1 个答案:

答案 0 :(得分:1)

你可以做两件事

1)将foo()添加到课程中:

def start_fun(self):
    res = self.foo(500) # use self.

def foo(self, m):
    for i in xrange(m):
        i * 2
        self.pbar_det.step(1)
        self.update()
        time.sleep(0.1)
    return i

2)将self发送到外部foo()

def foo(m, self_from_class):
    for i in xrange(m):
        i * 2
        self_from_class.pbar_det.step(1)
        self_from_class.update()
        time.sleep(0.1)
    return i

class MainWindow(Frame):

    # ...

    def start_fun(self):
        res = foo(500, self)

顺便说一句:

没有课程的一切

from Tkinter import *
import time

def foo(m):
    for i in xrange(m):
        i * 2
        pbar_f.step(1)
        master.update()
        time.sleep(0.1)
    return i

def start_ind():
    for i in xrange(500):
        pbar_ind.step(1)
        master.update()
        # Busy-wait
        time.sleep(0.1)

def start_det():
    for i in xrange(500):
        pbar_det.step(1)
        master.update()
        # Busy-wait
        time.sleep(0.1)

def start_fun(self):
    res = foo(500)
    print 'res:', res

master = Tk()

master.title("ProgressBar example")
master.minsize(200, 100)
#grid(sticky=E+W+N+S)

#top = winfo_toplevel()
master.rowconfigure(0, weight=1)
master.columnconfigure(0, weight=1)

start_ind = Button(master, text='Start indeterminate', command=start_ind, activeforeground="red")
start_ind.grid(row=0, column=0, pady=2, padx=2, sticky=E+W+N+S)

pbar_ind = ttk.Progressbar(master, orient="horizontal", length=300, mode="indeterminate")
pbar_ind.grid(row=1, column=0, pady=2, padx=2, sticky=E+W+N+S)

start_det = Button(master, text='Start determinate', command=start_det, activeforeground="red")
start_det.grid(row=2, column=0, pady=2, padx=2, sticky=E+W+N+S)

pbar_det = ttk.Progressbar(master, orient="horizontal", length=300, mode="determinate")
pbar_det.grid(row=3, column=0, pady=2, padx=2, sticky=E+W+N+S)

inside_f = Button(master, text='Start function', command=start_fun, activeforeground="red")
inside_f.grid(row=4, column=0, pady=2, padx=2, sticky=E+W+N+S)

pbar_f = ttk.Progressbar(master, orient="horizontal", length=300, mode="determinate")
pbar_f.grid(row=5, column=0, pady=2, padx=2, sticky=E+W+N+S)

master.mainloop()