PySimpleGUIの概要とできないことがわかった(PythonのGUIが簡素な理由)
色々触って調べた2024年6月22日現在のPySimpleGUIに関する情報。できることとできないことなど。またPySimpleGUIは基本はTkinterのラッピングだがPySide6とPySimpleGUIQtという2つのパッケージをインストールするとPySide6もラッピングできる。そちらも試した結果。
いつも長くなりすぎるので今回は短めに書く予定。
(約 3,800文字の記事です。)
PySimpleGUIでできること
とにかく簡単にボタンやWindowが作れる点。圧倒的なコードのシンプルさ。そこが魅力。逆に言うとそこに全振りしたGUIパッケージ。
また公式ドキュメントの丁寧さがものすごい。サンプルコードも300種類以上と豊富。またStack Overflowや公式サポートであるGitHubのスレッドなど、開発情報は盛りだくさん。なので基本的に調べれば何とでもなる。これがPySimpleGUIの強み。
だが残念なことに、PySimpleGUIではできないこともまたかなり見つかった。というのもシンプルさのトレードオフとして次のできないことが結構見つかった。+アルファで「Tkinter起因のバグ=PySimpleGUIでは今は対処保留中」の症状も見つかった。
PySimpleGUIでできないこと
結構あるのだが長く書くとだるいと思うので箇条書で。
OKボタン付きダイアログのボタン上にフォーカスがない(Tkinter 8.6.9までは正常。それ以降の現在の8.6.12ではデフォルトでフォーカスがない。focus=Trueが無視される。ユーザーが初回にTABキーを1回押す必要がある。The だるい。)
Tkinter 8.6.9はWindows版の場合はPython 3.8のみ。それ以降では8.6.12以降が入っている。なおPython 3.8はかなりオワコン。
PySide6のラッピング版のPySimpleGUIQtでも、ダイアログによっては①の症状は変わらず。
TABキーでフォーカス指定後、矢印キーでフォーカスを動かせない。Windowsアプリなら当たり前のことができない。(改造すれば可、もはやシンプルとは言えない)
同様にEnterキーでボタン押下できない。(改造すれば可、もはやシンプルとは言えない)
PySimpleGUIに限らず純正PySide6でもEnterキーでは押下できない。代わりにスペースキーで押下できる。これはどうやらPythonでGUIを実現するとデフォルトでスペースキー押下が必須らしい。Windowsとの違い。
PySimpleGUIではデフォルトではボタンにホットキーを割り当てできない(多分改造すればできそうだが、もはやシンプルとは言えない)
結局PySimpleGUIはミニツールとしてのGUIを詰め込んだWindowダイアログが限界といったところ。なのでその程度でいいGUIアプリであればPySimpleGUIはかなり使いやすいと思う。
PySide6をチュートリアルでざっとテストしたが
PySimpleGUIの限界に不満を感じたのでせっかくなのでPySide6も入れたことだしWeb上でチュートリアルサイトを幾つか見つけて試してみた。PySideは確かに細かいところまで作り込み可能だ。例えばWordやエクセルというような大がかりなGUIアプリを作るなら必須だと感じた。ウィンドウ直下にツールバー、ツール名を押して各種メニューバー、各項目を選んでさらにウィンドウが開く、というような、一般的なWindowsアプリを実装するならPySide6になると思う。
またPySide6ではダイアログもほぼWindowsアプリのそれと一緒。OKやCancelダイアログでも普通にデフォルトフォーカスを指定できて矢印キーで移動できる。ただしEnterでボタン押下はできずスペースキーなら普通にいけた(Yes/No/CancelダイアログはEnterいける)。なのでどうやらPythonでGUIを作るとEnterキーはちょっと特別なキーらしく、Spaceキーがボタン押下用と考えられているっぽい。(恐らくは改造すればいけるのだろうが、知らん)
ただしPySide6、事前情報通り、かなりの学習量が必要。もはやGUI学といえるほどの前提知識が必要で、簡単に実装出来そうもない。ソースコードと実際のWindowGUIまでの距離が遠すぎる。サクッと実装、という感じではない。ガチの商用アプリを作るなら必要だろうが、ミニツール程度のGUIにPySide6はオーバースペックだと感じた。
ただしホットキーの割り当てなど、WindowsアプリとしてのGUIでできることは一通りできると感じた。だがミニツール程度のGUIに対して学習量があまりにも膨大だと感じた。そこまでして実装したGUIがボタン数個だけとか、結構残念な結果になる。
キーボードを用いたGUI制御はかなりハードルが高い
結局、マウス操作ができるという意味でのGUIでいいならばPySimpleGUIが一番楽。ただしホットキー操作という「GUIをキーボードで操作しようとする」とPySide6でガチ実装しないと無理。
結局、GUIをマウスでなくてキーボード操作って、GUI+CUIのようなハイブリッドな実装は、どうやらPythonにはかなり荷が重いと感じた。C++出身のPyQt, PySide6なら出来なくもないが、という印象。そこまでするならC#やC++で最初からWindows流の言語を使った方がいい気もする。それくらいGUIは深いものだった。
PythonのGUIはマウス主体に限定(or TAB, Space縛り)
結局色々調べて試行錯誤して2日かけて出した結論。PySimpleGUIでマウス操作のみのGUIでいいや、と。あとはTAB, Spaceキーをつかっておくれ、と。もう矢印キー操作やEnterキーでのボタン押下にこだわると、PySimpleGUIまったくシンプルに実装できなくなる。そうなるとPySimpleGUIのメリットが減る。またそれらは確かにユーザービリティーに関わるが、アプリの機能そのものにはまったく影響を与えない。使い勝手向上は最後の最後、安定版リリースごとのマイナーアプデでも十分だろう。なのでサクッとGUIを実装できることを最優先とし、PySimpleGUIで行くことにした。
フォーカスにこだわってTkinter 8.6.9とPython 3.8を使うのは愚策
TkinterのボタンにデフォルトでフォーカスがあるTkinter 8.6.9を使いたいがためにPython 3.8に縛るのも愚策だと思う。なのでもうフォーカスは諦めて、必要なら各自TABキーとSpaceキーを使ってくれ、という仕様にして、Python 3.10で開発することにした。Tkinter 8.6.12になる。将来のアプデでTkinterのバグが直るかどうか不明なので期待しないで待とう。あるいはPySimpleGUIがアプデで対応するかも知れないが、期待しないで待とう。
PythonのGUIはショボいのが仕様です
もう質実剛健、機能に支障がなければ多少の見た目の地味さは気にするな、という感じだ。それだけGUIは深い。まったくシンプルじゃない。もともとCUIベースの言語をGUIで扱うことの代償だ。マルチプラットフォームの代償とも言える。Windows専用言語ではないためだ。
なのでまずは見た目はショボくても妥協することにした。ないよりはマシ。それよりもサクッと直感的に実装できることを優先した。
そして大規模開発が必要になるまではPySide6はお蔵入りで十分だと思った。まずはPySimpleGUIで何とか事足りそうだという印象。まぁ中身がTkinterなのでTkinterラッパーなのがPySimpleGUIの正体なので。
色んな犠牲を払ってシンプルさに全振りしてTkinterを使おうとしたのがPySimpleGUIだったと言うことが分かった。(細かい制御をしていない場合に限り、1行でPySimpleGUIQtに切り替え可能だがフォントサイズが小さくなる上にあまりメリットを感じない。矢印キーでフォーカスが動くようになるくらい?相変わらずEnterではなくてSpaceでボタン押下だけど)
それでもPythonを使いたい理由
一つはBlenderアドオン開発がPythonという点。もう一つは何となくPython自体の持つ魅力があるため。他の言語とは違って、まだ何となくだがPythonがいい気がしている。単なる勘だ。だが長く付き合うプログラミング言語としてPythonになじんでおきたい、そんな思いがある。単なる勘だが。なので今回は色々妥協しても簡単に実装できるPySimpleGUIを採用して前に進むことにした。
さて問題は「それらを駆使して何をやりたいか」が、どんどんぼやけてきて、だんだん霧のようになってきた点😭手段と目的が逆転してしまって、目的が霧散してしまった……。
何をしたかったんだっけ?私は……。
今回の創作活動は約1時間15分(累積 約3,848時間)
(1,100回目のnote更新)
読んでくれてありがとう。気長にマイペースに書いてます。この出会いに感謝😊