KURORO BLOGのロゴ

このエントリーをはてなブックマークに追加
【もう迷わない!? mac編】Pyenv環境からTkinterをインストール

【もう迷わない!? mac編】Pyenv環境からTkinterをインストール

PythonのGUI標準ライブラリの1つTkinter。使ってみたいけれども、導入がうまくいかないと悩んでいる方も多いのではないでしょうか?今回はPyenv環境からTkinterをインストールしてみます。

目次
  1. 用意するもの
  2. 開発環境情報
  3. 現状確認
  4. 下準備
  5. Pyenvに含まれる現在利用中のPythonを削除
  6. Tcl/Tkのインストール
  7. Pyenvを使ってPythonを再度インストール
  8. Tkinter確認
  9. まとめ
  10. 参考文献
目次を開く⬇︎

用意するもの

  • Macを利用している。
  • ターミナルを活用できる。
  • Homebrew(MacOS(またはLinux)用パッケージマネージャー)が使えること(brewインストール)
  • ローカルにてPythonが叩ける状態であること(ターミナルにてpython -Vでバージョンが表示される)
  • pipが入っていない場合はpipを入れておく(Python 3.4以降では標準で入っている。ターミナルにてpip -Vでバージョンが表示される。参考)
  • Pyenvを活用していて、Python環境の切り替えができる(Pyenv)

開発環境情報

開発環境バージョン
MacOS Big Sur                     11.2.3
Pyenv1.2.22以降 (Python 3.7.8以降, 3.8.4以降, 3.9.0以降利用の場合にインストールできます。ターミナルを開いてpython -Vを実行してPythonのバージョンを確認できます。またPyenvを最新のバージョンへ進めることを推奨します。最新のPyenvへ変更するためには、ターミナルを開いてbrew upgrade pyenvを実行。)
シェルzsh (ターミナルを開いて、$ echo $SHELLで確認する。)

現状確認

Tkinter自体は標準ライブラリであり、環境によっては既に動いているかもしれません。以下の方法を用いて現状確認してみましょう。

  1. ターミナルを起動する。
  2. python -iを実行(Pythonをインタラクティブモードで実行する。ターミナルから対話型でPythonを実行できる。)
  3. import tkinterを実行(Tkinterを利用する。)
  4. quit()(インタラクティブモードを終了する。)

import tkinterを実行した際に、エラーが表示されなければ既にTkinterが利用できます。ほとんどの方は以下のエラーが表示されるのではないでしょうか?

1ModuleNotFoundError: No module named '_tkinter'

このエラーは、TkinterはPythonに入っているけれども、GUIツールのTcl/Tkというモジュールが見つからないと指摘されています。

下準備

方針として、

  • Pyenvに含まれる現在利用中のPythonを削除
  • Tcl/Tkのインストール
  • Pyenvを使ってPythonを再度インストール

を行います。

しかし、いきなり「Pyenvに含まれる現在利用中のPythonを削除」してしまうと、現環境で動くコードも動作しなくなってしまいます。。

そこでpip freeze > pip.txtを実行して、現環境で動作するパッケージ情報をpip.txtファイルへ書き込んでおきます。ファイルの置き場所を忘れないようにデスクトップのディレクトリから実行をおすすめします。

Pyenvに含まれる現在利用中のPythonを削除

以下のコマンドを用いてPyenvに含まれる現在利用中のPythonの削除を行います。

  1. pyenv versions(Pyenvで利用可能なPythonバージョン情報、現在利用中のPythonのバージョンを確認)
  2. pyenv global system(PyenvのPython利用先をsystemに変更)
  3. pyenv versions(現在活用中のPythonのバージョンがsystemへ変更されていることを確認)
  4. pyenv uninstall 3.X.X(Python3.X.Xを削除する)

Tcl/Tkのインストール

以下のコマンドを用いてTcl/Tkインストールと設定を行います。

  1. brew install tcl-tk(tck-tkのインストール)
  2. brew info tcl-tk(インストールしたtcl-tkの詳細を確認)
  3. vi ~/.zshrc(bashの場合 : vi ~/.bash_profile) (Vimを活用して.zshrcファイル(bashの場合は.bash_profileファイル)を編集する。)
  4. .zshrcファイル(.bash_profileファイル)へ以下を記述する。
1export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
2export CPPFLAGS="-I/usr/local/opt/tcl-tk/include"
3export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig"
4export 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'"

上記の設定を行う意味を説明すると、

  • brewでインストールしたパッケージは、基本的にパスを通さないと動きません。
  • 先ほどbrewでインストールしたtcl-tkを動かすため、.zshrcファイルや.bash_profileファイルに記述を施します。(bash_profileまとめ)
  • export PATH="/usr/local/opt/tcl-tk/bin:$PATH" : 環境変数$PATHの最初にtcl-tkのパスを追加する。(パスについて)
  • export CPPFLAGS="-I/usr/local/opt/tcl-tk/include" : tcl-tkライブラリを使ったPythonファイルを実行した際に、コンパイラがtcl-tkを見つけるために必要な設定です。
  • export PKG_CONFIG_PATH="/usr/local/opt/tcl-tk/lib/pkgconfig" : tcl-tkライブラリを利用する際のパスなどの記述に関する、互換性を保つために必要な設定。(参考)
  • 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'" : pyenv環境下で利用中のPythonへ、tcl-tk8.6系バージョンの利用を伝えるために必要な設定。

Pyenvを使ってPythonを再度インストール

  1. brew info tcl-tk(インストールしたtcl-tkのバージョンを確認)
  2. pyenv install 3.X.X(PythonをPyenvを使ってインストール。3.X.X箇所をpython 3.7.8以降, 3.8.4以降, 3.9.0以降のバージョンに変更ください。)
  3. pyenv global 3.X.X(インストールしたPythonへ変更)
  4. pyenv versions(インストールしたPythonが選択されているか確認)
  5. pip install -r pip.txt(pip.txtがある箇所で実行ください。pip.txtファイルを元にパッケージ情報の復元を行います。)

私のbrew info tcl-tk情報

1tcl-tk: stable 8.6.11 (bottled) [keg-only]
2Tool Command Language
3https://www.tcl-lang.org
4/usr/local/Cellar/tcl-tk/8.6.11_1 (3,041 files, 51.6MB)
5...

Tkinter確認

python -m tkinterを実行すると、以下の画像のGUIが表示されます。

まとめ

  • 始めにPythonでTkinterを動作できるか確認する。
  • Python環境を削除して復元を検討する場合、pipコマンドを活用して予めパッケージ情報をファイルにまとめておく。

参考文献