以下是您的代码的有效版本。我不得不解决许多问题,因为从我的回答到有关进度条的其他问题,您没有更改代码中的许多内容。
此处主要问题的答案基本上是,您必须传递实例,并在涉及的各种类实例中需要时记住该实例,以便他们的方法
self在需要时可以通过参数使用它。同样,您试图派生和覆盖
tkSimpleDialog.Dialog基类方法的方法也过于复杂且不正确。
通常是最好的(最简单的)事情做的仅仅是提供自己
validate()和
apply()因为这是它是如何设计的工作方法。如果您还需要自己的
__init__()构造函数,则仅将参数传递给子类的基础方法即可,这一点很重要。如果需要更多功能,通常可以通过其他仅派生类的方法来提供,只有它或您也创建的其他类才知道。
无论如何,这就是我最终得到的结果:
import Tkinter, ttk, tkFileDialog, tkSimpleDialog, time, threadingclass App: def __init__(self, master): self.progress_line(master) def progress_line(self, master): # the value of "maximum" determines how fast progressbar moves self._progressbar = ttk.Progressbar(master, mode='indeterminate', maximum=4) # speed of progressbar self._progressbar.place(anchor='ne', height="20", width="150",x="175", y="30") @property def progressbar(self): return self._progressbar # return value of private memberclass AppMenu(object): def __init__(self, master, progressbar): self.master = master self.menu_bar() self.progressbar = progressbar def menu_bar(self): self.menu_bar = Tkinter.Menu(self.master) self.master.config(menu=self.menu_bar) self.create_menu = Tkinter.Menu(self.menu_bar, tearoff=False) self.create_menu.add_command(label="do", command=self.do) self.menu_bar.add_cascade(label="now", menu=self.create_menu) def do(self): Dialog(self.master, self.progressbar) # display the dialog boxclass Dialog(tkSimpleDialog.Dialog): def __init__(self, parent, progressbar): self.progressbar = progressbar tkSimpleDialog.Dialog.__init__(self, parent, title="Do foo?") def apply(self): self.start_foo_thread() # added dialog methods... def start_foo_thread(self): self.foo_thread = threading.Thread(target=self.foo) self.foo_thread.daemon = True self.progressbar.start() self.foo_thread.start() master.after(20, self.check_foo_thread) def check_foo_thread(self): if self.foo_thread.is_alive(): master.after(20, self.check_foo_thread) else: self.progressbar.stop() def foo(self): # some time-consuming function... time.sleep(3)master = Tkinter.Tk()master.title("Foo runner")app = App(master)appmenu = AppMenu(master, app.progressbar)master.mainloop()
希望这可以帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)