无法在MacOS Mojave上通过Homebrew pyenv安装tcl-tk(tkinter)

时间:2019-10-15 18:21:46

标签: python tcl homebrew macos-mojave pyenv

如果我在Homebrew的MacOS Mojave上执行此操作:

Traceback (most recent call last):
  File "/Users/craign/.pyenv/versions/3.7.4/lib/python3.7/runpy.py", line 183, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/Users/craign/.pyenv/versions/3.7.4/lib/python3.7/runpy.py", line 142, in _get_module_details
    return _get_module_details(pkg_main_name, error)
  File "/Users/craign/.pyenv/versions/3.7.4/lib/python3.7/runpy.py", line 109, in _get_module_details
    __import__(pkg_name)
  File "/Users/craign/.pyenv/versions/3.7.4/lib/python3.7/tkinter/__init__.py", line 36, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

我得到:

{{1}}

我已经搜索了几天,并尝试了各种解决方案,例如here,但到目前为止还没有运气。为什么我会收到此错误以及如何解决该错误的任何想法?

谢谢!

4 个答案:

答案 0 :(得分:2)

我从来没有这个工作。我在this page和许多其他网站上花费了大量时间,并尝试了所有方法。看来Homebrew Python和Tcl-Tk目前并非同一版本,这是一个常见问题。我最终要做的是按照@Simba here的出色说明并排安装pyenv和anaconda,然后使用Anaconda正常运行Tcl-Tk命令。张贴在这里,这样其他人就不会掉进这个兔子洞,或者如果他们找到了解决方案,那真是太好了。

答案 1 :(得分:1)

以下是逐步指南,以使IDLE和tkinter正常工作:

  1. 使用Homebrew安装tcl-tk。在shell中运行brew install tcl-tk
  2. 在shell中运行echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
  3. 通过退出Terminal应用或运行source ~/.zshrc
  4. 重新加载Shell
  5. 重新加载后,检查tck-tk中是否有$PATH。运行echo $PATH | grep --color=auto tcl-tk。结果,您应该看到$ PATH内容突出显示了tcl-tk
  6. 现在我们从步骤1的Homebrew输出中运行三个命令
    1. 在shell中运行export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
    2. 在shell中运行export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
    3. 在shell中运行export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
  7. 如果您已经安装了pyenv的Python版本,请使用pyenv uninstall <your python version>卸载它。例如。 pyenv uninstall 3.8.2
  8. 设置python-build将使用的环境变量。在shell中运行PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" 注意:在将来使用的tck-tk版本实际上已随Homebrew一起安装。在发布8.6时是实际的
  9. 最终将pyenvpyenv install <version>一起安装Python。例如。 pyenv install 3.8.2

测试

  1. 在shell中运行pyenv global <verion that you've just installed>
  2. 现在检查IDLE。在shell中运行idle。您应该看到“ IDLE”窗口,没有任何警告,并且“文本打印为红色”。

IDLE window run from Terminal. No warnings

  1. 现在检查tkinter。在shell中运行python -m tkinter -c "tkinter._test()"。您应该看到如图所示的测试窗口:

tkinter test window

就是这样!

我的环境:

检查执行上述步骤是否出错:

  1. macOS Catalina
  2. zsh(包含在macOS Catalina中)= 上面的“外壳”
  3. Homebrew(安装了Homebrew官方网站的说明)
  4. pyenv(已根据GitHub上的pyenv官方自述文件,安装了Homebrew和PATH)
  5. Python 3.8.x-3.9.x(通过pyenv install <version>命令安装)

答案 2 :(得分:1)

当我尝试通过 pyenv 安装 tkinter 时遇到了同样的问题。虽然@Dribbler 的回答有助于发现 anaconda 更兼容,但当我按照 @Simba 说明进行操作时,我仍然收到一个错误,指出 there is no conda command。 最后,我可以使用以下方法修复它,以防有人遇到同样的问题但仍想坚持使用 pyenv

修复

  1. 我按照@nickolay 的说明安装了 tkinter 并以正确的方式设置了路径。

  2. 然后,我使用 pyenv install anaconda3-2020.07 命令安装了 anaconda3-2020.07。

  3. 因为我使用的是 pyenv python 3.8.6 全局:我导航到我想使用 tkinter 的文件夹并使用了 anaconda3-2020.07 本地通过使用命令 pyenv local anaconda3-2020.07 在该特定文件夹中使用此版本的 pyenv。它运行没有错误!

enter image description here

注意:我在 .bash_profile 中使用以下脚本在 cd 所需目录时自动触发 virtualenv

# manage python version using pyenv
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

# add pyenv virtualenv
eval "$(pyenv virtualenv-init -)"

答案 3 :(得分:0)

当然,它不适用于pyenv中的Python。

pyenv是一个Python环境管理器,它支持安装不同版本的Python。从pyenv安装Python时,pyenv将下载源代码并将其构建在本地计算机上。

问题在于,pyenv构建的Python没有将Homebrew安装的tcl-tk用作依赖项。

您提到的issue已经足够清楚地说明了这一点。您必须通过pyenv使用特殊的PYTHON_CONFIGURE_OPTS环境变量来重新安装/重新编译Python,以告诉pyenv使用Homebrew安装的tcl-tk作为依赖项。