Skip to main content

tkinker メモ

問題

  • brew で入れた python だと、tkinker が動作しなかった
bash
python3 -m tkinter
log
import _tkinter # If this fails your Python may not be configured for Tk
^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named '_tkinter'

→ モジュールが見つからないと出る

解決方法

bash
brew install python-tk
bash
python3 -m tkinter

→ サンプルダイアログが出る

参考. ところで、tkinter ってなに

  • Tcl/Tk : Tcl 言語用に作られた toolkit
  • tk : toolkit
  • inter : interface
  • tkinter : Python 用の、 Tk を使うためのインターフェース

参考. 他に試したこと

試したがうまくいってないものを、過程だけ残しておく

試したこと1. Mac 標準の python3 でやる

1. 切り替え

  • 標準で入ってる Python なら動作するようなので、venv で 標準 Python の環境に切り替える
bash
/usr/bin/python3 -m venv system-3.9.3
. ~/python-venvs/system-3.9.3/bin/activate

※ フルパスで呼べば良いだけかもしれないけど・・

動作確認

py
python -m tkinter

→ 🙆 最小限のボタンのついたUIが立ち上がる

→ 🙅 ただし廃止予定らしい

log
DEPRECATION WARNING: The system version of Tk is deprecated and may be removed in a future release. Please don't rely on it. Set TK_SILENCE_DEPRECATION=1 to suppress this warning.

→ 🙅 サンプルアプリも、ウィンドウは出るが ボタン等は出なかった

試したこと2. tkl-tk オプションありでビルドした

事前準備. pyenv を入れる

bash
brew install pyenv
.zshrc
# pyenv の初期化
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
sh
. ~/.zshrc

tkl-tk 用のオプションありで configure / build

ビルドに使う環境変数設定に環境変数を設定

bash
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"

tkl-tk のバージョン確認

bash
ls -l $(brew --prefix tcl-tk)

→ 9.0.1 だった ので、ビルド時は 9.0 を設定

ビルド ( configure, build )

bash
env 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'" \
pyenv install 3.11.9

~/.pyenv/versions/3.11.9 に作られる

ビルドして作成された Python に切り替え

bash
pyenv global 3.11.9

. ~/.zshrc # ← 注: ここに 強制的に venv activate するようなコマンドが入ってないことは前提

バージョン確認

bash
which python               # ~/.pyenv/shims/python
python -V # Python 3.11.9
otool -L ~/.pyenv/versions/3.11.9/bin/python3 # ここに tk のライブラリが出ることを期待したが、出ない

以下のように出るのは、shims にあるバイナリは wrapper 的なファイルだから。(シンボリックリンクではない)

bash
otool -L $(which python3)  # ~/.pyenv/shims/python3: is not an object file
bash
python3 -m venv ~/python-venvs/gui-test
. ~/python-venvs/gui-test/bin/activate

# GUI 出るか確認
python -m tkinter

→ 出ない