【问题标题】:Tkinter: 'after" function is still called after root has been destroyedTkinter:在根被销毁后仍然调用'after'函数
【发布时间】:2014-03-11 14:56:04
【问题描述】:

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

我有一个计时器,它使用名为Tick() 的函数(如下所示:)

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 的错误。

如果cookTimer 被破坏,任何人都可以告诉我如何使程序不运行configure 来帮助我吗?

【问题讨论】:

  • 如果您不理解我的问题,请告诉我。当谈到代码时,我是这个提问网站的新手

标签: python-2.7 tkinter


【解决方案1】:

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

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

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

【讨论】:

  • 我为自己的愚蠢道歉,但我想不出如何将您的示例应用到我的代码中。我应该如何处理self.after_id?这只是一个增加的数字,对吧?
  • after 调用返回预定事件的标识符。您所能做的就是将其传递给after_cancel 方法以取消事件。因此,当您处理 WM_DELETE_WINDOW 时,请取消 after 事件以及执行其他回调操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多