C ++ / Tk, как выполнить общий код Tcl? - PullRequest
1 голос
/ 01 июля 2011

Итак, у нас есть такой код:

#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 в виде строки.Также мы хотим, чтобы это исполнялось в том же TCL vm, что и наша общая программа на C ++ / Tk с графическим интерфейсом, который мы создали в коде C ++ / Tk.Таким образом, результатом этого кода будет 2 кнопки внутри окна.Как это сделать?

Как это сделать?

1 Ответ

2 голосов
/ 01 июля 2011

У вас есть доступ к дескриптору Tcl_Interp*, используемому в C ++ / Tk? Если это так (и при условии, что вы получили его в переменной с именем 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);
...