Python Tkinter 报告 Tcl 错误

12

我正在学习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

如果您能指出我在这里缺少的内容,将非常有帮助。


你确定在IDLE中使用的Python版本与命令行中使用的版本相同吗? - Bryan Oakley
@BryanOakley 是的,我正在使用相同的版本。这是相同版本的片段IDLE: Python 2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] on win32Python CmdLine: Python 2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] on win32 - charan
8个回答

18
您只需要将 tcl 文件夹中的两个文件夹复制到 Lib 文件夹中。
这两个文件夹分别为 tcl8.5 和 tk8.5。

2
这个对我解决了问题。在Windows 10上通过PowerShell运行Python 3.6.3,tcl8.6和tk8.6,在尝试运行matplotlib时出现错误。复制文件夹后就可以正常工作了。非常感谢! - pandaseal
1
我也通过将tcl8.6和tk8.6复制到Python 3.8的Lib文件夹中来解决了这个问题。 - Anirudh
非常感谢您的建议!它对我的Python 3.8 miniconda虚拟环境也有所帮助!! - PumpkinQ

15

如果您在Windows上使用Virtualenv,我在这里找到了解决方案:https://github.com/pypa/virtualenv/issues/93

我将C:\Python27\中的"tcl"文件夹复制到新的Virtualenv的根目录中,Tkinter.Tk()可以显示一个新窗口而不会抛出异常。

我在Windows 7上运行Python 2.7.


7
安装Activestate Python和TCL后,我遇到了类似的问题。我在以下页面找到解决方案:ActiveState Python安装问题。解决方法是将C:\Python27\tcl的内容复制到C:\Python27\Lib中。
另一个潜在的解决方案(由用户i-shenl在不同的ActiveState线程中提供)是设置环境变量$TCL_LIBRARY指向tcl库文件夹(在该问题中为"C:/Python27/tcl")。如果您在系统范围内或账户范围内设置了此变量(通过系统属性),它将影响使用TCL库(如果有安装任何程序)。如果您使用Powershell,则可以在您的配置文件中设置此变量,以限制其影响到从shell运行的程序。

将该文件夹的内容复制到另一个位置对我很有帮助。tcl子文件夹中的所有文件/文件夹都以tk或tcl开头,而目标lib子文件夹中没有这样的文件 - 在复制之前我检查了一遍,以防需要撤销操作! - Rich

4

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

我在本地postactivate脚本中添加了tk和tcl库路径。

  1. 进入你的虚拟环境:workon your-env-name
  2. 用你喜欢的编辑器编辑本地postactiave脚本,例如:gedit $VIRTUAL_ENV/bin/postactivate
  3. 找到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

  4. 重新启动你的虚拟环境:deactivateworkon your-env-name

2
如果你在一个类似于python -m venv NAME的虚拟环境中遇到了这种错误(实际上你的系统中已经安装了tcl),那么你需要像之前的Kamil Czerski在virtualenv的帖子中所建议的那样导出路径。
  1. 运行一个python脚本外部的venv来查找你的TK和TCL路径(参考):
import tkinter
root = tkinter.Tk()   
print(root.tk.exprstring('$tcl_library'))   
print(root.tk.exprstring('$tk_library'))
  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
  1. 取消激活(如果已经激活),然后重新启动你的虚拟环境:
deactivate  
source bin/activate
"Tcl missing" 错误应该已经消失了。

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 的位置。请参见 Xenomorph 的建议。


0
你所需要做的就是将 tcl 8.6tcl 8.5tcl 文件复制到 python 中的 Lib 文件夹中。将 Python-tcl-tcl8.5 移动到 Python-Lib 文件夹中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接