PythonでWindowsのシンプルなGUIでいいならTkinterがいいね
Tkinter, 読み:ティー・ケー・インター。ティー・キンターじゃない。
Zbrushプラグインで作りたかったGUI周りのアルファ版が今日、あっさり3時間で完成。とりあえずこれで、今回作りたかったすべての課題はクリアした。理想を現実のプラグインとして具現化できた。実は既にもう満足😍
(約 3,000文字の記事です。)
プログラムは設計が大事。コーディングは単純作業
これは間違いないと感じた。昨今ではAIがソースコードを書いてくれる。なので重要なのはコードをプチプチ作ることではなくて、全体を俯瞰して全体を常に把握できるような「設計手法」これが重要だと感じた。
というのも最初にこのプラグインの肝となるエンジンは作るのに140時間くらいかかった。まぁPythonやらAutoHotkeyやらPyCharmやらVS Codeやら全部ゼロスタートだったから仕方がない。そしてスパゲッティー・ソースコードになりながらもようやく仕様が仕様通りに動いた😱
そしてそこから5日かけてリファクタリング。設計とコード、関数の相互関係の見直し。そしてとても重要だったのが論理構成を設計するための設計図、当時はマインドマップを使っていたが、それは確かにZscript単体では効いたが今回はPython+AutoHotkey+Zscript。普通の使い方だと論理設計段階でスパゲッティーだった。
なので色々試行錯誤して、
何とかマインドマップでもスッキリ見通せて
3者を使い分けられて
3者の関連性をスパッと可視化できる方法
に辿り着いた。
詳細は伏せるが、色で見るだけでも各部の関わりがスッキリ分かるだろう。
コード全体の可視化ができれば、あとは早い
全体設計の可視化ができてみればあとは早かった。どこがムダだったか、冗長だったか。設計したのに1回しか使われなかった仕組みだったり、似た処理を三者三様で処理してぐちゃぐちゃパスタになっていたり。
そういうムダをそぎ落とすためにも、プログラムの各関数の可視化、相互関連の状態の見える化が効いた。
そしてスッキリと仕上がったエンジンを使って、今日はGUIで複数パターンの実装。と言っても同じような組み合わせが9組実装されるだけなので、バグテストが1回OKなら全部OKという仕組み。ループ回すと1つがOKなら全部OKだ。(ループに関しては境界条件付近を念入りにチェックだけどね。今回はそれはない。)
要するにエンジンは「とある作業」を1組のボタンで完結できた。今回のGUIはではそれを9組もストックできるという、ただそれだけ。
まぁ、よくあるVBっぽいWindowsアプリの見た目だね。うん。
一周回ってTkinterを使っています
当初はAutoHotkeyでGUI周りをやらせようと思ったのだが、ボタンによって処理が変わる場合、AutoHotkeyで実装すると条件分岐や内部処理がPythonでできない、あるいはAutoHotkey v2言語で全部処理しないといけなくなることが判明。
結局、GUIとボタン操作による内部処理もPythonで完結させる必要が出てきた。というかシンプルな「OKダイアログ」以外は、AutoHotkeyとPythonの連携はかなり厳しい。
Tkinterは知ってはいたがコーディングが面倒臭い。なので当初はかなりガチでPySimpleGUIを検討したがこのラッパーにはバグがあってTkinterのフォーカスをキーボード操作でできないという致命傷。なのでTkinterは諦めていたのだが、ここで復活。
そう、ChatGPTにレイアウトを伝えてコードはChatGPTにお願いした。あとはバグがないような挙動になっているか試しただけ。The 丸投げ。
純正Tkinterならば普通にキーボード操作でボタンフォーカスが動くし、Enter, Spaceキーでボタン押下できる。なんだ、普通にできるじゃないか!と思った。つまりはPySimpleGUI、お前が悪い💢ラッパーのバグだったわけよ。いくら使い心地がシンプルでも本家の性能を引き出せないなら、粗悪なツールだと思う。なので却下。ChatGPTに聞きながらTkinterを実装した方がマシ。
何とかPythonでGUIを扱いたい
Tkinterの見た目とかではなくて、当時NGを出したのはまさかPySimpleGUIのバグだとは思わず、PySimpleGUI経由でTkinterを使うとキーボードでボタンのフォーカス操作をまともにできなかったため。だが実際にはできた。なので評価が一変。ツールとしてまともに使えるのであれば当然使う。なので純正Tkinterは採用!に戻ってきた。逆にPySimpleGUIはさようならだ。2024年初頭に有料ツールにになったのにこれでは、おそらく先が短い。お粗末すぎる。
そしてコードの複雑さはChatGPTに任せることで回避できるなら、結局一周回って堅いTkinterが鉄板という結果に。シンプルなGUIでよくてPythonとしっかり連携できるなら文句はない。PySide6はもう少し後で学ぼうと思っている。まだChatGPTに聞いてTkinterで実装できる程度の簡素なGUIならば、Tkinterで行こうと思う。
やっぱりPythonは楽しい。
AutoHotkeyはVS CodeでIDE環境を整えると途端に楽しい。それに他者製Windowsアプリの自動操作にはさすがのPythonでも苦手分野なので、そこでAutoHotkeyは大活躍する。とはいえ、色々と不安定な部分もあって「理屈が理屈通り動かない罠」にハマりまくって困ったが。まぁZscriptほどではないが、プログラミングしていて「論理的に正しいのになぜかその通りに動かないバグ」ってのが一番ストレスだ。ここが強敵だ。その点Pythonはそれが少ない。(Pythonに限らないと思うが)
そしてコーディングしていて美しいというか実装に魅力を感じるのはPython。慣れるとカッコがなくてインデントだけでいいのは楽。適当で曖昧を許容しつつ堅く動かせる柔軟性。イマドキの言語だと思う。
つまりPythonが好きってことよ😍
今日は成果が出て一段落したので羽を伸ばしま~す。
今回の創作活動は約45分(累積 約3,874時間)
(1,122回目のnote更新)