尝试从使用tkx(Tcl / tk)的Perl脚本创建独立应用程序

时间:2009-08-16 19:08:39

标签: perl par tkx

以下是我的规格: OS X Tiger Perl 5.8 使用捆绑了ActiveTcl v8.5的Tkx

我已经使用PAR / pp成功创建了具有上述配置的独立应用程序,但这不是一个完全令人满意的解决方案:

  • 仍然需要安装Tcl / Tk
  • 在带有默认菜单的Tcl / Tk窗口中打开
  • 每次运行应用程序时都会打开终端

我可以采取另一种可以绕过这些问题的途径吗?

2 个答案:

答案 0 :(得分:5)

如果你正在使用ActivePerl,它应该与Tcl和Tk的共享对象捆绑在一起。这些文件是Tcl.so和tkkit.so(Windows上的Tcl.dll和tkkit.dll)。您需要配置pp以使用-l选项将它们与自包含的可执行文件捆绑在一起。例如(在Windows上):

-l C:/Perl/lib/auto/Tcl/tkkit.dll
-l C:/Perl/lib/auto/Tcl/Tcl.dll

不幸的是,PAR不会在正确的位置解压缩共享对象,以便Tkx应用程序找到它们。您可以在加载Tkx之前设置$ENV{PERL_TCL_DL_PATH}来解决此问题。要创建一个可以使用或不使用PAR的应用程序,请使用BEGIN块来检测它在PAR下运行的时间:

use strict;
use warnings;
use File::Spec::Functions;

BEGIN {
    if (exists $ENV{PAR_PROGNAME}) {
        use Config ();
        $ENV{PERL_TCL_DL_PATH} = catfile(
            $ENV{PAR_TEMP},
            'tkkit.' . $Config::Config{dlext},
        );
    }
}

use Tkx;
# remainder of script...

pp有一个-g(或--gui)选项来构建没有控制台窗口的应用程序,但它只能在Windows上运行。我不知道是否有办法在OS X上隐藏控制台。

至于Tcl / Tk窗口中的应用程序打开以及默认菜单,我不知道。我怀疑那是因为您使用的是ActiveTcl安装而不是与ActivePerl捆绑在一起的共享对象。

答案 1 :(得分:1)

ActiveState Perl开发工具包具有将Tkx脚本绑定为适当的OS X应用程序的额外知识。您可以在http://www.activestate.com/perl-dev-kit尝试一下。

控制台弹出与Tk中的启发式方法有关,它们试图确定您是否以交互方式运行(并且在您的情况下显然是错误的)。您始终可以通过以下方式禁止显示:

Tkx::catch("console hide");

在OS X上我还建议:

Tkx::set("::tk::mac::useThemedToplevel" => 1);