Mac で brew upgrade したら tkinter が見つからなくなったが、解決した話

一年ほど前、Intel Mac で tkinter をいじっていたとき、いくらがんばっても日本語入力の時の選択肢を表示させる方法がうまくいかなかったので、しばらく tkinter 含めた Python の GUI からは離れていました。が、最近読み始めた本で tkinter を使っていたので気分が乗って、改めていろいろ試したところ、ハマった後に解決できたのでその方法のご紹介です。

結論から先に言うと、答えは brew info python に書いてあった

brew で Python を 3.9.1 から 3.9.6 にアップグレードしたときのログはロクに見ていなかったのですが、一晩寝かせた後に brew info python を叩いてみたところ、やるべきことが書いてあり無事解決できました。下の (略) に挟まれた部分です。tkinter はもう Python 3 に含まれ無くなったけど、まだインストールできますよ、という事を言っています。

% brew info python3
python@3.9: stable 3.9.6 (bottled)
Interpreted, interactive, object-oriented programming language
https://www.python.org/
(略)
tkinter is no longer included with this formula, but it is available separately:
  brew install python-tk@3.9
(略)

というわけで、もし brew upgrade で python3 を 3.9.x にアップグレードした後に tkinter が動かなくなった場合は、brew install python-tk@3.9 で tkinter も別途インストールしてあげてください。

ほんの最近まで、多分去年くらい?までの情報では「Python で GUI やるなら、まずは標準で入っている tkinter を試しましょう」と書かれていると思うんですが、少なくとも Mac の brew によるインストールでは標準では入っていない、ということですね。

動かなくなったときのエラーはこんな感じ

% python3 -m tkinter
Traceback (most recent call last):
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 188, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 147, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 111, in _get_module_details
__import__(pkg_name)
File "/opt/homebrew/Cellar/python@3.9/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 37, in
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

動かなくなった当日は、pipenv だとモジュールを読み込んでくれないような気がしていてずいぶんと余計な遠回り。一晩寝かせて Python 環境全体の再構築までを覚悟したものの、pipenv の外でも動かない。やったことをイチから見直して答えにたどり着けてヨカッタです。

© Peddals.com