Python TkInter:Tkinter.Tcl()。eval()_ tkinter.TclError:命令名称无效"退出"

时间:2017-02-02 14:04:56

标签: python python-2.7 tkinter tcl

我有一个tcl包需要在退出时进行一些清理。为此我在包安装脚本中添加了命令:

trace add execution exit enter CustomCleanUp

CustomCleanUp的位置:

proc CustomCleanUp {args} {
     puts "Clean-up!"
}

当使用tclsh中的包或通过tclsh(或者愿望)运行的脚本时,一切都按预期工作。

但是当从python到Tkinter使用它时我得到这个错误: _tkinter.TclError:命令名称无效"退出"

要轻松复制它,请运行以下代码:

try:
    from Tkinter import Tcl
except ImportError:
    from tkinter import Tcl

tcl_interpreter = Tcl()
tcl_code1 = '''

proc CustomCleanUp {args} {
     puts "Clean-up!"
}

trace add execution exit enter CustomCleanUp
'''

tcl_interpreter.eval(tcl_code1)

对于解决方法,我可以这样做:

if {[info commands exit] != ""} {
    trace add execution exit enter CustomCleanUp

但是这意味着当从Tkinter使用包时,我的自定义清理工作没有完成,我可以/将泄漏一些资源。

无论如何都要避免错误?或者让tkinter在销毁tcl_interpreter对象时调用我的清理工作?

注意:我只在Centos 7上使用tcl 2.7.5和tkinter-2.7.5-48.el7.x86_64进行了测试

1 个答案:

答案 0 :(得分:0)

似乎Tkinter用自己的特殊版本替换标准Tcl $scope.dateInTimestamp命令,这可能是在您连接了跟踪后发生的,导致呼叫未被跟踪。最好还跟踪删除命令或变量(否则根本不需要使用),为了方便起见,您可能会将命名空间放在命名空间中。

$scope.dateForUI

将跟踪回调附加到exit是完全合理的。但是,我不知道是否会在适当的时刻为您调用变量未设置跟踪或命令删除跟踪;在删除解释器上下文期间,清理会发生在非常重要的时间,因此您运行代码的能力可能会受到相当大的限制。我知道子命名空间在其父级之前被删除,这就是为什么我建议您使用一个用于删除检测器。