Python用に色々とあるGUIライブラリですが、個人的にはQtと迷って結局wxPython(wxWidgetsのPythonバインディング)を使ってますが、もしかしたらQtにしておけばよかったのかなぁと多少後悔もしつつも、wxでかなり満足していたりもします。Qtに多少浮気した結果、Qtの大量の個別インポートは理にかなっているとは思いつつもなんか好きになれず、やっぱりwxの方が性にあっていると思う今日此の頃。
まあ、研究者むけのGUIライブラリのまとめというのはそうなさそうじゃないだろうかということで、使ったことのあるものないものも含めいろいろと聞き及んだことを書いてみます。とは言え、主に汎用GUIライブラリの話なので一般的にも参考になるかと思います。
GUIプログラムが初めてで、いまから始めるならPython3にも対応しているQtがいいんじゃないかと思います。(追記:最近wxPythonもバージョン3がリリースになりPython3にもつかえるようになりました。)MATLABのGUIは酷かったのでそれに比べればwxもQtもpylabすらも非常に快適・簡単です。
汎用GUIライブラリ
それなりに大きなコミュニティがあって安心な、汎用性の高いクロスプラットフォームなGUI。内部的にOSのネイティブなAPIを使ってGUIを表示するので、出来たソフトのネイティブアプリな感じがよく出てしっくりくるというのが特徴。OpenGLはPyOpenGLと組み合わせれば使える(サンプルコード
PyOpenGL+wxpyhon 1 、
PyOpenGL+wxpyhon 2 )。安定版であるバージョン2.8系はXPで使う限り非常に安定して、見た目もネイティブアプリな感じが高くいい感じ。開発版の2.9系を使いたいところだけど2.9系はいまいち不安定でいまだに乗り換えられない(2013年末にとうとう3.0がでました。新機能より安定性を重視したようでとうとう2.8系から乗り換えられそうだと評判がいいです。試さねば。追記。
Python3.4しかも64ビット版で試しました。 )。とは言え、wxPython Demo for Windowsなんかで遊びながら使いたいウィジェットを探して、コードをちょっと手を入れてやりたいことがすぐできるあたりはいい感じ。py2exeなんかでパッケージ化するときの相性もいい。だけど、Windows 7でpy2exeでシングルファイルにしてパッケージ化するとXPっぽいWindows Classicな感じになってしまうのが残念。シングルファイルではければうまくいくのでマニフェストファイルがうまくパッケージされていないっぽいがいまだに対処法が分からない。(ようやく
解決しました。 )最近評判の良い
pyinstaller でもシングルファイルでパッケージ化できるようだけど試す時間がない(試したところpy2exeでパッケージした方がシングルファイルの場合起動が速いようなので乗り換え中止した)。Windows 7/8で見た目のかっこいいソフトを今すぐ作りたい場合はパッケージ化にちょっと問題かも。ライセンス的に製品化するときにロイヤリティが発生しないあたりがQtに対するアドバンテージ。GUIデザインツールとして
wxglade とか
wxdesigner とかあるけどQt Designerに比べ見劣りするし使ってない。
wxPythonをつかって作られたソフトウェアのリスト にはBittorrentとかgui2py、wxGladeなんかがあります。Wikipedia にはDropboxとかGoogle DriveもwxPythonを使っているとありますね。Dropbox自体Pythonで作られたという話は有名だけど、GUIにwxPython使ってたのは知らなかったが、本当だろうか。
wxPython is the best and most mature cross-platform GUI toolkit, given a number of constraints. The only reason wxPython isn't the standard Python GUI toolkit is that Tkinter was there first. -- Guido van Rossum
超訳すると、「いろいろな制約を考えるとwxがもっとも成熟した一番良いクロスプラットフォームなGUIツールキットだ。なんでwxをpythonを標準ライブラリにしなかったかというと、Tkが先になっちゃっていたからというだけなんだ。」
wxはメインで長年つかっているので使い方の連載記事でも始めようかとおもったらPython-izm という素晴らしいサイトがすでにあり、基本がしっかり押さえられているようなので、やるなら中級編とか応用編かなぁ。需要ありますか?コメント欄かTwittterなどに要望があれば検討します。。
こちらもクロスプラットフォームなGUIで、新し目なので設計がモダン。IPythonやPython(x,y)、VTK、OpenCVなどなど研究用途のプロジェクトで採用・サポートされていることが多い。wxと違い、GUIの描画はQt内部で行なってネイティブアプリっぽく見せている。実装はリバーバンクという会社が作っているPyQtとNokiaが支援しているコミュニティベースのPySideがあるけど圧倒的にPyQtが使われているっぽい。PyQt4はフリー・非商用のソフトを配布する限りGNU GPLで自由に使えるはず。製品化するとコマーシャルライセンスになるのでロイヤリティ発生。(追記。LGLPで商用もフリーの
PySideの開発へ、wxPythonを一人で作ったRobin Dunn氏が参加 したようですので、近い将来にクオリティが跳ね上がるかもしれません。)Python(x,y)にもついてくるGUIデザインツールのQt Designerは結構評判がよい。Qt DesignerがあるからQtを使っているという人がいたりする。ほとんどつかってないのでわからないけど、見た目もキレイなソフトをWindows 7/8用に作りたい場合はPyQtの方がリバーバンクが頑張っているっぽいのでwxより有利じゃないかなぁ。
PyQtをつかって作られたソフトはかなりたくさんある。なかでもPython用IDEのNinja ってのが最近きになる。
これもクロスプラットフォームなGUI。もともとGTKはLinux用のGUIライブラリなのでLinux好きな人がよく使っている感じ。当方は贔屓にしているPythonシェルのDreampieもPyGTKベース。Windowsへの対応ではwxの方が力が入っている気がする。Dreampieのソースコード眺めているとwxのコードに見えてくるくらい結構似ている。Dreampieを多少ハックして俺様専用機能を追加した程度で、自分ではあまりつかってない。
sublime textはC++プログラム で、
GTKをカスタマイズしたものでできているらしい 。
これもクロスプラットフォーム。Python自体についてくるスタンダードライブラリであることが強みな割には悲しいほどユーザーが少ない。その理由はソフトの見た目がネイティブアプリに見えなくて、しかもダサかったかららしい。それでもPython 2.7からはサポートされているTkInterのバージョンが上がったために劇的に見栄えが改善されたらしいが、新しいためにチュートリアルとか探すのが大変。PythonについてくるIDLEはこれでできている。
以下、汎用じゃないもの。ウィンドウィングとイベントハンドリングのサポート+アルファ。
これは結構つかった。Python3対応でOpenGLに強くPyGameより速い。ファイルダイアログとかボタンとか一般的なウィジェットはなくウィンドウィングとイベントハンドリングができるだけなのでビジネスアプリみたいなのには向かない。しかし、すべてOpenGLで描画されるのでゲームとかマルチメディア系なソフトには良い。ビデオプレーヤーとかあっという間に作れる。視覚刺激提示用のソフトを自分で作ろうとかいう用途に非常におすすめ。APIが非常にモダンというか洗練されていて、サンプルのコードも非常に美しい。とくにゲームにはCocos2dというpygletベースの2Dゲームフレームワークがあるのでシーン切り替え、スプライト、物理エンジンとかまである環境になる。後にObjective-CでiPhone用に移植されたCocos2d for iPhoneというのが有名だったりする。Pythonで実装されているのでバージョンによってはPyPy上で動いたりする点もプラス。
Ace of Spades という
Streamで市販されている ゲームはPygletでできているそうです。
もどもどディズニーの映画制作用に開発されたものがオープンソース化されたという3Dのゲームエンジン。中身はC++なのでとても速い。3Dを扱うのはどうやっても大変だけど、Panda3DのAPIはがかなりわかりやすい。Pygletは2Dフレームワークなので上のAce of SpadesではきっとOpenGLを叩くコードをゴリゴリと自分で書いているが、Panda3dではローレベルのOpenGLコールを意識しないでPandaNodeクラスからプレーヤー、カメラなどを扱うハイレベルな記述するだけで、実際のOpenGLコールはPandaがやってくれるので超楽。2DならPygameかPygletの方が楽だが、3DライブラリはPanda3dがコミュニティも大きくオススメ。
DirectGUI というのがあり、ボタンとかテキストとかも扱える。
イベントループを色々とまぜることができる ので私はGUIはwxPythonを別窓で、グラフィックはPandaという使い方をしたことがある。3DモデルはBlenderなど他のソフトで制作してインポートする必要がある。
VIDEO
VIDEO
GUIライブラリじゃないだろというツッコミが聞こえますが、一応Figureにコールバックをつけて、マウスやキーボードからの入力に応じて画面を更新できるので自分用なら十分にインタラクティブなデータ解析ソフトとか作れる。あまり描画が速くないのはしょうがない。それでも
これ くらいはできる。再プロットするのではなく、
set_dataメソッドでデータだけアップデートする ように書くと速い。
もともとはインテルが開発したコンピュータヴィジョンのライブラリがオープンソース化したもの。監視カメラとか顔認証とかリアルタイムで画像解析が必要な用途に特化していてC/C++で非常に速い。安いウェブカメラつなげて遊ぶと楽しい。highguiを使うとnumpyアレイを簡単にOpenGLのウィンドウに表示できて、マウスやキーボードの入力のイベントを捕まえてコールバックファンクションでいろいろできるので画像解析メインな場合はこちらがおすすめ。最近のバージョンではcv2というPythonバインディングがとってもnumpyフレンドリーで、APIもPythonicな感じになって改善されたので昔のOpenCVのCのプログラム書いているような感じがしなくなった。PILやScipyでできるような画像解析は大抵OpenCVでもできる。
バージョン2.4.9から3Dビジュアリゼーション用のモジュール‘viz’というのが追加になってますね。内部的にVTKを使っているようです。ドキュメンテーション から察するにC++からしかまだ使えないようです。VTK はデータの3Dレンダリングに非常にパワフルだけどちょっと難しいというかパイプラインを構築するのがめんどくさいので、全部の機能はいらないけど、簡単に使えるようなハイレベルなラッパーは便利そう。Pythonバインディングがきたらうれしいな。
使ったことないもの
使ったことがないけど有名なので。Pygletよりも歴史が長いPython用のクロスプラットフォームな2Dゲーム用ライブラリ。SDLという歴史の長いCライブラリを使ってウィンドウだしたり音だしたりする。ユーザー数が多いのでサンプル見つけるのは簡単。
PyGameで出来た最近のゲームいろいろ 。
Frets on Fireというギター・ヒーローのクローンみたいなゲームもPyGameでできているそうです。
PyGameをもとにいろいろなライブラリを組み合わせて作られたクロスプラットフォームな汎用GUIライブラリ。研究者が作っている。ウィンドウズ・マック・LinuxはもちろんiPhoneやAndroidまでサポートする。Androidのサポートはpython-for-android 上で動かすことで実現している。Java覚えなくともPythonでAndroid用にアプリが一応かける。グラフィックスはOpenGL ESをベースにしているので速い。もちろんタッチ入力もサポート。Python3に対応しているのもプラス。OpenGL ESサポートというのも大きいし、割りといいのでは。年々少しずつ使用例を聞く頻度が増えている。とくにAndroidやiOSへPythonを普及するという意味で、GuidoもPyCon2014でおすすめしている ので、これから来るかもしれない。
kivyを使ってAndroidアプリを作るチュートリアル (英語)のコードを見ると簡単そう。Javaにアレルギーがある人(私)はいいのでは。
コメント