1. 問題の核心部分(Pythonしか使わない場合、こちらのみ閲覧で十分)
- Windowsで複数Pythonを切り替えて使う場合、Python仮想環境を利用します。私の場合Pipenvを使っていますが、Windows標準のインストールに頼る場合
-
主たるPython(最新版)インストール時にはフルセットでインストールしても、バージョンの古い版の追加インストール時には「Python本体だけで良くね?」と最小版にしたくなる。
で、嵌りました。 - TkinterはPythonで「標準ライブラリ」に分類 されており、普通に入っていると思ってチェックを怠っていました。
-
追加インストール時には、必ず下記のように「td/tk and IDLE」にチェック入れないと、「標準ライブラリ」としては使えません。後からPipなどでインストールしようとすると、怪しげなソフトや、全く異なるライブラリを入れる羽目に陥ります。
- (追加)インストール時にチェックしなかったとしても、Windwosで
「インストールされてるアプリ」で一覧表示
⇒ 該当Pythonの「オプション・修正」に入り
⇒ 上記の図のように「td/tk and IDLE」にチェックを入れなおして「Next」
すれば修正インストールされます。
2. 「Python Tkinter pip インストール」にてネット検索して見つけたものは、ことごとく罠だった。
-
pip install tk
--- TensorKitであり、Tcl/Tkとは無関係 ==> pypi/tk
Stack Overflowでの誤った記事へのコメント参照#1 -
pip3 install pytk
--- ラッパーであり本体をインストールしない ==> pypi/pytk
Stack Overflowでの誤った記事へのコメント参照#2
3. pipでTkinter(tkinter)はインストールできない(しようとしてはダメ)
- こちらに背景事情を含めて詳しく記載があります。
- WARNING: Do not use pip to try to solve the problem
4. そもそもの始まり
- Juliaにてグラフ描画環境は非常に複雑で、結果的にPython使っているならmatplotlibを利用するのが良いと思います。しかしながら、Juliaは別途Pythonを含めcondaとかmatplotlibとかをインストールしてしまうので、既に構築済みの仮想環境のPythonとmatplotlibを使うことにしました。
- 参考にした資料類
Juliaから仮想環境Pythonを利用する in VSCode(Shingo Nakazawa)
プログラミング/julia/グラフの書き方(武内修@筑波大)
Julia早引きノート[23]JuliaでのMatplotlibによるグラフ描画(Tetsuro Tabata))
5. 途中まで正常動作するのに最終的に描画されない!!
- 複数のplot関連の関数呼び出しや処理過程では、全くエラーも表示されずにスムーズに進み、最終の描画段階で下記のようなエラーが表示されました。
"sys:1: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown" - 2台目へのJuliaインストール実行であり、Python環境をJulia専用にインストールした1台目では問題なく動作していました。今回新たに試みた仮想環境内のPythonとの連携に関わる手順のどこかがおかしいのだろうと思い、問題の切り分けのため、設定関連を再度トレースしましたが、(この時点では)原因が不明となりました。
Copilotに問い合わせるとバックエンドを変更する案
cng_bkend_to_TkAgg.jl
using PyPlot
matplotlib.use("TkAgg")
とか、図としてセーブする案
save_as_fig.jl
using PyPlot
plot(rand(10))
savefig("figure.png")
を出してきました。
- バックエンドを変更する方法でも、図としてセーブする方も正常動作したので、Juliaが有しているか仮想環境内のPythonが有しているtk関連の「バックエンド」の問題であることが確認されました。
- tkinter関連のインストールでネット検索すると、「tkinter」、「pytk」、「tkdev」などのpipインストール記事が引っ掛かるのですが、どれも数件レベルと件数が少なく、PyPIサイトで検索するとよく似た名前のライブラリが大量にあるという不思議な現象に遭遇し、手詰まりとなりました。
- 最終手段として、ダメ元でCopilotに聞いてみました。
私:「python でtkinterをインストールする場合、pip install pytkなのか、pip install dkdevなのか?」
Copilt:「Pythonでtkinterをインストールする場合、正しいコマンドはpip install tkです」
と予想外の回答でした。 - Copilotが提示したのは「2」の [Stack Overflowでの誤った記事へのコメント参照#1] であり、「誤った記事内容」に基づいた提示でした。
6. その後・・・
- Copiltとのやり取り続き
私:「pip install tk でインストールされるのはtensorkitです。他に方法はありませんか?」
Copilt:「Windowsの場合: Windowsでは、Pythonのインストーラーを使用してtkinterをインストールすることができます。Pythonのインストーラーを再実行し、「Modify」を選択し、「tcl/tk and IDLE」をチェックしてインストールします。」
で、結果的に「1」へと戻ることになりました。
7. 追記(2024/09/23 12:00)
- VS-Code内にてjupyter形式(拡張子:「.ipynb」)で実行すると、tkinterがバックエンドの場合に動作する場合と動作しない場合(同じエラーが出る)があり、不安定でした。Copilot提示のバックエンドを「TkAgg」にすると安定して動作します。
- REPL(read-eval-print-loop)ではtkinterがバックエンドで問題なく動作しています。
8. まとめ・注意事項
根本的な事項
- tkinterが「標準ライブラリ」なので、pipでもインストール可能だと思い込んでいた(← 間違い)
- matplotlib単体で描画機能まで内臓していると思い込んでいた(← 間違い:tk関連などのバックエンドが必要)
- pip関連を含めPython回りのモジュールには危険なものもあるので注意必要(← こちらは情報を得ていたのと、今回は状況から「おかしい」と思って慎重に対応し、結果的に正解にたどり着いた)
- Copilotを含め、生成AIが間違った情報を出してくる場面に実際に遭遇し、予想外の回答に驚きつつ、それが「間違いである」ことを理解するまでの間、正しいのか?と思うところを完全には捨てきれなかった。
- JuliaにしてもPythonにしても開発環境整備には手間暇が掛かりますが、セキュリティ重視の環境整備においては必須の事項でもあり、このような記事が増えることを願っています。