以下是我的规格: OS X Tiger Perl 5.8 使用捆绑了ActiveTcl v8.5的Tkx
我已经使用PAR / pp成功创建了具有上述配置的独立应用程序,但这不是一个完全令人满意的解决方案:
我可以采取另一种可以绕过这些问题的途径吗?
答案 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);