所以我们有类似的代码:
#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个按钮。
怎么做这个?
怎么做这样的事情?
答案 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);