gpt4 book ai didi

c++ - 如何在同一个程序中同时使用 C++/TCL 和 C++/TK?

转载 作者:行者123 更新时间:2023-11-30 04:33:41 25 4
gpt4 key购买 nike

所以它很棒 C++/TCL通过 API 为我们提供易于管理的 TCL C++ 函数和类:

#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 创建,另一个非常适合 GUI 渲染。

我想找到一种方法来混合它们,例如让这样的代码工作:

#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?

更新:

所以我们做到了。需要一些 CPP/TCL 和 CPP/Tk 源代码修复,请参阅 our svn , 和 my answer for example of use .

最佳答案

您可以使用 UI 回调来做复杂的事情,包括运行其他 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 事件循环支持的其他回调,包括计时器和文件 I/O。

关于c++ - 如何在同一个程序中同时使用 C++/TCL 和 C++/TK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com