window 关闭时未调用 TCL 析构函数

TCL Destructor is not called on window close

我有一个 class DataDialog,其中包含一个像

这样的析构函数
destructor {
    puts "DataDialog has been destructed"
    #further code
}

如果我通过 X-window 按钮关闭应用程序,则不会调用此析构函数。如果我关闭它超过 file->close 它被调用。

在顶层我有以下

wm protocol . WM_DELETE_WINDOW { 
    Exit 0
} 

如何更改此行为以调用所有析构函数(或至少是我的 class DataDialog 之一)?

怎么样

wm protocol . WM_DELETE_WINDOW { 
    DataDialog destroy
    Exit 0
}

如果您调用 exit(或者如果您删除解释器),那么 Tcl 不保证 调用析构函数。那是因为拆除内存中的所有内容的代价可能非常高。关键资源通常在 C 级别注册了额外的退出处理程序,以确保它们得到正确清理,但它们非常例外;您唯一可能经常使用的是通道(在退出时刷新)。没有任何 Tcl-level 可以这样做;这些处理程序通常在调用 Tcl 命令不再安全的地方被调用。

但是,处理合作 window 闭包的默认行为实际上是向 window 发送 <Destroy> 消息。这些不是完全可拦截的(window 消失)但您可以 bind 找到它们以了解它们何时发生。不过要注意一个怪癖:顶层 windows 也会监听他们 children 的所有事件(尽管他们不会因为传递 <Destroy> 而被杀死,除非他们被直接发送给他们).在采取特殊行动之前,检查 %W 实际上指的是您认为自己真正在听的 window。