Tcl 如何将TkCon(或其他Tk控制台)嵌入为小部件?

Tcl 如何将TkCon(或其他Tk控制台)嵌入为小部件?,tcl,tk,Tcl,Tk,我想制作一个Tcl/Tk应用程序,它主要是一个传统的菜单和按钮直接操作工具,其中大多数交互都是通过一个用Tcl/Tk实现的图形界面进行的 但是,对于某些高级用途(和调试),我希望在主窗口中有一个小部件(子窗口),它包含一个Tk控制台,我可以在其中键入命令、查看输出以及控制应用程序 启动TkCon(或wish)并获得一个顶级窗口,然后在一个单独的顶级窗口中创建我的应用程序界面似乎很容易。应用程序将很好地工作,但我希望两个窗口成为同一布局的一部分,一起移动,支持调整大小,等等 有没有一种简单的方法可

我想制作一个Tcl/Tk应用程序,它主要是一个传统的菜单和按钮直接操作工具,其中大多数交互都是通过一个用Tcl/Tk实现的图形界面进行的

但是,对于某些高级用途(和调试),我希望在主窗口中有一个小部件(子窗口),它包含一个Tk控制台,我可以在其中键入命令、查看输出以及控制应用程序

启动TkCon(或wish)并获得一个顶级窗口,然后在一个单独的顶级窗口中创建我的应用程序界面似乎很容易。应用程序将很好地工作,但我希望两个窗口成为同一布局的一部分,一起移动,支持调整大小,等等

有没有一种简单的方法可以让TkCon做到这一点

我还希望TkCon窗口能够显示从我的应用程序中弹出的消息(例如,调试输出)。一些消息将由Tcl代码生成;其他人则使用构成我应用程序一部分的C代码。我不需要捕获stdout本身——我愿意调用一个特殊用途的函数来传递消息——但目前还不清楚让它们这样显示的最有效的方法是什么。

阅读《我只看到了让它作为自己的顶级窗口正式工作的方法》。(特别是,
tkcon new
不接受任何参数…)因此,我们讨论的是一个黑客程序,以获得您想要的

如果您有Tk 8.6,但不在OSX上(或者正在使用基于X11的平台构建),您可以将顶层变形为框架,并以这种方式嵌入,但我不知道在这种情况下对小部件名称缺乏控制是否会造成伤害

否则,如果您有可用的,我相信它有能力重新租用小部件。我从来没有尝试过这么做,所以这是道听途说,但它可能能够把一个顶级的另一个小部件内


如果变得更粗糙,可以编辑tkcon源代码,以便将选项指定给它创建的顶级。这会让你把它放在另一个小部件中(一个打开选项的框架;你也必须用它把东西拼凑起来),但同样,它有点复杂,我不知道在你的平台上这样做会产生什么后果。这应该适用于旧版本的TK(它是TCL/TK浏览器插件如何运作的基础)。TKCON的

特别地看到了多纳尔的答案。不过,我要补充的是,您可以嵌入在Windows上使用的Tk内置控制台。此脚本在非Windows上可用,例如可以嵌入到选项卡式笔记本页面中。


有关此示例,请参见-该文件加载Tk console.tcl文件,底部的::tkchat::EmbeddedConsoleDemo函数显示了如何使用此函数。

以下代码适用于我:

set f [labelframe $p.console -text "Interactive:"]
frame $f.test -container 1
namespace eval ::tkcon {
    set OPT(exec) {}
    set PRIV(root) .tkcon
    set embed_args {}
}
option add *tkcon.Use [winfo id $f.test] interactive
package require tkcon
tkcon::Init

此代码通过“X11选项”将选项添加到tkcon顶级:tkcon::嵌入参数也很重要。

另一个选择是构建自己的参数。做一个简单的控制台并不难(但一个功能齐全的控制台需要做更多的工作;细节才是关键)。