如何使用py2exe更正TCL_LIBRARY和TK_LIBRARY

xda*_*dan 3 python tcl py2exe

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

from distutils.core import setup
import py2exe
setup(windows=["slideshow.py"])
Run Code Online (Sandbox Code Playgroud)

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

当我运行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
Run Code Online (Sandbox Code Playgroud)

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\
Run Code Online (Sandbox Code Playgroud)

然后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]"
Run Code Online (Sandbox Code Playgroud)

我在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"或"library"

xda*_*dan 6

Tcl版本8.5.11和8.5.2冲突解决了用python安装路径手动替换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
Run Code Online (Sandbox Code Playgroud)

这有效,有什么更好的想法吗?