« ジェローム・アニトンって誰? | トップページ | matplotlibが最近どんどん使いやすくなっている。 »

2013年2月 9日 (土)

Python GUIツールキット個人的な比較のまとめ

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ライブラリ


wxPython 
それなりに大きなコミュニティがあって安心な、汎用性の高いクロスプラットフォームなGUI。内部的にOSのネイティブなAPIを使ってGUIを表示するので、出来たソフトのネイティブアプリな感じがよく出てしっくりくるというのが特徴。OpenGLはPyOpenGLと組み合わせれば使える(サンプルコードPyOpenGL+wxpyhon 1PyOpenGL+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使ってたのは知らなかったが、本当だろうか。

追記。このStackOverflowのスレにではなぜかwxPythonが絶賛されていて、Python生みの親グイドのコメントが引用されていて、グイドもおすすめらしい。
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などに要望があれば検討します。。


PyQt
こちらもクロスプラットフォームな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ってのが最近きになる。

PyGTK
これもクロスプラットフォームなGUI。もともとGTKはLinux用のGUIライブラリなのでLinux好きな人がよく使っている感じ。当方は贔屓にしているPythonシェルのDreampieもPyGTKベース。Windowsへの対応ではwxの方が力が入っている気がする。Dreampieのソースコード眺めているとwxのコードに見えてくるくらい結構似ている。Dreampieを多少ハックして俺様専用機能を追加した程度で、自分ではあまりつかってない。sublime textはC++プログラムで、GTKをカスタマイズしたものでできているらしい
これもクロスプラットフォーム。Python自体についてくるスタンダードライブラリであることが強みな割には悲しいほどユーザーが少ない。その理由はソフトの見た目がネイティブアプリに見えなくて、しかもダサかったかららしい。それでもPython 2.7からはサポートされているTkInterのバージョンが上がったために劇的に見栄えが改善されたらしいが、新しいためにチュートリアルとか探すのが大変。PythonについてくるIDLEはこれでできている。

以下、汎用じゃないもの。ウィンドウィングとイベントハンドリングのサポート+アルファ。

Pyglet
これは結構つかった。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など他のソフトで制作してインポートする必要がある。
tobspr氏がpanda3dで作ったデモ。綺麗ですなぁ・・。tobspr氏は他にもいろいろ作っているpanda3d魔術師です。
GUIライブラリじゃないだろというツッコミが聞こえますが、一応Figureにコールバックをつけて、マウスやキーボードからの入力に応じて画面を更新できるので自分用なら十分にインタラクティブなデータ解析ソフトとか作れる。あまり描画が速くないのはしょうがない。それでもこれくらいはできる。再プロットするのではなく、set_dataメソッドでデータだけアップデートするように書くと速い。
OpenCV

もともとはインテルが開発したコンピュータヴィジョンのライブラリがオープンソース化したもの。監視カメラとか顔認証とかリアルタイムで画像解析が必要な用途に特化していて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バインディングがきたらうれしいな。


使ったことないもの

PyGame
使ったことがないけど有名なので。Pygletよりも歴史が長いPython用のクロスプラットフォームな2Dゲーム用ライブラリ。SDLという歴史の長いCライブラリを使ってウィンドウだしたり音だしたりする。ユーザー数が多いのでサンプル見つけるのは簡単。PyGameで出来た最近のゲームいろいろ

Frets on Fireというギター・ヒーローのクローンみたいなゲームもPyGameでできているそうです。


Kivy

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にアレルギーがある人(私)はいいのでは。


« ジェローム・アニトンって誰? | トップページ | matplotlibが最近どんどん使いやすくなっている。 »

Python」カテゴリの記事

学問・資格」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1169291/49281732

この記事へのトラックバック一覧です: Python GUIツールキット個人的な比較のまとめ:

« ジェローム・アニトンって誰? | トップページ | matplotlibが最近どんどん使いやすくなっている。 »

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

    かなり更新が不定期なため、RSSリーダーをオススメします。現在Feedlyに122人登録頂いています。多謝!RSSを表示

    ブログランキング用 にほんブログ村 IT技術ブログ Pythonへ ブログランキングならblogram






    Jenny Mayhem
2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

IT技術注目記事

無料ブログはココログ