我有一个tcl包,需要在退出时进行一些清理。为此,我在包设置脚本中添加了以下命令:
trace add execution exit enter CustomCleanUp
其中CustomCleanUp是:
^{2}$当使用来自tclsh的包或通过tclsh(或wish)运行的脚本时,一切正常。在
但是当从python通过Tkinter使用它时,我得到一个错误: _tkinter.tc错误:无效的命令名“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使用包时,我的自定义清理没有完成,我可以/将泄漏一些资源。在
有没有办法避免这个错误?或者在tcl_解释器对象被破坏时让tkinter调用my clean up?
注意:我只在Centos 7上使用tcl 2.7.5和tkinter-2.7.5-48.el7.x86_64进行了测试
Tkinter似乎用它自己的特殊版本替换了标准的Tcl
exit
命令,这可能是在连接跟踪之后发生的,从而导致无法跟踪调用。最好也跟踪命令或变量的删除(否则根本不需要使用),为了额外的方便,可以将它们放在命名空间中。在也将跟踪回调附加到
exit
是完全合理的。但是,我不知道是否会在适当的时候调用变量unset trace或命令delete trace;在删除解释器上下文的过程中,清理发生在非常重要的时间,因此您运行代码的能力可能会受到很大的限制。我知道子名称空间在父名称空间之前被删除,所以我建议您使用一个名称空间作为删除检测器。在相关问题 更多 >
编程相关推荐