如何创建一个自毁的子窗口来监控活动?

时间:2013-06-24 11:29:17

标签: python-2.7 tkinter

作为this question的后续,我想知道Python / Tkinter中是否有一种方法可以创建子窗口,让它显示30-60秒进程的文本进度更新,然后在自动时自行销毁该过程完成。有问题的过程涉及多个步骤,如文件复制,数据库更新等。

链接到问题的代码示例显示了我用来创建自定义对话框窗口的方法,该窗口收集用户输入,然后在单击“确定/取消”按钮后关闭。我发现使用相同的方法对我想要创建的状态更新子项不起作用。如果我把所有代码放在showWin方法中,我就会遇到竞争条件,在这种情况下,窗口会在显示之前尝试自我毁灭(即使我使用update_idletasks)。但是,如果我尝试将文件/数据库代码移动到单独的方法,则没有事件可以触发它,因此处理永远不会发生。

我是否只是为了这个目的而放弃使用子窗口?或者是否有一些安排可以在避免竞争条件的同时进行处理?

1 个答案:

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