我用 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”或“库”