无法在MacOS上安装带有pyenv Python的tkinter

niknxzdl  于 2023-06-04  发布在  Python
关注(0)|答案(7)|浏览(370)

通过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)
qnyhuwrf

qnyhuwrf1#

TL;DR设置环境。vars.在tcl-tk的警告这个GitHub评论中提到,当通过pyenv安装新的Python以获得tkinter时。
首先,确保你有最新的tcl-tk通过homebrew,然后注意它的警告:

※ 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,例如:从这个评论。
接下来,重新安装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 env。var.

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)
s8vozzvw

s8vozzvw2#

如果您在macOS上使用pyenv进行Python环境管理,请使用以下分步指南来使tkinter(和IDLE)正常工作:
1.使用Homebrew安装tcl-tk。在shell中运行brew install tcl-tk
1.在shell中运行echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.zshrc
1.通过退出Terminal应用程序或运行source ~/.zshrc重新加载shell
1.重新加载后,检查tcl-tk是否在$PATH中。运行echo $PATH | grep --color=auto tcl-tk。因此,您应该看到$PATH内容突出显示了tcl-tk
1.现在我们从Homebrew的输出中运行三个命令
1.在shell中运行export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
1.在shell中运行export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
1.在shell中运行export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
1.如果你已经用pyenv安装了Python版本,那么用pyenv uninstall <your python version>卸载它。例如pyenv uninstall 3.8.2
1.设置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'" * 注意:在将来使用实际上与Homebrew一起安装tck-tk版本。在发布8.6的时刻是实际的 *
1.最后安装Python with pyenv with pyenv install <version>。例如pyenv install 3.8.2

测试

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

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

就是这样!

我的环境:

检查这是执行上述步骤时出错了:

  1. macOS Catalina
  2. zsh(包含在macOS Catalina 中)=“shell”above
  3. Homebrew(安装时使用Homebrew官方网站的说明)
  4. pyenv(安装Homebrew和PATH,根据GitHub上的pyenv官方自述文件更新)
  5. Python 3.8.x-3.9.x(使用pyenv install <version>命令安装)
eqfvzcg8

eqfvzcg83#

在撰写本文时,tcl-tk似乎不再是keg-only,因此不再需要设置环境变量:

※ brew info tcl-tk
==> tcl-tk: stable 8.6.13 (bottled)
...
==> Caveats
The sqlite3_analyzer binary is in the `sqlite-analyzer` formula.
==> Analytics
...

实际上,我能够为pyenv提供tkinter,并简单地通过运行以下命令来解决poster的问题:

※ pyenv uninstall <python version>
※ brew install tcl-tk
※ pyenv install <python version>

(FWIW,我正在苹果硅处理器上使用MacOS Ventura。)

mf98qq94

mf98qq944#

对于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
jdgnovmf

jdgnovmf5#

当我尝试通过pyenv安装tkinter时,也遇到了同样的问题。我能够使用以下方法修复它,以防有人遇到同样的问题,仍然想坚持使用pyenv

修复

1.我按照@nickolay的说明安装了tkinter并以正确的方式设置了路径。
1.然后,我使用pyenv install anaconda3-2020.07命令安装了anaconda 3 -2020.07。
1.因为我使用的是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 -)"
rqenqsqc

rqenqsqc6#

对于Python 3.9及以上版本,可以使用以下公式
brew install python-tk@3.9
它将安装python@3.9和tcl-tk并为您绑定它们。

bejyjqdl

bejyjqdl7#

tkinterpyenv一起使用可能会因为缺少依赖关系而变得棘手。
下面的两个步骤应该可以帮助您修复tkinterpyenv问题。

第一步:安装必要的系统包

tkinterpyenv一起使用可能会因为缺少依赖关系而变得棘手。
首先,让我们确保已经为tkinter安装了必要的系统包。
在macOS上,您可以使用Homebrew:

brew install tcl-tk

第二步:链接正确的Tcl/Tk版本

接下来,确保在安装Python时链接了正确的Tcl/Tk版本。pyenv在您的环境中构建Python,但如果您没有所需的依赖项,如Tk/Tcl库,它将在没有它们的情况下构建Python。
如果你想使用的Python版本已经安装在你的系统上,你需要在继续之前卸载它。例如:

pyenv uninstall 3.11.3

使用pyenv安装新的Python版本时,请使用以下命令:
对于macOS,使用brew安装tcl-tk后:

brew install openssl readline sqlite3 xz zlib

env LDFLAGS="-L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix sqlite3)/lib -L$(brew --prefix xz)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix tcl-tk)/lib" \
CPPFLAGS="-I$(brew --prefix openssl@1.1)/include -I$(brew --prefix readline)/include -I$(brew --prefix sqlite3)/include -I$(brew --prefix xz)/include -I$(brew --prefix zlib)/include -I$(brew --prefix tcl-tk)/include" \
PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix readline)/lib/pkgconfig:$(brew --prefix sqlite3)/lib/pkgconfig:$(brew --prefix xz)/lib/pkgconfig:$(brew --prefix zlib)/lib/pkgconfig:$(brew --prefix tcl-tk)/lib/pkgconfig" \
pyenv install <version>

<version>替换为要安装的Python版本。之后,您应该能够在pyenv Python环境中导入tkinter
请注意,我无法让tkinter在Python 3.11.0上与pyenv一起工作,但它在3.11.2上工作得很好。

相关问题