3

我用 Tkinter 小部件制作了一个 slideshow.py 文件来显示一些照片校正,它在我的 windows 和 linux 上完美运行。为了让它在没有安装 python 和 tcl 的 windows 上运行,我使用 py2exe 将其编译成 win32 可执行文件 setup.py 很简单:

from distutils.core import setup
import py2exe
setup(windows=["slideshow.py"])

然后我运行“python setup.py py2exe”,它会在 c:\Users\d2xia\ccm_wa\utils\tfps\ 中生成一个“dist”文件夹,以及“tcl”、“library.zip”、“slideshow.exe”和等下它。

当我运行 slideshow.exe 时出现错误:

Traceback (most recent call last):
  File "slideshow.py", line 45, in <module>
  File "Tkinter.pyc", line 1685, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories: 
    C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/lib/tcl8.5 C:/Users/d2xia/ccm_wa/utils/tfps/library C:/Users/d2xia/ccm_wa/utils/library C:/Users/d2xia/ccm_wa/utils/tcl8.5.11/library C:/Users/d2xia/ccm_wa/tcl8.5.11/library

tcl8.5 和 tk8.5 实际上位于“tcl”文件夹下,但 py2exe 生成的 exe 似乎仍然在“lib”或“library”下,似乎它没有设置正确的 TCL_LIBRARY 和 TK_LIBRARY。

即使我将“tcl”重命名为“lib”,它仍然会出现相同的错误。

set TCL_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tcl8.5\
set TK_LIBRARY=c:\Users\d2xia\ccm_wa\utils\tfps\dist\tcl\tk8.5\

然后 slideshow.exe 生成一些新的错误:

c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl: version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
version conflict for package "Tcl": have 8.5.11, need exactly 8.5.2
    while executing
"package require -exact Tcl 8.5.2"
    (file "c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl" line 20)
    invoked from within
"source c:/Users/d2xia/ccm_wa/utils/tfps/dist/tcl/tcl8.5/init.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 [list source $tclfile]"

我在 C:\apps\git\lib\tcl8.5 中有 Tcl 8.5.11,在 C:\Python27\tcl\tcl8.5 中有 Tcl 8.5.2 似乎当我使用 python 运行时,它会在 python 安装中查找 tcl路径,但 py2exe 在 git 安装路径中看起来是不同的副本。

那么问题就变成了: 1.如何在创建 dist 时将正确的 tcl8.5 副本“分配”给 py2exe?2.如何让生成的可执行文件知道dist中的tcl路径?“tcl”而不是“lib”或“库”

4

2 回答 2

6

Tcl 8.5.11 & 8.5.2 版本冲突通过手动替换 tcl8.5, tk8.5, tcl85.dll 和 tk85.dll 解决,我相信也可以通过更改路径环境变量来解决. 但是我还是要手动设置TCL_LIBRARY和TK_LIBRARY,我做了一个windows批处理包装器test.bat:

set TCL_LIBRARY=.\tcl\tcl8.5\
set TK_LIBRARY=.\tcl\tk8.5\
slideshow.exe %1

这行得通,有更好的主意吗?

于 2012-09-26T15:11:07.383 回答
2

正确的 Tcl 和 Tk 安装将在构建期间将这些环境变量的正确值放入其中;它们只存在于允许在安装之前进行测试(对 Tcl/Tk 的开发人员非常有用,最好避免对其他人)。如果它们没有正确连接,或者找到错误版本的脚本库,则说明您的安装存在严重问题。(请注意,这确实意味着您通常不应该在安装后移动东西,但这对大多数人来说并不是什么大问题。)

在这种情况下,通常的建议是擦除 Tcl 和 Tk 安装并重新开始,确保configure通过--prefix选项指定正确的安装位置。我不知道将 Python 添加到混合中会如何影响事情。

于 2012-09-27T10:07:50.563 回答