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



我希望了解如何在函数(例如:foo)中嵌入Tkinter的进度条。我写了这个代码,其中第一个按钮是一个不确定的进度条,第二个是一个确定的进度条,第三个按钮是我试图插入进度条的功能。我尝试用错误消息插入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)添加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)

顺便说一句:

所有没有class的

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()

相关内容

  • 没有找到相关文章