在MacOS Mojave上,通过Homebrew pyenv安装tcl-tk(tkinter)失败

3

如果我在MacOS Mojave上使用Homebrew做这件事:

$ brew install tcl-tk
$ brew install pyenv
$ pyenv install 3.7.4
$ pyenv global 3.7.4
$ python -m tkinter -c 'tkinter._test()'    

I get:

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'

我已经搜索了好几天并尝试了多种解决方案,例如这里,但到目前为止都没有成功。你们有任何想法为什么我会收到这个错误以及如何修复它吗?
提前感谢!
3个回答

6

这里是使IDLE和tkinter工作的逐步指南:

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

测试

  1. 在命令行中运行pyenv global <verion that you've just installed>
  2. 现在检查IDLE是否正常工作。在命令行中运行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 中) = "shell" 上面所提到的那个
  3. Homebrew (按照 Homebrew 官网的说明安装)
  4. pyenv(使用 Homebrew 安装,并根据来自 GitHub 的 pyenv 官方自述文件更新 PATH )
  5. Python 3.8.x - 3.9.x(使用 pyenv install <version> 命令安装)

4
我从未让它正常工作。我在这个页面以及其他一些网站上花了大量时间,尝试了所有可能的方法。似乎Homebrew Python和Tcl-Tk目前不是基于相同版本开箱即用的,这是一个普遍存在的问题。最终我安装了pyenv和anaconda并行,按照@Simba的出色指南操作,使用Anaconda可以正常运行Tcl-Tk命令。在此发布帖子,以便其他人不要跟着我掉进这个兔子洞里,或者如果他们找到解决方案,那将是很好的知识补充。

我实际上已经成功地在笔记本电脑上运行了这个,但是按照完全相同的指示在我的iMac上却无法运行。 - fny

1
当我尝试通过pyenv安装tkinter时,遇到了同样的问题。虽然@Dribbler的回答有助于发现anaconda更兼容,但是当我按照@Simba的说明操作时,仍然出现了错误,提示“没有conda命令”。最后,我使用以下方法解决了这个问题,以防其他人遇到相同的问题并仍然想坚持使用pyenv。
修复步骤: 1. 我按照@nickolay的说明安装了tkinter,并正确设置了路径。 2. 然后,我使用“pyenv install anaconda3-2020.07”命令安装了anaconda3-2020.07。 3. 因为我全局使用pyenv python 3.8.6:我进入要使用tkinter的文件夹,并使用“pyenv local anaconda3-2020.07”命令在该特定文件夹中本地使用anaconda3-2020.07版本的pyenv。它可以无错误运行!

enter image description here

注意:我在.bash_profile中使用以下脚本,在进入所需的目录时自动触发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 -)"

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