0

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

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

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

4

1 回答 1

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()
于 2013-06-24T14:04:43.090 回答