作为this question的后续,我想知道Python / Tkinter中是否有一种方法可以创建子窗口,让它显示30-60秒进程的文本进度更新,然后在自动时自行销毁该过程完成。有问题的过程涉及多个步骤,如文件复制,数据库更新等。
链接到问题的代码示例显示了我用来创建自定义对话框窗口的方法,该窗口收集用户输入,然后在单击“确定/取消”按钮后关闭。我发现使用相同的方法对我想要创建的状态更新子项不起作用。如果我把所有代码放在showWin
方法中,我就会遇到竞争条件,在这种情况下,窗口会在显示之前尝试自我毁灭(即使我使用update_idletasks
)。但是,如果我尝试将文件/数据库代码移动到单独的方法,则没有事件可以触发它,因此处理永远不会发生。
我是否只是为了这个目的而放弃使用子窗口?或者是否有一些安排可以在避免竞争条件的同时进行处理?
答案 0 :(得分:0)
我不太明白你想要完成什么,但完全基于问题的标题,我猜你想要某种弹出进度窗口,当进度完成时会破坏自己。
这是一个人为的例子,它显示了一个窗口,当进度超过100%时,该窗口会自毁。它不是非常防弹,但它表明可以创建一个自毁的窗口。
import Tkinter as tk
class App(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
go_button = tk.Button(text="Go!", command=self.go)
go_button.pack()
def go(self):
self.dialog = ProgressWindow(self)
self.do_real_work(0)
def do_real_work(self, count):
# simulate doing work; update the status window periodically
self.dialog.set(count)
self.after(500, lambda count=count+10: self.do_real_work(count))
class ProgressWindow(tk.Toplevel):
def __init__(self, *args, **kwargs):
tk.Toplevel.__init__(self, *args, **kwargs)
self.label = tk.Label(self, text="0%")
self.label.pack(side="top", fill="both", expand=True)
self.wm_geometry("200x200")
def set(self, value):
if value > 100:
self.destroy()
else:
self.label.configure(text="%s %%" % value)
if __name__ == "__main__":
root = tk.Tk()
App(root).pack(side="top", fill="both", expand=True)
root.mainloop()