Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TkInter:TkInter.Tcl().eval()_TkInter.TclError:命令名无效;退出“;_Python_Python 2.7_Tkinter_Tcl - Fatal编程技术网

Python TkInter:TkInter.Tcl().eval()_TkInter.TclError:命令名无效;退出“;

Python TkInter:TkInter.Tcl().eval()_TkInter.TclError:命令名无效;退出“;,python,python-2.7,tkinter,tcl,Python,Python 2.7,Tkinter,Tcl,我有一个tcl包,需要在退出时进行一些清理。为此,我在软件包安装脚本中添加了以下命令: trace add execution exit enter CustomCleanUp 其中CustomCleanUp是: proc CustomCleanUp {args} { puts "Clean-up!" } 当使用来自tclsh的包或通过tclsh(或wish)运行的脚本时,一切正常 但是当通过Tkinter从python使用它时,我得到了以下错误: \u tkinter.TclEr

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

trace add execution exit enter CustomCleanUp
其中CustomCleanUp是:

proc CustomCleanUp {args} {
     puts "Clean-up!"
}
当使用来自tclsh的包或通过tclsh(或wish)运行的脚本时,一切正常

但是当通过Tkinter从python使用它时,我得到了以下错误: \u tkinter.TclError:无效的命令名“exit”

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

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\u解释器对象被销毁时调用我的清理?


注意:我只在Centos 7上使用tcl 2.7.5和tkinter-2.7.5-48.el7.x86_64进行了测试。tkinter似乎用自己的特殊版本替换了标准tcl
exit
命令,这可能是在连接跟踪后发生的,导致无法跟踪调用。还可以更好地跟踪命令或变量的删除(否则根本不需要使用该命令或变量),为了方便起见,可以将其放在命名空间中

namespace eval ::deletion {
    variable detector {}
}
trace add variable ::deletion::detector unset ::CustomCleanUp
proc CustomCleanUp {args} {
     puts "Clean-up!"
}

将跟踪回调附加到
exit
也是完全合理的。然而,我不知道变量unset trace或命令delete trace是否会在合适的时候被调用;在删除解释器上下文的过程中,清理会在一个非常重要的时间发生,所以您运行代码的能力可能会受到很大的限制。我确实知道子名称空间在其父名称空间之前被删除,因此我建议您使用一个名称空间作为删除检测器。

Tkinter似乎用自己的特殊版本替换了标准的Tcl
exit
命令,这可能是在您连接跟踪之后发生的,导致无法跟踪调用。还可以更好地跟踪命令或变量的删除(否则根本不需要使用该命令或变量),为了方便起见,可以将其放在命名空间中

namespace eval ::deletion {
    variable detector {}
}
trace add variable ::deletion::detector unset ::CustomCleanUp
proc CustomCleanUp {args} {
     puts "Clean-up!"
}

将跟踪回调附加到
exit
也是完全合理的。然而,我不知道变量unset trace或命令delete trace是否会在合适的时候被调用;在删除解释器上下文的过程中,清理会在一个非常重要的时间发生,所以您运行代码的能力可能会受到很大的限制。我确实知道子名称空间在其父名称空间之前被删除,因此我建议您使用一个名称空间作为删除检测器。

是否有原因使用跟踪,而不是在窗口被破坏时挂钩?是否有原因使用跟踪,而不是在窗口被破坏时挂钩?