【问题标题】:tcl tk rerun application without restarting interpretertcl tk 重新运行应用程序而不重新启动解释器
【发布时间】:2012-05-21 18:36:14
【问题描述】:

我是 tcl/tk 的新手,需要在 cadence 的遭遇中运行一个脚本。为此,我在提供的解释器中获取我的文件并调用我的函数。在第一次运行时,它工作正常。但是,一旦我关闭使用 Tk 创建的主窗口并尝试重新运行我的方法,它就会告诉我它无法调用 wm 命令,因为应用程序已被破坏。如何在不重新启动 tcl 解释器的情况下重新运行脚本?

【问题讨论】:

    标签: tkinter tcl tk


    【解决方案1】:

    关闭主窗口是问题所在,它将 Tk 置于不可恢复状态,只能退出。

    尝试绑定到 WM_DELETE 消息,然后隐藏/图标化主窗口 '.'或使用额外的顶层窗口而不是默认的“。”窗口。

    根据您的脚本,您可能需要做更多的事情,因为某些小部件/名称在运行两次时可能已经存在。

    【讨论】:

    • 是否有可能创建一个子解释器并在其中运行?所以我去创建子解释器,运行,删除子?在阅读 Tk 不可恢复后,我希望有这样的解决方案。我需要一些关于这个想法的指导,目前它抱怨(在子解释器中)找不到包 Tk,但父解释器没有抱怨并且运行良好。
    • @ted,是的,你可以创建子 interp。
    • 子解释器可能会有所帮助,但如果主顶层已被破坏,则在其中重新加载 Tk 对您没有帮助。
    • 即使我只使用主要部分作为基础并只加载 TK 并且总是在孩子中?
    • 你可以在父进程中加载​​ Tk 但撤回 . 并且永远不要使用它。那会很好的。请记住让您的实际退出应用程序的逻辑正确。 :-)
    【解决方案2】:

    我曾经使用过类似的东西,暴露在调试菜单中:(警告未测试!)

    proc Restart {} {
       foreach w [winfo children .] {
           destroy $w
       }
       source [info script]
    }
    

    它(希望)销毁所有子小部件,然后通过资源脚本重新创建它们,假设这是当前脚本所做的。

    但这将取决于您如何按照 schlenk 的建议首先构建您的窗户

    【讨论】:

      猜你喜欢
      • 2011-03-08
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2017-12-01
      相关资源
      最近更新 更多