我希望了解如何在函数(例如: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()