🍏

MacのPython環境でtkinterを使えるようにする

2022/04/26に公開
2

近頃、pythonを勉強中なのですが、それは突然やってきました。
pythonの技術本に記載されているコードをコピーして実行したところ、tkinter が使えないではありませんか!そんなモジュールは無いと怒られます😓
『いやいや、そんなはず無いじゃん。面倒くせえなぁ、変な文字コードが入ったか🌝?』と思って色々修正してみたのですが 、エラーは解消されません。

困ったときのGoogle先生でエラーメッセージを調べたところ、Macでpython環境を使っていると遭遇する事象の様です。解決手順が分かりましたので備忘録として残します。
また、解決にあたりこちらのサイトを参考にさせて頂きました。

本記事は Homebrew と pyenv の環境を想定しています。
構築手順を知りたい方はこちらをどうぞ。

なお、この記事はブログの過去記事をほぼそのまま転用した為、Zennで見づらい等ありましたらブログの方が分かりやすい?かもです。

Pythonのアンインストール

pyenv でPythonをインストールしていましたので、pyenvでPythonをアンインストールします。

% pyenv uninstall 3.8.5

Tcl/Tkのインストール

Hombrewからtcl-tkのパッケージをインストールします。

% brew install tcl-tk

python-buildを修正

python-buildというファイルの中身を書き換えます。
まずは、pyenvのバージョンを調べます。

% pyenv --version
pyenv 1.2.27

次にFinder上で、shift + ⌘(command) + G と入力します。そうすると、ディレクトリパスを入力するポップアップが開きます。
ここで先ほど調べたバージョンを元に以下のようなパスを入力します。

/usr/local/Cellar/pyenv/<version>/plugins/python-build/bin/

該当のディレクトリが開くと、python-build というファイルがあるので、これを適当なエディタで開きます。(私は、CotEditorを使いました。)
ファイルを開いて、782行目に

-with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'

という文字列を追加します。

変更前

$CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1

変更後

$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'
${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" || return 1

Python再インストール

pyenv でPythonを再インストールし、pyenv versionsコマンドでPythonがインストールしたバージョンに設定されていることを確認します。

% pyenv install 3.8.5
% pyenv versions
  system
* 3.8.5 (set by /usr/local/var/pyenv/version)

tkinterの確認

import tkinter があるファイルを実行します。
エラーが出ずに実行できたら成功です。

Discussion

kaibakaiba

ためになる記事、ありがとうございます。
python-buildを直接いじるのは乱暴な気がしましたので、環境変数で指定してやるのがスムーズかもしれません。

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 -ltcl8.6 -ltk8.6'"
space geekspace geek

コメントありがとうございます。
この記事を書いた当時は、よくわからずにpython-buildの設定を変更していましたが、今から振り返ると確かに乱暴ですね😆
環境変数良さそうです👍🏻