【Python】tkinterのアップデート失敗した備忘録【インポートエラー】

Programming Memo
スポンサーリンク

本記事では、Macでpython学習をしている時にtkinterのバグを直そうとして、tkinterのバージョンを8.5から8.6にするアップデートを失敗し、tkinter自体使えなくなってしまったので、修復までの過程を備忘録としてアウトプットします。

私自身色々調べ、同じような症状が多く出ておりたくさんの人が解決法を出してくれてはいました。
しかし、初心者にはなかなか難しいものが多かったので、圧倒的に細かく記していきます。

起きた症状
  • tkinterでの表示バグ(文字やアイコンが見えない)
  • tkinterのバージョンアップによるインポートエラー(ImportError: No module named ‘_tkinter’)
解決した方法
  • tcl-tkのアップデート
  • パスを調整してあげる

macOSではtkinterのバージョンが8.5の時に文字やアイコンが反映されないという、GUI機能として割と致命的な不具合があったそうです。
tkinterのバージョン8.6ではその不具合が直っているとのことでアップデートしてみたら、No module named ‘_tkinter’とのことで、あの手この手で修復しました。

スポンサーリンク

使用環境

  • MacBook Pro 13 inch(2018)
  • macOS Mojave 10.14.6
  • pythonはpyenvにてバージョン管理
  • VScode

具体的な環境構築は過去記事を参照

tkinterの不具合について

過去記事で下記のようなデータの解析補助ツールの作成をアウトプットしました。

このデータ解析補助ツールのパワーアップのため、tkinterというGUIツールを使う勉強をしていたところ、下記の図のように文字やボタンが見えない不具合が出ておりました。

$ python -m tkinterと実行してみたところ

どうも、macOSとtkinterのバージョン(8.5)の相性がよくないそうです。
tkinterを使う時に、ttkを用いることでなんとか辻褄を合わせていましたが、やはり不便なところが多く、そもそもGUIで文字やボタンが表示されないのは致命的。

ということで、アップデートして直してやろうということで早速取り組みました。

tkinterのアップデートに失敗した

tkinterをアップデートする方法として下記の方法を試してみました。

・PythonのTkinterを8.6にアップデートする方法、Qiita
https://qiita.com/person0/items/4a8d4bf490510e8f71ab

tkinterだけを公式にアップデートする方法は無いとのことで、Homebrewを使ってアップデートします。

# pythonのアンインストール
$ pyenv uninstall ◯.◯.◯

※ ◯.◯.◯はpythonのバージョン番号。python3.7.0を使っている人はpyenv uninstall 3.7.0

上記のコマンドを実行すると「本当にアンインストールしますか?」と聞かれるので、「y」とか「yes」と入力するとアンインストールが実行されます。

# Tkinterのアンインストール
$ brew uninstall tcl-tk

という感じで一度アンインストールをしました。

というところまではよかったのですが、この後の「python-with-tcl.rb」のダウンロードや、ファイルの置き換えの工程が理解できず挫折しました。
そこで元に戻そうと、アンインストールしたものを元に戻そうと、

$ brew install tcl-tk
$ pyenv install ◯.◯.◯

と実行しました。
そして、import tkinterとtkinterをインポートしたところ、

「ImportError: No module named ‘_tkinter’」

という「tkinterというモジュールはありませんよ」というエラーメッセージが登場してしまったわけです。

完全にやらかしてしまいましたね。
こうならないように、何かする時はちゃんと全て目を通して、できそうかどうかとバックアップは取っておきましょう。

スポンサーリンク

tkinterのインポートエラーとの格闘

まず取り掛かったのは現状の把握。

$ brew info tcl-tk

と入力すると、tcl-tkのバージョンは8.6であると表示されていました。
つまり、アンインストール→インストールの段階でアップデートはされているとのこと。
また、pyenvで管理している他バージョン(アンインストールしてないやつ)に切り替えるとtkinterは以前と同様に動いている。(ただし8.5のバージョンで不具合あり)
ということで、おそらくパスの問題なのでは無いか?と考えてやっていきました。

まず参考にしたのは下記の記事。

・Macintoshでtcl/tk そのままでも動くのに罠5つに嵌った、Qiita
https://qiita.com/kaizen_nagoya/items/0bebb8e5a757a7d1b9f2

$ printenv

でtcl-tkにパスが通っていないことを確認し、

$ echo 'export PATH="/usr/local/opt/tcl-tk/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

によってパスを追加するというもの。

実際にやってみて確かにパスは追加されていましたが、結局「ImportError: No module named ‘_tkinter’」は変わらず。

tkinterの修復及びアップデート

最終的にたどり着いたのが下記の記事でした。

・pyenv が homebrew でインストールした tcl-tk と動かない。Qiita
https://qiita.com/survivor7777777/items/5a8e23d30822437ae9f9

・pyenv install doesn’t work with homebrew installed tcl-tk、github
https://github.com/pyenv/pyenv/issues/1375

上記の記事では

/usr/local/Cellar/pyenv/VERSION/plugins/python-build/bin/python-build

を修正してpythonを再インストールしたら直ったとのことです。
私もこの方法で直りましたが、上記のことを理解するのに初心者すぎて手間取ったので、より細かく記していきます。

目的のファイルまでのアクセス方法

上記で

/usr/local/Cellar/pyenv/VERSION/plugins/python-build/bin/python-build

を修正と書いてありますが、そもそもそこへのアクセスの仕方がわかりませんでした。

/usr/local/Cellar/pyenv/VERSION/plugins/python-build/binという場所にあるpython-buildというファイルというのはわかるのですが、「python-build」とファイル検索しても出てこない。

隠しファイル表示しても出てこない。
さてどうするか。ということで調べると下記の記事がありました。

/usr/local/を開く方法(mac)、Qiita
https://qiita.com/DarkLight_0/items/d257d4b8f27ad670f40d

上記記事によると、/usr/local/というのは通常のFinderからはアクセスできないそうです。
開くには「shift + command + G」で目的のフォルダの場所を入力すると出てきます。

  • shift + command + G
  • /usr/local/Cellar/pyenv/VERSION(pyenvのバージョン番号)/plugins/python-build/bin/

※pyenvのバージョン番号わからなかったら$ pyenv –versionと入力して調べるか、/usr/local/Cellar/pyenv/まで入力して、あとは階層を探っていくかをします。

上記の方法で修正すべき

/usr/local/Cellar/pyenv/VERSION/plugins/python-build/bin/python-build

に辿り着ことができました。
不安な人はこのファイルを変更する前に、コピーして他の場所にバックアップとして保存しておくと良いかもしれません。

python-buildの修正

この「python-build」をVScodeで開き修正をします。
python-buildの約770行目ぐらいの場所に下記のような記述があります。

$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 uninstall ◯.◯.◯
$ pyenv install ◯.◯.◯

pythonを再インストールしたら、

$ pyenv global ◯.◯.◯

と入力し、再インストールしたpythonを使用する設定にします。
そしてtkinterの確認のための下記のコマンドを実行すると

$ python -m tkinter

下図のように無事にtkinterのウィンドウが出てきて、かつバージョンも8.6になっており、なにより文字やボタンがちゃんと見えるようになっていました。

まとめ

以上、Pythonでtkinterのアップデート失敗して使えなくなった備忘録のアウトプットでした。

python学習をしていて環境面で手こずることがかなり多く、プログラミングは環境を作るのが半分ぐらい占めているのでは?と思ってしまう今日この頃です。
不具合や失敗を修正するために必死で悩んで考えて取り組むときが、最も成長しているように感じるので今回の失敗も糧になったのでは無いでしょうか。

パワーアップして直ったpythonを使ってこれからも学習をしていきます。

コメント

タイトルとURLをコピーしました