C ++ / Tk如何执行通用的tcl代码?

时间:2011-06-30 21:16:41

标签: c++ user-interface tcl execution tk

所以我们有类似的代码:

#include "cpptk.h"
#include <stdio.h>

using namespace Tk;

void hello() {
     puts("Hello C++/Tk!");
}

int main(int, char *argv[])
{
    static char* str = "button .a -text "Say Hello ppure TCL"\n"
                   "pack .a\n";
     init(argv[0]);

     button(".b") -text("Say Hello") -command(hello);
     pack(".b") -padx(20) -pady(6);

     runEventLoop();
}

想象str是复杂的tcl代码。我们想将它作为字符串提供给C ++ / Tk。此外,我们希望它与我们在C ++ / Tk代码运行中创建的gui相同的TCL vm我们的通用C ++ / Tk程序。因此,此代码的结果将是窗口内的2个按钮。 怎么做这个?

怎么做这样的事情?

1 个答案:

答案 0 :(得分:2)

您是否可以访问C ++ / Tk中使用的Tcl_Interp*句柄?如果是这样(假设在这里你已经在一个名为interp的变量中得到它),请使用:

int resultCode = Tcl_Eval(interp, str);

接下来,检查resultCode以查看它是TCL_OK还是TCL_ERROR(其他值可能,但在普通脚本中不常见)。这告诉你对“结果”的解释,你得到这样的结论:

const char *result = Tcl_GetString(Tcl_GetObjResult(interp));

如果结果代码显示错误,result现在是错误消息。如果没问题,result是脚本的输出(注意:不是写入标准的内容)。这取决于你如何处理它。


[编辑]:我更详细地查看了这一点。它比它看起来更糟糕,因为C ++ / Tk隐藏了Tcl本身很深的东西。就我所知,你这样做(未经测试!):

#include "cpptk.h" // might need "base/cpptkbase.h" instead
#include <string>

// This next part is in a function or method...
std::string script("the script to evaluate goes here");
std::string result = Tk::details::Expr(script,true);