尝试使用 Tkinter 会抛出 Tcl 错误“找不到可用的 init.tcl”

问题描述 投票:0回答:9

我正在学习 Python 中的基本 GUI,并且我在 Stack Overflow 上遇到了一个从文件资源管理器读取文件名的示例示例。

from Tkinter import Tk
from tkFileDialog import askopenfilename
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

当我尝试在 IDLE 中运行该特定脚本时,它工作正常,但如果我在 Windows 7 中从命令提示符尝试运行,则该脚本无法运行。

Python 版本:2.7。

这是我得到的输出错误:

>>> from Tkinter import Tk
>>> from tkFileDialog import askopenfilename
>>> Tk().withdraw()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1685, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
C:/Python27/lib/tcl8.5 D:/PyProj/lib/tcl8.5 D:/lib/tcl8.5 D:/PyProj/library D:/library D:/tcl8.5.2/library D:/tcl8.5.2/library

This probably means that Tcl wasn't installed properly

我在这里缺少什么?

python python-2.7 tkinter tk-toolkit
9个回答
20
投票

您只需将 tcl 文件夹中的两个文件夹复制到 Lib 文件夹即可

tcl8.5 和 tk8.5


16
投票

如果您在 Windows 上使用虚拟环境,我已经找到了解决方案这里

简而言之:

从 Python 根目录复制

tcl/
文件夹,例如
C:/Python27/
,到虚拟环境的根目录,例如
.venv/

然后

Tkinter.Tk()
显示一个新窗口而不抛出异常。

这是在 Windows 7 上使用 Python 2.7 进行的,但在 2024 年仍然有效。 例如,升级到 Python 3.13 后我遇到了同样的错误。 我所要做的就是修复错误:

cp -r C:/Users/Wok/AppData/Local/Programs/Python/Python313/tcl .venv/
    

7
投票
安装 Activestate Python 和 TCL 后遇到类似问题。我发现以下页面为我解决了问题:

ActiveState Python install Problem。修复方法是将 C:\Python27\tcl

 的内容复制到 
C:\Python27\Lib

另一个潜在的解决方案(由用户 i-shenl 在同一问题的不同

ActiveState 线程中给出)是设置 环境变量 $TCL_LIBRARY

 指向 tcl 库文件夹(“C:/Python27/ tcl”,在问题中)。如果您在系统范围或帐户范围内设置此设置(通过系统属性),它将影响使用 TCL 库的其他程序(如果已安装)。如果您使用 Powershell,则可以在 profile 中设置此变量,以限制其对从 shell 运行的程序的影响。
    


4
投票
我在 Ubuntu 17.04 上使用 64 位 Python 2.7 的 virtualenvwrapper 遇到了同样的问题

我在本地

postactivate脚本中添加了tk和tcl库路径

    转到您的虚拟环境:
  1. workon your-env-name
    
    
  2. 使用您最喜欢的编辑器编辑本地 postactivave 脚本,例如:
  3. gedit $VIRTUAL_ENV/bin/postactivate
    
    
  4. 找到 tk 和 tcl 库路径。在 postactivate 脚本中,使用适当的路径导出 TK_LIBRARY 和 TCL_LIBRARY。将此行添加到您的脚本并修改路径:

    TK_LIBRARY=/home/kamil/anaconda2/pkgs/tk-8.5 TKPATH=/home/kamil/anaconda2/pkgs/tk-8.5 TCL_LIBRARY=/home/kamil/anaconda2/lib/tcl8.5 export TCL_LIBRARY TK_LIBRARY TKPATH

  5. 重新启动您的虚拟环境:再次
  6. deactivate
    workon your-env-name

3
投票
如果您在

python -m venv NAME

 类型的虚拟环境中遇到此类错误(并且您的系统中实际上安装了 tcl),那么您需要按照 Kamil Czerski 在上一篇文章中的 
建议 导出路径虚拟环境。

    要了解您的 TK 和 TCL 路径是什么,请运行 venv 的
  1. outsidesource)的 python 脚本:
import tkinter root = tkinter.Tk() print(root.tk.exprstring('$tcl_library')) print(root.tk.exprstring('$tk_library'))


    打开您的 venv 配置文件
  1. bin/activate
     并找到它们 
    export PATH
     的位置并在此之后插入(插入步骤 1 中的正确路径):
TCL_LIBRARY="/tcl/path/from/step/1" TK_LIBRARY="/tk/path/from/step/1" TKPATH="/tk/path/from/step/1" export TCL_LIBRARY TK_LIBRARY TKPATH


    停用(如果已激活)并再次获取您的 venv:
deactivate source bin/activate


“Tcl 缺失”错误应该消失了。


1
投票
转到存储所有 python 依赖项的目录

示例:

Python37 -DLLs -Doc -etc -include -Lib -libs -Scripts -tcl -python.exe
进入tcl文件夹,复制tcl8.5和tk8.5文件夹
将这些文件夹粘贴到 Lib 文件夹中

此解决方案适用于 Windows 10 用户


0
投票
IDLE可能正在设置TCL所需的路径。要找出 IDLE 使用的路径,请比较 IDLE 和不使用 IDLE 的 sys.path 的输出。然后,您可以使用环境变量或以编程方式添加 init.tcl 的位置。请参阅异形建议。


0
投票
您需要做的就是将

tcl 8.6

tcl 8.5
tcl
 文件复制到 
Lib
 中的 
python
 文件。
Python-tcl-tcl8.5
Python-Lib

    


0
投票
如果您知道已安装 TCL 和 TK,请尝试搜索丢失的文件!例如。在错误消息中,它指出预期路径/位置中缺少

init.tcl

 文件。但该文件可能位于计算机上的其他软件中!如果是这样,请将包含的文件夹复制到预期位置以进行快速修复。

您只需复制两个文件夹即可。

tcl8.5

Python/tcl/TCL8.5
 文件夹 - 到 
Python/Lib/TCL8.5
 文件夹。对 
tk8.5
 执行相同操作,但使用 
Python/TK/tk8.5
 文件夹 - 到 
Python/Lib/TKL8.5
 文件夹。

您的本地路径可能与上面的有点不同。但这是一般想法。

© www.soinside.com 2019 - 2024. All rights reserved.