困っていたこと
macOS Monterey 12.6にする前から発生していたのですが、Windowsで正しく動いていたtkinterのアプリをMacに持ってきたところ、Tkinterで作成したウィンドウが真っ黒に表示されて使い物になりませんでした。
そこで、いろいろと調べたところ、Macにビルトインされているtkinter(tcl-tk)のバージョンでは不具合があり、新しいバージョンに変更すれば良いことが分かりましたが、一癖ありかなり手間取りましたので、備忘録的に書き残します。
ざっくり書くと、最新のtcl-tkをインストール(アップデート)して、それだけだとPythonが新しいVersionを認識しないので、PATHを通したり、環境変数をセットして、Pythonを上書きでアップデートする。
これで、私の場合はうまく行きました。
使っている環境
シェル: zsh(標準環境)
pyenv: stable 2.3.4
異常な(困った)表示
基本的に下記のコマンドを打って、困った表示が出ている人向けの記事です。
% python -m tkinter
↓↓↓↓↓困った表示↓↓↓↓↓
本来であれば、白のバックグラウンドに黒の文字でVersion情報が表示されます。tkinterのコードを書いて他の色のバックグラウンド色を指定しても真っ黒になります。
困ったなの時に実際に動いているTkinterのVersion↓ 8.6がインストールされていても、単にアップデートしただけでは、Pythonからは認識されておらず、下記の例では8.5.9が使われてしまっています。
% python
Python 3.10.4 (main, Sep 29 2022, 07:25:02) [Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>> tkinter.Tcl().eval('info patchlevel')
'8.5.9'
>>>
導入されているtcl-tkのVersion
導入されているtcl-tkのVersionを確認してみます。
% brew info tcl-tk
tcl-tk: stable 8.6.12 (bottled) [keg-only]
Tool Command Language
https://www.tcl-lang.org
/opt/homebrew/Cellar/tcl-tk/8.6.12_1 (3,045 files, 52MB)
Poured from bottle on 2022-07-04 at 16:22:40
上記の例では、8.6.12が入っているにも関わらず、実際には、8.5.9が使われているということになります。
正しく動かすには8.6以降のVersionが入っている必要があるので、そもそもtcl-tkが入っていなかったり、8.5などの場合は下記のコマンドでインストール(アップデート)します。
% brew install tcl-tk
改めて再度tcl-tkのVersionを確認してみます。
% brew info tcl-tk
準備ができたので、Pythonで使いたいtcl-tkを紐づけるための作業を実施
PythonのVersionの確認
% python --version
Python 3.10.4
~/.zshrc に下記のステートメントを追加します。
export PATH="/usr/local/opt/tcl-tk/bin:$PATH"
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"
これらは、brewでインストールしたものは、PATHを通さないとつかえないので、PATHを追加しているのと、このあとPYTHONの再構築の時に使うための環境変数をセットしています。これらは、% brew info tcl-tk で出てくる情報に書かれています。
Pythonを上書きしてtcl-tk8.6を認識させる様にします。
% 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 install 3.10.4
最後の3.10.4は、前に確認したPythonのVersionと合わせてあります。また、このプロセスで使われるPYTHON_CONFIGURE_OPTS環境変数でtcl-tk8.6関連の指定をしつつ、pyenvを実行しているコマンドとなります。
Pythonが認識しているtcl-tkのVersionを確認
% python
Python 3.10.4 (main, Sep 29 2022, 07:25:02) [Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tkinter
>>> tkinter.Tcl().eval('info patchlevel')
'8.6.12'
>>>
tkinterのテストプログラムが正しく動くことを確認
% python -m tkinter