C++/Tk如何执行一般的tcl代码?

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

所以我们有这样的代码:

#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_OKTCL_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/

相关文章:

c++ - Qt 初学者的模型/ View 编程是好的起点吗?

ios - 在键盘出现之前获取键盘高度?

user-interface - 从两个不同的菜单中获得相同的功能是个好主意吗?

tcl - 自定义ttk :button

oop - 在 TCL 中列出命名空间中任何类的所有实例

c++ - C++ 库的 Tcl/Tk GUI 界面

c++ - GCC 4.7/4.8 作为 Xcode 的 C/C++ 编译器

c++ - 当我尝试创建对象数组时出错

c++ - 如何测试我的迭代器是否等于一个位置

ios - 在 Xcode 的 View 中加载 View Controller