2

我正在使用 TclApp 将我的程序及其所有文件包装在一个独立的可执行文件中——它对 99% 的文件都运行良好。但是,它似乎没有包装或识别我的 .ico 文件......

我正在用 Tcl/Tk 编写一个程序,我试图在左上角设置主窗口图标,如下所示:

wm iconbitmap .main myIcon.ico
wm iconbitmap .main -default myIcon.ico

包装程序后,如果 .exe 文件与 .ico 文件位于同一目录中,它只会使用图标正确破坏 - 而不是其他任何地方。这与首先​​用 TclApp 包装 Tcl 程序的整个目的背道而驰。应该发生的是TclApp在其虚拟文件系统中将 .ico 文件与 .tcl 文件一起包装,这样无论我的 .exe 文件位于何处,它都应该能够找到图标。

我尝试使用以下方法更明确地指定路径:

set icon_home [file dirname [info script]];    
wm iconbitmap .main [file join $icon_home myIcon.ico]
wm iconbitmap .main -default [file join $icon_home myIcon.ico]

那里没有运气...

我得到的错误是:

Error Code: TK LOOKUP BITMAP myIcon.ico
bitmap "myIcon.ico" not defined
  while executing...

所以我有两个问题:我在互联网上的许多博客和帖子上读到 Tcl/Tk 可能存在某种位图错误,或者某些事情往往会出错 - 没有人详细说明。另一个问题是 TclApp 应该使用 tcl 脚本将图标包装起来,以便从任何地方运行我的程序应该就像它与 .ico 文件在同一目录中一样工作,但它不是......

那么我哪里错了?Tcl 代码是否有问题,Tcl/Tk 中的位图是否真的存在错误,或者 TclApp 是否无法正常工作?

4

1 回答 1

0

我一直在研究这个问题,我学到了一些有价值的东西,基本上回答了我自己的问题:

使用 TclApp,我上面在 Tcl 中发布的代码甚至不是必需的。包装程序会将您的图标放在任何需要的地方,无需手动编码。

然而,TclApp 使用前缀文件来生成您的可执行文件。如果你想制作一个starpack(一个独立的tcl / tk可执行程序),这个文件是必要的。在这个前缀文件中嵌入了许多不同的默认图标大小和.ico文件的颜色深度,(我正在使用base-tk8.6-thread.win32-ix86.exe。)除非所有这些图标格式都被您的自定义图标完全替换,否则它们将在程序完成包装时可见。

问题是我没有确保我的图标文件覆盖了所有必要的大小和颜色深度(256x256 32bpp、128x128 32bpp、64x64 32bpp 等)

编辑:

所以我联系了 ActiveState,我发现了这一点:TclApp 中有一个关于 256 x 256 图标大小的错误。当 Windows Vista 出现时,微软改变了它处理 256 x 256 或更大图标大小的方式;为了压缩,较大的图标开始嵌入 png 文件数据。这很好,但问题是 TclApp 期望自定义图标有一个非常具体的文件大小,如果没有收到,它会完全忽略该大小;这个 png 信息确实改变了图标的文件大小,所以基本上它在 TclApp 中不起作用。他们说这是一个可能仍未修复的错误。

于 2014-06-24T13:27:24.643 回答