Python TkInter:Tkinter.Tcl公司().评估()_tkinter.tc错误:命令名“exit”无效

2024-09-19 23:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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进行了测试


Tags: from命令脚本addtkinter错误exittrace
1条回答
网友
1楼 · 发布于 2024-09-19 23:30:16

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;在删除解释器上下文的过程中,清理发生在非常重要的时间,因此您运行代码的能力可能会受到很大的限制。我知道子名称空间在父名称空间之前被删除,所以我建议您使用一个名称空间作为删除检测器。在

相关问题 更多 >