【问题标题】:C++/TCL how to invoke tk?C++/TCL如何调用tk?
【发布时间】:2011-07-06 01:50:29
【问题描述】:

所以我想在我的程序中执行 TCL 代码。我希望它能够访问我的一些 C++ 函数和类。所以我使用C++/TCL。所有通用的 TCL 到 C++ 绑定对我来说都很好。但是现在我想在顶部有一些小 UI(所以我有很多与我的应用程序交互的通用 TCL 代码,现在我想向它添加 Tk gui。)如何在窗口内创建带有一些名称的简单 tk 按钮我想使用 C++/TCL?我根本不想使用 C++/TK。

更新 我尝试了什么:

将所有 Tk (.tcl) 文件放入 ../../tk 文件夹并尝试此操作...失败

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

int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        "set auto_path [linsert $auto_path 0 [file join [file dirname [info script]] ../../tk]]\n"
        "package require Tk 8.5\n";
    Tcl::interpreter tcl_interpreter;
    tcl_interpreter.eval(script);
    return 0;
}

我也尝试过类似的东西

#include <string>
#include "cpptcl.h"
int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        "foreach tkFile [glob -nocomplain -directory ../../tk *] {\n"
        "    source $tkFile\n"
        "}\n"
        "package require Tk 8.5\n";
    Tcl::interpreter tcl_interpreter;
    tcl_interpreter.eval(script);
    return 0;
}

这也失败了。

我还尝试将 tk85.dll 放在我的应用附近并调用

#include <string>
#include "cpptcl.h"
int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        "load tk85.dll \n";
    Tcl::interpreter tcl_interpreter;
    tcl_interpreter.eval(script);
    return 0;
}

还有这个

#include <string>
#include "cpptcl.h"
int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        "interp create slave \n"
        "load {} Tk slave \n"
    ;
    Tcl::interpreter tcl_interpreter;
    tcl_interpreter.eval(script);
    return 0;
}

here 所述。这也失败了。

这个

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

int main(int argc, char *argv[])
{
    std::string script = 
        "package require Tcl 8.5\n"
        " interp create a\n"
        " a eval {set argv {-display :0}; package require Tk; button \".b\" -text \"Say Hello\"; pack \".b\" -padx 20 -pady 6;}\n"
        ;
    Tcl::interpreter tcl_interpreter;
    tcl_interpreter.eval(script);
    std::cin.get();
    return 0;
}

编译并运行,但不显示 ani 窗口或其他东西。(

怎么办? Tk怎么加载?

【问题讨论】:

  • 出了什么问题?你得到一个错误? UI出现然后程序立即退出?没有 UI,程序就退出了?
  • cpptcl.cc 的第 895 行出现了一些可怕的错误
  • 无 UI,程序退出。
  • 您永远不会处理来自 X 服务器的数据,因此无法绘制 GUI。您需要使用 Tcl 的事件循环,这就是 Tk 与 X 服务器交互的方式。

标签: c++ user-interface tcl


【解决方案1】:

你还没有说什么失败了,但这行不通。要拥有 GUI,您需要一个事件循环。

我推荐一种不同的方法:将你的 C++ 代码变成一个 Tcl 可加载模块,然后你的脚本可以在 wish 下运行,并使用 Tk 和你用 C++ 实现的对象。

【讨论】:

  • 无法解释 wh 但遗憾的是,这对我来说不是一个选择...它来自 C++\TCL?
  • @Kabumbus:至少您展示的代码没有使用 Tcl 主循环。如果没有那个主循环(在加载时被 Tk 覆盖),UI 元素将不会出现。见tmml.sourceforge.net/doc/tcl/Tcl_Main.html
  • @Kamumbus:如果您安装了正确配置的 Tcl/Tk 8.5,则动态加载将起作用(但不一定适用于 8.4;获得支持是 8.5 的功能)。但是您仍然必须通过执行直接或间接调用Tcl_DoOneEvent 的操作来运行事件循环。 (只有 tclsh 和 wish 可以在不明确执行的情况下逃脱,那是因为他们在后台有一些额外的特殊魔法技巧。)如果一切都失败了,使用 Tcl 命令运行事件循环vwait foreverforever 只是一个任意变量名。
  • 旁注:如果您能提供帮助,请不要在同一个程序中运行两次vwait。重新进入事件循环可能会导致许多微妙的问题。