在 TCL/TK 小部件销毁后删除绑定

In TCL/TK Remove binding after widget destruction

我有一个 canvas 位于我的主应用程序的子 window 中:

.dsm.nb.mdlbuild.canvas

另外,我有以下(几个之一)过程帮助我让用户在 canvas 上移动东西:

proc grab { xx yy } {

    global currentx currenty
    set currentx $xx
    set currenty $yy
}

我使用这个绑定:

.dsm.nb.mdlbuild.canvas bind $tagtomove  <Button-1>      {grab  %x %y }

问题:

当用户关闭 window (.dsm) 时,canvas 被破坏,但绑定似乎 'survive'。

当用户随后点击某处时出现错误:

wrong args: should be "grab xx yy"

这是因为 xx 和 yy 是空的,我想是因为 canvas 和父项一起消失了 window...

我试图在 .dsm window 被销毁后将绑定设置为空:

.dsm.nb.mdlbuild.canvas bind $tagtomove  <Button-1>      { }

并使用 "break" 命令,但没有成功。

.dsm.nb.mdlbuild.canvas bind $tagtomove  <Button-1>      break

如何在关闭 canvas 所在的 window (.dsm) 后删除绑定,以便此错误消失?

问题很可能是您为您的过程使用了标准 Tk 命令的名称。 grab 命令从 Tk 库中的不同位置调用,但并不总是与您的 proc 的参数数量相匹配。这会导致错误。您可以在收到错误消息后通过转储 $errorInfo 的值来检查这一点。

因此,只需将您的 proc 重命名为 grab(或任何其他内置命令)以外的名称。