LoginSignup
6
8

More than 3 years have passed since last update.

pyenvでインストールしたpythonでtkinterがimportできなかった時。

Posted at

概要

PySimpleGuiを使おうとしたところ_tkinterというモジュールがありませんと言われてから解決するまでの流れ

環境

  • macOS 10.14.6(18G87)
  • pyenv(anyenv)
  • python 3.8.5
  • venv

ModuleNotFoundError: No module named '_tkinter'

_tkinterとは?
- UnixのWindowでアプリケーションを作るための何か
- (後日ちゃんと調べて更新)

この質問を参考にしてpythonを再インストール
[stack overflow] Unable to install tkinter with pyenv Pythons on MacOS

issue
$ python -m tkinter
Traceback (most recent call last):
  File "~/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/runpy.py", line 185, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "~/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/runpy.py", line 144, in _get_module_details
    return _get_module_details(pkg_main_name, error)
  File "~/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/runpy.py", line 111, in _get_module_details
    __import__(pkg_name)
  File "~/.anyenv/envs/pyenv/versions/3.8.5/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'

tcl-tkをインストール

tcl-tkとは?
- (後日ちゃんと調べて更新)

tcl-tk(install)
$ brew install tcl-tk

環境変数設定

$ brew infoで表示された情報をとりあえずなにも考えずに実行
- (後日ちゃんと調べて更新)

tcl-tk(info)
$ brew info tcl-tk
tcl-tk: stable 8.6.10 (bottled) [keg-only]
Tool Command Language
https://www.tcl-lang.org
/usr/local/Cellar/tcl-tk/8.6.10 (3,036 files, 51MB)
  Poured from bottle on 2020-09-02 at 11:04:37
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/tcl-tk.rb
License: TCL
==> Dependencies
Required: openssl@1.1 ✔
==> Caveats
tcl-tk is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

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

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"

==> Analytics
install: 8,121 (30 days), 23,761 (90 days), 93,541 (365 days)
install-on-request: 4,323 (30 days), 12,391 (90 days), 51,230 (365 days)
build-error: 0 (30 days)
環境変数設定
$ echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.bash_profile
$ export LDFLAGS="-L/usr/local/opt/tcl-tk/lib"
$ export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
$ export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"

pythonを再インストール

python3.8.5のアンインストール
$ pyenv uninstall 3.8.5
pyenv: remove ~/.anyenv/envs/pyenv/versions/3.8.5? [y|N]y
pyenv: 3.8.5 uninstalled
python3.8.5のインストール
$ pyenv install 3.8.5
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.5.tar.xz...
-> https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz
Installing Python-3.8.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8.5 to ~/.anyenv/envs/pyenv/versions/3.8.5

RuntimeError: tk.h version (8.6) doesn't match libtk.a version (8.5)

今度はバージョンが合っていない?ようなエラーが出てきたので以下の記事を参考にpython-buildの設定を修正
[Qiita] pyenv が homebrew でインストールした tcl-tk と動かない。

issue
$ python sample.py 
~/workspace/python/pysimplegui/myvenv/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py:17865: UserWarning: You are running a VERY old version of tkinter 8.5.9
  warnings.warn('You are running a VERY old version of tkinter {}'.format(tclversion_detailed), UserWarning)
Traceback (most recent call last):
  File "sample.py", line 13, in <module>
    event, values = window.read()
  File "~/workspace/python/pysimplegui/myvenv/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py", line 7568, in Read
    results = self._read(timeout=timeout, timeout_key=timeout_key)
  File "~/workspace/python/pysimplegui/myvenv/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py", line 7623, in _read
    self._Show()
  File "~/workspace/python/pysimplegui/myvenv/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py", line 7395, in _Show
    StartupTK(self)
  File "~/workspace/python/pysimplegui/myvenv/lib/python3.8/site-packages/PySimpleGUI/PySimpleGUI.py", line 12716, in StartupTK
    Window.hidden_master_root = tk.Tk()
  File "~/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/tkinter/__init__.py", line 2263, in __init__
    self._loadtk()
  File "~/.anyenv/envs/pyenv/versions/3.8.5/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)

python-buildを編集してpythonを再インストール

$ cd .anyenv/envs/pyenv/plugins/python-build/bin
$ cp -p python-build python-build.org
$ vim python-build
# ↑記事参照↑
$ pyenv uninstall 3.8.5
$ pyenv install 3.8.5

これで一旦tkinterを利用したコードが動くようになりました。
途中、思考停止で通り過ぎていたものがあるので後日更新します。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8