Как использовать C ++ / TCL и C ++ / TK одновременно, в одной программе? - PullRequest
1 голос
/ 05 июля 2011

Так что это здорово C ++ / TCL , чтобы предоставить нам легко управляемые в TCL C ++ функции и классы через API, такие как:

#include "cpptcl.h"
#include <iostream>
#include <string>
using namespace std;
using namespace Tcl;
void hello()
{
     cout << "Hello C++/Tcl!" << endl;
}
int main()
{
     interpreter i;
     i.def("hello", hello);
     string script = "for {set i 0} {$i != 4} {incr i} { hello }";
     i.eval(script);
}

В то же время это здорово иметьцикл системных событий обрабатывается в C ++ / Tk с API, например,

#include <string>
#include "cpptk.h"

int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        "package require Tk 8.5\n"
        "ttk::button \".b\" -text \"Say Hello\"\n"
        "pack \".b\" -padx 20 -pady 6\n"
        ;
    Tk::details::Expr(script, true);
    Tk::runEventLoop();
}

Так что, как вы можете видеть, один из них отлично подходит для создания API, другой - для визуализации графического интерфейса.

Iхочу найти способ смешать их, чтобы, например, работал такой код:

#include "cpptcl.h"
#include "cpptk.h"
#include <iostream>
#include <string>
using namespace std;
using namespace Tcl;
void hello()
{
     cout << "Hello C++/Tcl!" << endl;
}
int main()
{
     interpreter i;
     i.def("hello", hello);
     string script = 
        "package require Tcl 8.5\n"
        "package require Tk 8.5\n"
        "ttk::button \".b\" -text \"Say Hello\" -command hello \n"
        "pack \".b\" -padx 20 -pady 6\n"
        ;
    Tk::details::Expr(script, true);
    Tk::runEventLoop();
}

Как сделать такую ​​вещь возможной?Как смешать C ++ / TCL и C ++ / Tk?

Updete:

И так мы сделали это.Требуется некоторое исправление кода сорва CPP / TCL и CPP / Tk, см. наш svn и мой ответ для примера использования .

Ответы [ 3 ]

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

Вы можете использовать обратные вызовы пользовательского интерфейса для выполнения сложных задач, включая запуск другого кода Tcl:

#include "cpptcl.h"
#include "cpptk.h"
#include <iostream>
#include <string>
using namespace std;
using namespace Tcl;

class TclHost
{
  interpreter i;
  static TclHost* singleton;

  static void hello()
  {
     cout << "Hello C++/Tcl!" << endl;
  }

  static void runScript()
  {
     singleton->i.def("hello", &TclHost::hello);
     string script = "for {set i 0} {$i != 4} {incr i} { hello }";
     singleton->i.eval(script);
  }

public:
  int main()
  {
     singleton = this;
     i.def("runscript", &TclHost::runScript);
     string script = 
        "package require Tcl 8.5\n"
        "package require Tk 8.5\n"
        "ttk::button \".b\" -text \"Run a script\" -command runscript\n"
        "pack \".b\" -padx 20 -pady 6\n"
        ;
    Tk::details::Expr(script, true);
    Tk::runEventLoop();

    return 0;
  }
};

TclHost* TclHost::singleton;

int main(void)
{
  TclHost().main();
}

Вы также захотите посмотреть другие обратные вызовы, включая таймеры и файловый ввод / вывод, которые поддерживает цикл событий Tcl / Tk.

0 голосов
/ 01 сентября 2015
Tcl::interpreter i(Tk::getInterpreter());

int main(int argc, char *argv[])
{

    i.def("runscript", runScript);
    std::string script = 
        "package require Tcl 8.5\n"
        "package require Tk 8.5\n"
        "ttk::button \".b\" -text \"Say Hello\" -command hello \n"
        "ttk::button \".c\" -text \"Run a script\" -command runscript\n"
        "pack \".b\" -padx 20 -pady 6\n"
        "pack \".c\" -padx 20 -pady 6\n"
        "after 10 vwait qwerasdfzxcv\n"
        ;
    i.eval(script);
    //Tk::runEventLoop(); //<== if you don't want stock here to make mainthread can keep running. you can add tcl script "after 10 vwait qwerasdfzxcv" as above showed.

}

0 голосов
/ 06 июля 2011

Итак мы сделали это ...) вот наш svn с обновленными, работающими C ++ / Tk и C ++ / TCL , исправлены для работы друг с другом, исправлены из-за некоторых ошибок, которые были на официальном sourceforgesite.

А вот пример кода, вдохновленный Беном :

#include "cpptcl/cpptcl.h"
#include "cpptk/cpptk.h"
#include <iostream>
#include <string>
Tcl::interpreter i(Tk::getInterpreter());
void hello()
{
    std::cout << "Hello C++/Tcl!" << std::endl;
}
void runScript()
{
    i.def("hello", hello);
    std::string script = "for {set i 0} {$i != 4} {incr i} { hello }";
    i.eval(script);
}
int main(int argc, char *argv[])
{

    i.def("runscript", runScript);
    std::string script = 
        "package require Tcl 8.5\n"
        "package require Tk 8.5\n"
        "ttk::button \".b\" -text \"Say Hello\" -command hello \n"
        "ttk::button \".c\" -text \"Run a script\" -command runscript\n"
        "pack \".b\" -padx 20 -pady 6\n"
        "pack \".c\" -padx 20 -pady 6\n"
        ;
    i.eval(script);
    Tk::runEventLoop();
}

Удачи в использовании TCL и Tk!)

...