PySimpleGUI 技術関連ニュース
(github.com/PySimpleGUI)- PySimpleGUIは商用化の試みを終えた後、PySimpleGUI 5のコードからライセンスとセキュリティコンポーネントを削除し、GitHubとPyPIでLGPL3ライセンスのPySimpleGUI 6として再公開された
- 最新版は
python -m pip install PySimpleGUIでインストールでき、旧バージョン4.60.5.1やGitHubのmaster、特定リリース6.1もpipで直接インストール可能 - PySimpleGUIはtkinterなどのGUIライブラリのラッパーで、GUI SDKをよりシンプルで圧縮された構造に変えつつ細かなカスタマイズを提供し、事前のGUIプログラミング経験は不要だと紹介されている
- バージョン6.2には、
Window.settings_saveのバグ修正、Multilineでの画像インライン出力、psgupgrade、Treeノードのプログラムによる選択、Window.start_timerの"H:M:S"文字列タイマー、Frameの枠線色設定などが含まれる - プロジェクトはプルリクエストを受け付けない方式で維持されており、長期的な将来は不透明だが、作者はコードを書き、エコシステムを整理し続ける意向を示している
PySimpleGUI 6の再オープンソース化
- PySimpleGUIは商用化を試みたが、期待した水準でプロジェクトを継続するために必要なリソースを生み出せなかった
- 2025年2月にPySimpleSoftの終了と2025年末までのサポート継続が発表され、その後、コード・ドキュメント・リポジトリをどうするかが残された課題だった
- PySimpleGUI 5のコードはライセンスとセキュリティコンポーネントを削除したうえでGitHubとPyPIに公開された
- 新たに公開されたバージョンはLGPL3ライセンスを使用する
- Udemy講座はしばらく無料で提供され、クーポンコードは
033334A16163C571B739
インストール方法
- PyPIの最新版v6をインストール:
python -m pip install PySimpleGUI
- 旧バージョン
4.60.5.1をインストール:python -m pip install PySimpleGUI==4.60.5.1
- GitHubリポジトリの最新コードは直接インストールできる:
python -m pip install --upgrade https://github.com/PySimpleGUI/PySimpleGUI/zipball/master
- GitHubの特定リリースをインストールするには、
masterをリリース番号に置き換える:python -m pip install --upgrade https://github.com/PySimpleGUI/PySimpleGUI/zipball/6.1
- リポジトリをクローンまたはダウンロードした後、ローカルインストールも可能:
python -m pip install .
PySimpleGUIの役割
- PySimpleGUIはtkinterや他のGUIライブラリを包むラッパー
- GUI SDKをよりシンプルで圧縮された構造に変えつつ、細かなカスタマイズも提供する
- 事前のGUIプログラミング経験は不要だと紹介されている
- READMEの例では、
Text、Input、Button、Window、イベントループ、window.read()、window.close()だけで対話型ウィンドウアプリを構成する - ドキュメントはDocs.PySimpleGUI.comで提供されている
開発方式と長期的展望
- PySimpleGUIは従来のオープンソースプロジェクトよりも、プロプライエタリ製品に近い方式で開発されてきたと説明されている
- プルリクエストは受け付けていない
- 長期的な将来は明確ではないが、現在作者はコードを書き、手助けすることを楽しんでいる
- PySimpleGUIでの経験は、人々が作った成果物を見ることができた「once-in-a-lifetime」の経験だったと表現されている
バージョン6.2の機能と修正
- 6.2には
Window.settings_saveのバグ修正が含まれる - Multiline要素で画像をインラインに“print”する機能が追加された
- 最新のメンテナンスリリースへアップグレードする機能が、再びPySimpleGUIに組み込まれた
- Home Windowまたはコマンドラインの
psgupgradeを使用できる - リリースノートを確認し、新しいバージョンをインストールできる
- Home Windowまたはコマンドラインの
Graphイベントがwrite_event_valueイベントを受け取ると無限ループに入っていた#5750のバグが修正された- リアルタイムボタンフラグをクリアする方式で修正された
- 変更範囲はGraph要素の条件文に限定されており、リグレッションの可能性は小さいと記されている
Tree.updateにselect_node_keysパラメータが追加され、ツリーノードをユーザーが選択したかのようにプログラムから選択できるようになった- Multilineの
echo_stdout_stderr機能とパラメータが修正された- stdoutまたはstderrを該当要素へリルートした場合にのみechoする
- この機能自体が直接リルートを実行するわけではない
- #6686の修正により、Calendar chooserボタンが
window.readの戻り時点でのみクリアすべきフィールドをクリアしていた問題が解決された - Home Windowにメンテナンスリリースのバージョン番号が表示され、インストールボタンの位置が移動された
Window.start_timer呼び出し時に"H:M:S"文字列でタイマーを指定できる- スクロール可能なColumn要素に、水平スクロールのみをサポートする機能が追加された
- Frame要素には
border_color、border_width_no_reliefパラメータが追加され、枠線の色を設定できる- Frameの枠線色は別途設定がなければ、テキスト要素の色をデフォルトとして使用する
- ドキュメントのcall referenceセクションは6.2リリースに合わせて更新された
ドラッグ&ドロップと周辺プロジェクト
- ドラッグ&ドロップは長らく望まれていた機能で、PySimpleGUIのコードを変更せずユーザーコード空間で実装する方法が見つかったと説明されている
psgdndはPySimpleGUIにドラッグ&ドロップを追加する新しいパッケージ- pipでインストールして使用できる
- 詳細情報と例は該当リポジトリにある
psgdnd6.0.1はPyPIでリリースされ、Windowsで動作する- GitHubの6.0.2にはLinuxで必要だった修正が含まれる
- Mac対応状況はまだ不明
PSGMicroPythonリポジトリには、MicroPythonベースのマイクロコントローラとインターフェースするコードが追加された- Raspberry Pi PicoとESP32で動作する
- 他のボードでも動作する可能性がある
- 堅牢なものや大規模プロジェクトとして意図されたものではなく、有用かもしれないコードとして紹介されている
PSGWebプロトタイプ
- PSGWebはPySimpleGUIをブラウザウィンドウで実行するプロトタイプ
- ほとんどのデモプログラムで動作する
- GitHub上のPySimpleGUIアプリケーションURLの前に
psgweb.usを付けると、実行を試すことができる - PSGWebはより大きなPSG 5作業の一部として作られたが、公開されなかった
- このプロトタイプをリリースまたは拡張する計画はない
AI利用に対する立場
- 作者はLLMをドキュメント検索と要約、エラー検索、調査、知識獲得に使用している
- LLMでコードは書いていない
- 理由は単純に、コードを書くこと自体が好きだからだと明かしている
- プロジェクトをプルリクエストに開放しなかったのも、他人にコードを書いてもらうより自分でコードを書きたかったためだと説明している
- PySimpleGUIがAI時代にも関連性を持つかについては、毎日人々がPySimpleGUIを見つけてインストールし、少なくとも1人が使っているだけで十分だと考えている
- 作者はWindowsアプリを作るとき、PySimpleGUIなしでは想像しにくいと述べている
- 最近の6502ブレッドボードコンピュータ作業で、2台のRaspberry Pi PicoとPySimpleGUIアプリを使ってバスアナライザを作ったと説明している
- Windowsでツールを制御するフロントエンドアプリをPySimpleGUIで簡単に作れたという
プロジェクトの歴史と資金問題
- PySimpleGUIは2018年、メディアプレーヤーのプロトタイプ用GUIが必要だったために作られた一回限りのコードから始まった
- 目標は、オブジェクト指向GUIフレームワークの経験がなくても、Tkinterをより線形で直感的な方法で包み、すばやく動くようにすることだった
- 作者はPythonやオープンソースの経験がないままGitHubに公開し、従来のオープンソースプロジェクトよりもスタートアップのように取り組んだ
- タイムライン:
- 2018年7月: Version 1
- 2019年6月: Version 4
- 2020年1月: 資金問題が主な懸念となり、商用化が言及された
- 2020年11月: Udemy講座の発表と公開での支援依頼を追加
- 2021年12月: 講座リリース
- 2024年2月: Version 5商用リリース
- 2026年4月: Version 6
- GitHubのAnnouncements Issueは、プロジェクト記録を残すブログのように使われ、1,700件を超える項目に増えた
- 読みやすくするため、ドキュメントのAnnouncements 2018-2024タブにスナップショットが掲載された
- フルタイムのオープンソース作業は、即時かつ継続的な金銭的プレッシャーを生んだ
- スポンサーと寄付はGitHub Sponsors、Buy Me a Coffeeを通じ、ピーク時でも月約150ドル程度だった
- 61レッスン、11.5時間分のUdemy講座は初期に一時、月約2,000ドルまで達したが、その後100ドル未満に落ちた
- どちらの方式もプロジェクトを長期的に維持するには十分ではなかった
商用化の結果とライセンス経験
- Version 5の有料製品リリースは突然の決定ではなく、READMEと告知で何年にもわたり公開で議論されてきた
- 2024年初めに他の選択肢を使い果たした後、商用版がリリースされた
- 目標は障壁を作ることではなく、アクセスしやすさを維持することだった
- 財務的な持続可能性という基準ではうまくいかなかったが、経験・学習・関係という基準では価値があったとまとめられている
- 商用化後もほとんどのユーザーを失ったわけではなく、多くの企業が引き続きPySimpleGUIを使用している
- 問題は、企業にライセンスを購入してもらうことだった
- 趣味ユーザーと学生は無料で使用し、企業は費用を支払うHobbyist Licenseが選ばれた
- 実際には大多数のユーザーが自分を趣味ユーザーだと識別した
- 数万人の企業ユーザーが無料ティアに登録し、大企業でも数百人のユーザーがいながら有料ライセンスは少数というケースは珍しくなかった
- 無料オプションを提供した決定自体は後悔していないと明かしている
- 個人的な結論は、Pythonツールとライブラリは無料であるべきだという文化的期待が強いということ
- 価格や不満が核心的な問題だったようには見えず、人々はPySimpleGUIを使い続けたが、費用を支払う義務は感じなかったと解釈している
- 明確なライセンス条件も、常に行動を変えられるわけではなかった
現在のライセンス
- 著作権表記は
Copyright 2018-2026 PySimpleGUI. All rights reserved. - 現在のライセンスはLGPL3
1件のコメント
Hacker News の意見
仕事で Jira に作業時間を記録しなければならなかったのですが、Webサイトを開きっぱなしにするのが嫌で、作業中の課題を探し、時間記録リンクを探し、コメントを追加する手順も遅かったです。
自分に割り当てられた課題一覧と、コメント/作業時間を追加するボタンがあるデスクトップアプリが欲しかったのです。Tkinter では見栄えよく作るのにかなり苦戦しましたが、PySimpleGUI を見つけてから Jira API のフックをつなぎ、欲しいものを作れましたし、UI 開発を学ぶにはよいプロジェクトでした。
友人もある職場で Jira の基本作業用の社内 Qt クライアントを作ったと言っていましたし、私も Jira で作業を追跡しなければならなかったとき、https://github.com/go-jira/jira を使い、複数のコンソールスクリプトで変更作業を処理していました。
こういう GUI フレームワークには本当に期待しています。ネイティブデスクトップ体験は WebView の組み合わせよりはるかに良いですし、PySimpleGUI の単純化されたイベントループと 複数バックエンドのアプローチは、実際に新しいものだと思います。
ただ、データ構造と関数だけ渡せば、それを操作するための適切なインターフェースを自動で作ってくれる「自動 GUI」が、なぜもっと多くないのか不思議です。パネルを縦/横に置くか、タブインターフェースやポップアップにするかをヒューリスティックで選べば、CLI ではネストが深すぎ、Webアプリにするにはネイティブな機能を多く開放しすぎるような用途にも対応できるはずです。
https://github.com/chriskiehl/Gooey
構造体を定義して
dialog関数に渡すと、構造体のフィールドに合わせてダイアログを自動生成し、ユーザーが OK を押すとコールバックを呼ぶようにできます。ユーザー定義属性でどのウィジェットを使うかも指定でき、たとえばintに@ControlledBy!VerticalSlider(0, 100)を付けると、数値入力欄の代わりに 0〜100 のスライダーになります。メニュー関数にも@menu("Search") Find(string text) { ... }のように付けてメニューとダイアログを自動生成できますし、変更イベントごとにコールバックを呼ぶDataControllerWidgetもあります。数年前に関連記事も書きましたが、進捗は非常に遅いです: http://dpldocs.info/this-week-in-d/Blog.Posted_2020_11_02.ht...もっと時間を使いたいほど面白いのですが、本業で使う機会がなく、週末にコードを書きたいときに少しずつ進めるだけになっています。
サンプルの見た目が [0] のように、90年代からそのまま持ってきたかのように見えます。プロトタイプや、CLI を使えない人向けの社内ツールには完璧ですが、見栄えのよい UI が必要なときはどうすればよいのか気になります。
性能面ではネイティブ UI が常に優れていますが、Webページよりスタイリングが難しいと感じてきました。Python GUI で、Flutter や SwiftUI のように大きな労力なしで洗練されて見えるスタイル付きコンポーネント群に相当するものは何なのか気になります。
[0] https://raw.githubusercontent.com/PySimpleGUI/PySimpleGUI/ma...
少なくとも OS が提供する標準 UI スタイルなら、人々はあるアプリで学んだことを別のアプリに持ち越せます。私は優れた UI デザイナーではないので、OS のデフォルトのほうが自分の思いつくものより優れている可能性が高いです。そこに、マーケティング側が聞くのを恐れる「うちのソフトウェアは古く見える」という言葉まで加わると、開発コストはすでに手に負えない水準まで膨らみます。
90年代にもこういうソフトウェアはありましたが、人々がよく言う90年代の美学ではありません。Windows 95 の UI デザインには多くの労力が注がれていました。
最近の UI の広い余白、ボタンに見えないボタン、消えるスクロールバー、ハンバーガーメニューのほうが嫌いです。
フロントエンドとバックエンドの分離も標準でできますし、後で必要になればリモートアクセスも可能です。ネイティブアプリのように使いたければ、小さな Tkinter 系 GUI に「Open browser UI」ボタンを1つ置くだけでも十分です。実行ボタンが URL にトークンを入れるようにすれば、同じマシンの別ユーザーとして実行中のデーモンからも保護できますが、実際にそうしているところは見たことがありません。
SystemDefaultForRealに変えても、ネイティブの Windows ウィジェットは現代的な外観なのに、Tkinter はまったく更新されていないため不自然に見えます。よさそうに見える。ただ、このライブラリはすでに成熟していて大きな変更は難しいかもしれないが、リストの代わりに辞書を使うとよいと思う。最近の Python の辞書は挿入順序を記憶する
以前の職場で PyQt の上に、これよりずっと薄いラッパーで似たものを作ったことがあり、コード量も驚くほど少なかった。主な違いは、属性/シグナル設定とウィジェットのネストを一緒に扱っていた点。コンストラクタで属性を設定する方式より、あとでテキストを変更するためにウィジェット名が必要な場合でも、ビュー定義の本体で属性を設定できる利点があった。
setup_view関数ひとつが API 全体で、簡単な GUI を素早く作るときにはかなり便利だった。このライブラリも良い代替案に見えるので、共有に感謝https://docs.python.org/3/whatsnew/3.7.html#summary-release-...
データバインディングはフレームワークに任せるほうがよい。Web もデスクトップも、どちらもこの方向に進みつつある。ウィジェットを直接変更するのではなく、ウィジェットの属性をデータストアにバインドし、変更時に自動で再レンダリングされるようにすべき。ページの入力/出力例は似たものを示している。今では誰も
getElementById()を使わないVB6 や Delphi/Lazarus の使いやすさに近づいているように思う。確かに進歩はあり、あとは対話型 GUI ビルダーさえあれば、作ったフォームを
#importしてすぐ使う、という形で済むかもしれない数年前に WxPython と WxFormBuilder を一緒に使おうとして、プロジェクトで膨大な時間を失った。フォームに小さな変更を加えるだけでバックエンドが全部壊れ、間をつなぐ薄いコードを自分で書いたが、フィールド型を変えたらまた全部壊れた。ここではそういうことが起きなさそうでよかった
Python GUI アプリケーション [1] を開発している立場からすると、デスクトップアプリに Python を使う際の最大の問題はパッケージングだと思う
配布可能なバイナリを作る既存のツールは、依存関係がいくつかを超えるだけで動かなくなったり、かなりのハックが必要になったりする。人気のあるパッケージでさえ、隠れた import の欠落や、知らなかったデータファイルの欠落といった難解な問題が起きる。動的モジュール読み込みも、PyInstaller や cx_freeze のように通常の Python 環境の外へ持ち出すと壊れることがある。何ができるかは分からないが、Python にも Java の JAR のように、インタプリタだけに依存する独立実行プログラムのパッケージング標準が必要なのかもしれない
shiv や PEX のようなツールでアプリケーションの依存関係を含む zipapp を作れるが、バイナリ拡張がある場合、成果物は依然としてプラットフォーム別になる: https://github.com/linkedin/shiv#gotchas
私の Python プログラムでは、ユーザーに pipx でインストールするよう勧めている: https://github.com/pypa/pipx
対象ユーザーが少しでも技術寄りなら、これが最善の選択だと思う。
pip install --userのバージョン衝突や、アプリごとの仮想環境を手動で作る苦痛を避けられ、全体として悪くないユーザー体験を提供する。pipx を標準のインストール方法として勧めても、人々がインストールに成功すると期待できる。私のプログラムにはバイナリ依存関係はあるが、GUI はない個人的には CustomTKinter のほうが好み。ずっと洗練されていて Material テーマのような外観で、Windows/Linux/macOS でシステム設定に応じたライト/ダークテーマをサポートしている
高速アプリケーション開発の領域で、VB6 が残した空白をいまだに何もきちんと埋められていないのは驚きだ。言語自体は優れていたわけではないが、VB6 の強みはドラッグ&ドロップの GUI ビルダーだった
https://www.lazarus-ide.org/
https://gambas.sourceforge.net/en/main.html
https://qb64.com/inform.html
便利なことに、レイアウトファイルを Python スクリプトの横に置いておくだけで pyqt から使える。IDE の Python サポートは良くないが、自分のインストール環境が壊れているせいかもしれない
https://xojo.com/
かなりよくできたCLIインターフェースを持つツールにGUIをかぶせて、デスクトップLinuxを使っていない人でも使えるようにしようか考えている。PySimpleGUIは自分の用途にぴったり合うかもしれないと思っている
https://github.com/hiAndrewQuinn/finstem
自分のツールには、CSV、TSV、JSONのフラグがきちんと定義されている。既存の完全なCLIツールを変更せず、その上にGUIを作った経験があるか、どんな難しさを想定すべきか知りたい
エンジンとGUIはWinBoardやUCI[2]のようなプロトコルに従い、STDIN/STDOUTでテキストコマンドをやり取りする。主な難点はマルチスレッドで遭遇するものと同じで、GUIとCLIが互いに待ち合って止まるデッドロックが起こり得ること。そのため、双方とも入出力を「ビジネスロジック」とは別スレッドで処理して応答性を保つ必要がある。もう一つよくある問題は、パイプ処理にOSごとの特性がある点で、バッファのflushやLinux/Mac/Windows間のAPI差に気を配る必要がある
[0] http://hgm.nubati.net/
[1] http://www.playwitharena.de/
[2] https://gist.github.com/DOBRO/2592c6dad754ba67e6dcaec8c90165...
失礼に聞こえなければいいのだが、テキストが多すぎる。テキストを入れられる場所のあちこちに長い文章が続いていて、ほとんど一貫性はあるものの、最初の1000語の間に関連するスクリーンショットが一つもない
何かがずれて見える。おそらく若くて熱心な開発者なのか、使ってみるよう説得しようとしてテキストをたくさん入れたように感じる。READMEには作者が自分を紹介する「about me」セクションまである。READMEのどこでもいいので下に移動して数段落を読み、今読んだ内容を言い直してみれば例になるはず
「最小限の単語だけ読んで、できるだけ早く実行するにはどうすればいいか」という姿勢より、ツールについて読むこと自体を楽しむ人もいる。他人が作ったツールを無料で使っているのだから、不満を言うのをやめて、本人の望む形で表現させておくのがよい
[1] https://github.com/PySimpleGUI/PySimpleGUI#about-me-
失礼でなければいいが、もしかして段階的な要約で口元まで運んでもらえないと、文章を読まなければならないという事実そのものを恐れているのでは、と聞き返したい
同じ考えは「視覚的なプロジェクトなら、メインの説明にもっとスクリーンショットがあったほうがよいと感じる」程度でも伝えられたし、侮辱的な推測は省けたはず
Smart、Open、Trusted、Secureのような単語をプロジェクト名に入れると、人々はその名前の理想に届いていないと指摘しやすい。逆にCやBSDのような名前には反対語や含意がないので、「C言語は名前負けしている」とは言いにくい