Tkinter:在root被破坏之后仍然会调用'after'函数

时间:2014-03-11 14:56:05

标签: python-2.7 tkinter

我是Python的新手,我正在尝试使用Tkinter创建一个餐厅模拟作为我的GUI(因为它很容易)。

我有一个使用名为Tick()的函数的Timer(如下所示:)

def Tick(self,time,type,resto,foodname,Database):
    if self.cookTimer.winfo_exists() is 1:
        .....
        else:
            if self.cookTimer.winfo_exists() is 1:
                self.timeLabel.configure(text="%d" %time)
                self.cookTimer.after(1000, lambda: self.Tick(time,type,resto,foodname,Database))
        self.cook.protocol("WM_DELETE_WINDOW", lambda: self.Callback(self.cook,resto,Database))

我要做的是在退出程序之前,它会首先询问用户是或否。 现在,在Tick()中,根名为self.cookTimer

当用户退出self.cookTimer时,self.timeLabel.configure仍在运行,从而引发configure需要root的错误。

任何人都可以告诉我,如果configure被销毁,该程序如何运行cookTimer,可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

Tkinter after方法返回一个标识符,如果事实证明你不再需要它,可以用来取消预定的呼叫。一个很好的例子是设置超时调用。如果您的代码在超时内完成,则取消超时。在您的示例中,当您设置后续呼叫时,记录结果并使用该结果取消呼叫:

self.after_id = self.cookTimer.after(1000, lambda: ...)
....
self.after_cancel(self.after_id)

您可能想要创建一个清理方法,并让WM_PROTOCOL_DELETE和其他终止调用全部去那里进行清理并退出。