Python TkInter:TkInter.Tcl().eval()_TkInter.TclError:命令名无效;退出“;
我有一个tcl包,需要在退出时进行一些清理。为此,我在软件包安装脚本中添加了以下命令: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
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似乎用自己的特殊版本替换了标准的Tclexit
命令,这可能是在您连接跟踪之后发生的,导致无法跟踪调用。还可以更好地跟踪命令或变量的删除(否则根本不需要使用该命令或变量),为了方便起见,可以将其放在命名空间中
namespace eval ::deletion {
variable detector {}
}
trace add variable ::deletion::detector unset ::CustomCleanUp
proc CustomCleanUp {args} {
puts "Clean-up!"
}
将跟踪回调附加到
exit
也是完全合理的。然而,我不知道变量unset trace或命令delete trace是否会在合适的时候被调用;在删除解释器上下文的过程中,清理会在一个非常重要的时间发生,所以您运行代码的能力可能会受到很大的限制。我确实知道子名称空间在其父名称空间之前被删除,因此我建议您使用一个名称空间作为删除检测器。是否有原因使用跟踪,而不是在窗口被破坏时挂钩?是否有原因使用跟踪,而不是在窗口被破坏时挂钩?