无法在MacOS上使用pyenv Python安装tkinter

时间:2020-02-29 20:11:05

标签: python macos tkinter pyenv

通过pyenv安装的Python版本无法导入tkinter

※ python
Python 3.8.1 (default, Feb 29 2020, 11:45:59)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/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'
>>>

否则您可能会收到有关标头版本与二进制文件不匹配的消息:

DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _test
    root = Tk()
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__
    self._loadtk()
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtk
    raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

6 个答案:

答案 0 :(得分:48)

TL; DR设置环境。 vars。通过pyenv安装新Python以获取tcl-tk时,在tkinter的警告中提到 this GitHub comment

首先,请确保您通过自制软件拥有最新的tcl-tk,然后注意它的警告:

※ brew install tcl-tk
※ brew info tcl-tk
tcl-tk: stable 8.6.10 (bottled) [keg-only]
...
==> Caveats
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because tk installs some X11 headers and macOS provides an (older) Tcl/Tk.

If you need to have tcl-tk first in your PATH run:
  echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc

For compilers to find tcl-tk you may need to set:
  export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
  export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"

For pkg-config to find tcl-tk you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
...

您还需要了解pyenv的PYTHON_CONFIGURE_OPTS--with-tcltk-includes--with-tcltk-libs,例如来自this comment

接下来,在环境变量处于活动状态的情况下重新安装Python:

※ pyenv uninstall 3.8.1
※ env \
  PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
  LDFLAGS="-L$(brew --prefix tcl-tk)/lib" \
  CPPFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
  CFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl8.6 -ltk8.6'" \
  pyenv install 3.8.1

它现在应该可以工作:

※ pyenv global 3.8.1
※ python
Python 3.8.1 (default, Feb 29 2020, 11:56:10)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>> tkinter.TclVersion, tkinter.TkVersion
(8.6, 8.6)
>>> tkinter._test()
# You should get a GUI

如果出现以下错误,则可能缺少PYTHON_CONFIGURE_OPTS的环境。变种以上。

DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 4552, in _test
    root = Tk()
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2263, in __init__
    self._loadtk()
  File "/Users/factor/.pyenv/versions/3.8.1/lib/python3.8/tkinter/__init__.py", line 2279, in _loadtk
    raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

答案 1 :(得分:11)

如果您在MacOS上使用tkinter进行Python环境管理,则逐步指南可以使pyenv(和IDLE)工作:

  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)

对于 MacOS Big Sur (11.2.3),Carl G 的回答对我不起作用,因为我遇到了 zlib 错误。基于 this answerthis blog post,我发现

取得了成功
brew install bzip2
export LDFLAGS="-L $(xcrun --show-sdk-path)/usr/lib -L brew --prefix bzip2/lib"
export CFLAGS="-L $(xcrun --show-sdk-path)/usr/include -L brew --prefix bzip2/include"
export 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' --enable-framework"
pyenv install 3.8.6

答案 3 :(得分:1)

Xcode、zlib 和编译器选项似乎有问题。从 brew 开始,他们做了一些补丁到 3.8.0 python 版本。

我的配置

undefined
MyComponent

这对我安装 3.8.0 和 3.9.0 有用

{data?.list ? <MyComponent list={data.list} /> : null}

我的来源:

答案 4 :(得分:0)

当我尝试通过 pyenv 安装 tkinter 时遇到了同样的问题。如果有人遇到同样的问题但仍想坚持使用 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。它运行没有错误!

注意:我在 .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 -)"

答案 5 :(得分:0)

对于 Python 3.9 及以上版本,您可以使用以下公式

brew install python-tk@3.9

它会安装 python@3.9 和 tcl-tk 并为你绑定。