用户界面-C++/Tk如何执行通用tcl代码

user interface - C++/Tk how to exequte general tcl code?

本文关键字:执行 代码 tcl -C++ Tk 何执行 用户界面      更新时间:2023-10-16

所以我们有这样的代码:

#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 .an";
     init(argv[0]);
     button(".b") -text("Say Hello") -command(hello);
     pack(".b") -padx(20) -pady(6);
     runEventLoop();
}

假设str是复杂的tcl代码。我们想把它作为一个字符串提供给C++/Tk。此外,我们希望在我们在C++/Tk代码中创建的带有gui的通用C++/Tk程序的同一个TCL vm中执行它。因此,这个代码的结果将是一个窗口中的两个按钮。怎么做这样的事?

怎么做这样的事?

您有权访问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);