【问题标题】:Tkinter module compilation error - 2.5.2 neededTkinter 模块编译错误 - 需要 2.5.2
【发布时间】:2014-07-22 07:04:39
【问题描述】:

我有一个相当长的程序,我一直在尝试编译。 py2exe和cx_Freeze我都试过了,好像都出现了这个问题。

我使用以下 setup.py 文件来编译我的程序:

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

executables = [
    Executable('version_3_2.py', base=base)
]

setup(name='version_3_2',
      version='0.32',
      description='desc',
      executables=executables
      )

从运行这个使用

python setup.py build

可执行文件已创建。

通过运行可执行文件,我得到了一个回溯说明

TclError: Can't find a usable init.tcl in the following directories:
C:/Python27/build/lib/tcl8.5
and a bunch of other directories

通过将所有 tkinter 和 tcl 文件和文件夹添加到其中几个目录中,我得到了执行的下一个回溯:

C:/Python27/build/lib/tcl8.5/init.tcl: version conflict for package "Tcl":
have 8.5.15, need exactly 8.5.2
version conflict for package "Tcl": have 8.5.15, need exactly 8.5.2
  while executing
"package require -exact Tcl 8.5.2"
  (file "C:/Python27/build/lib/tcl8.5/init.tcl" line 20)
  invoked from within
"source C:/Python27/build/lib/tcl8.5/init.tcl"
  ("uplevel" body line 1)
  invoked from within
"uplevel #0 [list source $tclfile]"

我不完全确定该怎么做。 How to correct TCL_LIBRARY and TK_LIBRARY with py2exePy2exe with Tkinter 等几种解决方案均无效。

有什么想法吗?

【问题讨论】:

    标签: python-2.7 compilation tkinter tcl executable


    【解决方案1】:

    您需要完全匹配 libtcl8.5.dll(或您系统上的任何名称)和init.tcl(和相关文件),因为它们都是同一个 Tcl 安装的一部分。如果你换掉一个,你必须也改变另一个。你到底是如何破坏你的安装我不太确定,但它肯定是。另请注意,在 Tcl 8.5(及之前)中,强烈建议也将 Tk 版本与其精确匹配;我们在 8.6 中放宽了这个要求,但你没有使用那个……

    (请注意,这与 Tcl 中正常依赖项的工作方式不同;通常,程序将依赖于最低 API 版本,而不是确切的版本。)

    由于您使用的是 8.5.15 的二进制版本,因此您也可以使用该版本的脚本文件。我建议从 SourceForge 获取 Tcl source distribution for 8.5.15 并从其中的 library 目录中获取文件。您可能只需要直接在其中的.tcl 文件(尤其是init.tcl,当然!)而不是在任何子目录中,因为子目录是用于官方附加软件包的,并且与Tcl 版本的绑定并不紧密。

    【讨论】:

    • 谢谢,效果很好!将文件移动和更改为应该管理的内容。主要问题是由于某种原因,一半的 tcl 文件丢失了,并且在另一个区域中有一个不必要的 tcl 文件夹。修复了这些并删除了不必要的文件夹,它就像一个魅力。谢谢!