Tkinterを使用したプログラムを実行するとエラーが発生

Python3.13.0のプログラムでTkinterを利用しようとすると画像のようなエラーが出て実行できません。TkinterはPythonに付属するはずなのですが。
画像のエラーをテキストにすると以下のとおりでした。
Traceback(most recent call last):
File "/Users/****/Programing/pythonProject/llm_zundamon/program/prime_check.py", Line 1, in <module>
import tkinter as tk
File "i/Users/****/.pyenv/versions/3.13.0/Lib/python3. 13/tkinter/__init__.py", line 38, in <module>
import _tkinter # If this faiLs your Python may not be configured for Tk
^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named "_tkinter'
原因
pyenvでpythonをインストールするとTkinterはインストールされるものの、このインターフェースから利用されるTcl/Tkがインストールされていない事が原因のようです。
なお、pythonのドキュメントには以下の記述があります。
tkinter
パッケージ (“Tk インターフェース”) は、 Tcl/Tk GUI ツールキットに対する標準の Python インターフェースです。 Tk とtkinter
は macOS を含むほとんどの Unix プラットフォームの他、 Windows システム上でも利用できます。
対応
KURORO BLOGの「【もう迷わない!? mac編】Pyenv環境からTkinterをインストール」を参照し、問題を解消していきます。ただし、当方はM1 Macを利用していますが、Homebrewのパスが異なっている等いくつか記載を変更しなくてはいけない部分がありましたので、その点を中心にメモを残していきます。
次の順序で対応していきます。
- pyenvからpythonをアンインストール
- HomebrewでTcl/Tkをインストール
- Pythonを再インストール
なお、この記事の前提環境は以下のとおり
- M1 Mac
- Pyenvで導入しようとしているPythonのバージョンは3.13.0
- シェルはMacOS付属のzshを利用
- 環境構築はPoetryでローカルフォルダ内で構築
- Homebrew導入済み
pyenvからpython(3.13.0)をアンインストール
- 利用するPythonをpyenvでインストールしたものから「system」に変更
pyenv global system
- (当方はpoteryで環境構築をしているため、pipを利用してインストールしたパッケージがないため、
pip freeze > pip.txt
の手順はとばしました。) - Python3.13.0をアンインストール
pyenv uninstall 3.13.0
HomebrewでTcl/Tkをインストール
- 以下のコマンドを実行し、HomebrewでTcl/Tkをインストール
brew install tcl-tk
- インストールしたTcl/Tkのバージョンを確認する
brew info tcl-tk
(結果は以下のとおり)
==> tcl-tk: stable 9.0.0 (bottled)
Tool Command Language
https://www.tcl-lang.org
Conflicts with:
page (because both install `page` binaries)
the_platinum_searcher (because both install `pt` binaries)
Installed
/opt/homebrew/Cellar/tcl-tk/9.0.0_1 (3,147 files, 38.0MB) *
バージョン9.0.0_1が導入されました。
- zshrcに以下を追加する。
export PATH="/opt/homebrew/opt/tcl-tk/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/tcl-tk/lib"
export CPPFLAGS="-I/opt/homebrew/opt/tcl-tk/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/tcl-tk/lib/pkgconfig"
export PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/opt/homebrew/opt/tcl-tk/include' --with-tcltk-libs='-L/opt/homebrew/opt/tcl-tk/lib -ltcl9.0 -ltk9.0'"
URORO BLOGさんの記事と最近のHomebrewのprefixは異なっているので「/usr/local/opt/tcl-tk」を「/opt/homebrew/opt/tcl-tk」に書き換えています。Homebrewで導入したTcl/Tkのprefixは以下のコマンドで確認します。
brew --prefix tcl-tk
(実行結果)
/opt/homebrew/opt/tcl-tk
しかし、このコマンドをzshrcに組み込めば、もう少し汎用性が高まると考え、最終的に以下のようにzshrcを書き換えました。
export PATH="$(brew --prefix tcl-tk)/bin:$PATH"
export LDFLAGS="-L$(brew --prefix tcl-tk)/lib"
export CPPFLAGS="-I$(brew --prefix tcl-tk)/include"
export PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig"
export PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl9.0 -ltk9.0'"
なお、今回導入したTcl/Tkは、バージョン9.0.0_1のため最終行は「-ltcl8.6 -ltk8.6」から「-ltcl9.0 -ltk9.0」に書き換えています。
最後に、書き換えたzshrcを再読み込みします。
source ~/.zshrc
Pythonを再インストール
- pyenvを利用してPython3.13.0を再インストールします。
pyenv install 3.13.0
- インストールしたPython3.13.0を利用するよう設定を変更
pyenv global 3.13.0
起動確認
以下のコマンドをターミナルで実行すると、無事に画面が表示されました。
python -m tkinter
