所以我们有这样的代码:
#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 程序和我们在 C++/Tk 代码中创建的 gui 运行时在同一个 TCL vm 中执行它。所以这段代码的结果将是一个窗口内的 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);
关于C++/Tk如何执行一般的tcl代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6541194/