web-dev-qa-db-ja.com

PythonアプリケーションをデプロイするためのクロスプラットフォームGUIツールキット

ビルド: http://www.reddit.com/r/Python/comments/7v5ra/whats_your_favorite_gui_toolkit_and_why/

メリット:

1-設計/統合の容易さ-学習曲線

2-* nix、Windows、Macのサポート/可用性、ネイティブl&fの追加ポイント、モバイルまたはWebのサポート

3-Pythonic API

4-ドキュメントの品質-もう少し複雑なことをしたいのですが、今はどうしますか?

5-軽量のパッケージなので、フルインストーラーを含める必要はありません(py2exe、py2appは理想的にはそのまま動作し、膨大なMBファイルを生成しません)

6-ライセンス

7-その他? (具体的に)


候補者:

1-tkinter、現在サポートされている(2.6、3.0以降)

2-pyttkライブラリ

3-pyGTK

4-pyQt

5-wxPython

6-Pythonベースのフレームワーク(Django、Turbogears、web.py、Pylons ...)またはPasteを介したHTML-CGI

7-その他? (具体的に)

46
nachik

この答えを拡大することを躊躇しないでください。

Tkinter

Tkinterは、Pythonに付属するツールキットです。つまり、GUIを作成するために必要なものがすべて揃っているということです。また、プログラムを配布することを選択した場合、おそらく他の誰もがプログラムを実行するために必要なものをすでに持っているということも意味します。

Tkinterは成熟していて安定しており、(少なくとも間違いなく)非常に使いやすいです.wxPythonよりも使いやすいことがわかりましたが、それは明らかに主観的なものです。

Tkinterは、醜く時代遅れに見えることに対して悪いラップを得ています。 Tkinterで見苦しいGUIを作成するのは簡単ですが、見栄えの良いGUIを作成するのも簡単です。 Tkinterはあなたの手を握っていませんが、それもあまり邪魔になりません。 TkinterはMacとWindowsでネイティブウィジェットを使用するため、見栄えが最もよくなりますが、Linuxでも問題ありません。

Tkinterの見た目に関するもう1つのポイントは、ほとんどの場合、見た目は人が考えているほど重要ではないということです。 Tkinter、wxPython、PyQTなどのツールキットで作成されたほとんどのアプリケーションは、特別な目的のアプリケーションです。これらのツールキットが使用されるアプリケーションのタイプについては、ユーザビリティの切り札に見えます。アプリケーションの外観が重要な場合、Tkinterアプリケーションを磨くのは簡単です。

Tkinterには、他のツールキットでは対応できない機能がいくつかあります。変数トレース、名前付きフォント、ジオメトリ(レイアウト)マネージャー、およびTkinterがイベントを処理する方法は、他のツールキットが判断する標準です。

欠点として、Tkinterはpython内で実行されるTclインタープリターのラッパーです。これはTkinterで開発している人にはほとんど見えませんが、このアーキテクチャを公開するエラーメッセージが表示されることがあります。 「.1245485.67345」のような名前のウィジェットについて不平を言うエラーが表示されます。これは、Tcl/tkのしくみにも精通していない限り、ほとんど意味がありません。

もう1つの欠点は、TkinterにはwxPythonほど多くのビルド済みウィジェットがないことです。たとえば、Tkinterの階層ツリーウィジェットは少し弱く、組み込みのテーブルウィジェットはありません。一方、Tkinterのキャンバスとテキストウィジェットは非常に強力で使いやすいです。ほとんどのタイプのアプリケーションで作成しますが、必要なものはすべて揃っています。 Microsoft WordまたはPhotoshopをTkinterで複製することを期待しないでください。

Tkinterのライセンスが何であるかはわかりません。pythonの場合と同じです。 Tcl/tkにはBSDスタイルのライセンスがあります。

PyQt

C++フレームワークである Qt の上に構築されています。これは非常に高度で、アプリケーションを設計するためのQt Designerなどの優れたツールがいくつかあります。ただし、これはPython 100%のようには感じられませんが、それに近いことに注意してください。 ドキュメント は素晴らしいです

このフレームワークは本当に良いです。これは、Nokiaが所有するTrolltechによって積極的に開発されています。 PythonのバインディングはRiverbankによって開発されました。

PyQtはGPLライセンスまたは商用ライセンスの下で利用できます。リバーバンクのPyQtライセンスの価格は、開発者1人あたり約400ユーロです。

QtはGUIフレームワークであるだけでなく、他にも多くのクラスがあり、Qtクラスを使用するだけでアプリケーションを作成できます。 (SQL、ネットワーキング、スクリプティングなど…)

QtはすべてのプラットフォームでGUI要素をエミュレートしていましたが、現在はプラットフォームのネイティブスタイルを使用しています(ただし、ネイティブGUIツールキットではありません):Mac OSのドキュメントを参照 X および ウィンドウXPスタイル

パッケージ化は、py2exeまたはpyInstallerを実行するのと同じくらい簡単です。私のPyQtアプリのコンテンツは、Windowsでは次のようになります(適切なインストールのために、その上にInnoSetupを使用しました)。

 pyticroque.exe PyQt4.QtGui.pyd unicodedata.pyd 
 MSVCP71.dll PyQt4._qt.pyd unins000.dat 
 MSVCR71.dll python25.dll unins000.exe 
 PyQt4.QtCore.pyd sip.pyd _socket.pyd 

QTにはウィジェットデザイナが付属しており、最近のバージョンでも [〜#〜] ide [〜#〜] を使用してQtソフトウェアの設計に役立ちます。

PySide

PySideはQtへのLGPLバインディングです。 GPL PyQtの代替としてnokiaによって開発されました。

PySideは、既存のGPLライセンスのPyQtバインディングとは異なるテクノロジーに基づいていますが、最初はそれらとのAPI互換を目指しています。 PyQt互換APIに加えて、より多くのPythonic APIが将来提供される予定です。

wxPython

wxPythonは、 wxWidgets -Frameworkを使用したPythonのバインディングです。このフレームワークはLGPLライセンスの下にあり、オープンソースコミュニティによって開発されています。

私が本当に欠けているのは、インターフェースを設計するための優れたツールです。3つありますが、どれも使用できません。

特筆すべき点の1つは、高度なものを何も使用しなかったにもかかわらず、タブビューにバグが見つかったことです。 (Mac OS Xのみ) wxWidgetsQt ほど洗練されていないと思います。

wxPythonは実際にはGUIクラスのみに関するものであり、他にはあまりありません。

wxWidgetsはネイティブGUI要素を使用します。

WxPythonがTkinterに比べて優れている点は、wxPythonのウィジェットのライブラリが非常に大きく、そこから選択できることです。

その他

他のGUIフレームワークの経験はありません。

44
Georg Schölly

私はTKinterがひどいことを言うためにちょうど量り込んでいます。悲しいことに、後方互換性のためにPythonが詰め込まれているようです。

ドキュメントは恐ろしいです。恐ろしいですね。実際にPythonをクラッシュさせるいくつかの奇妙なバグに遭遇しました。

7
Unknown

Jython

Jythonは、高水準で動的なオブジェクト指向言語の実装ですPython 100%Pure Javaで記述されており、Javaプラットフォームとシームレスに統合されています。したがって、Python=任意のJavaプラットフォームで実行できます。

Swing、アプレット、またはJavaプラットフォームで利用可能なその他のGUIフレームワークのいずれかを使用できます。 グラフィカルユーザーインターフェイス および-については Javaチュートリアル を参照してください) 2D GraphicsAPI reference のような本や documentation はたくさんあります。

An Jythonの紹介 のHello world Swingアプリケーションを次に示します。

from javax.swing import *

frame = JFrame("Hello Jython")
label = JLabel("Hello Jython!", JLabel.CENTER)
frame.add(label)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300, 300)
frame.show()

これがJythonです マルチスレッドのパーティクル描画を示すTodd Ditchendorfによるアプレット (60行)。

from __future__ import nested_scopes
import Java.lang as lang
import Java.util as util
import Java.awt as awt
import javax.swing as swing

class Particle:

    def __init__(self,initX,initY):
    self.x = initX
    self.y = initY
    self.rng = util.Random()

    def move(self):
    self.x += self.rng.nextInt(10) - 5
    self.y += self.rng.nextInt(20) - 10

    def draw(self,g2):
    g2.drawRect(self.x,self.y,10,10)

class ParticleCanvas(awt.Canvas):

    def __init__(self,newSize):
    awt.Canvas.__init__(self,size=(newSize,newSize))

    def Paint(self,g2):
    for p in self.particles:
        p.draw(g2)

class ParticleApplet(swing.JApplet):

    def init(self):
    self.canvas = ParticleCanvas(self.getWidth())
    self.contentPane.add(self.canvas)

    def start(self):
    n = 10
    particles = []
    for i in range(n):
        particles.append(Particle(150,150))
    self.canvas.particles = particles

    self.threads = []
    for i in range(n):
        self.threads.append(self.makeThread(particles[i]))
        self.threads[i].start()

    def makeThread(self,p):

    class MyRunnable(lang.Runnable):
        def run(this):
        try:
            while 1:
            p.move()
            self.canvas.repaint()
            lang.Thread.sleep(100)
        except lang.InterruptedException:
            return

    return lang.Thread(MyRunnable())

線と円を描くことに興味があるだけなら、おそらく半分に減らすことができます。

6
Eugene Yokota

誰かが一般的に議論されているものよりも良いことを知っていれば、私は間違いなくそれを感謝します。適切なものを見つけるのに頭痛がするようです...

Qtは素晴らしいですが、PyQtには同じ開発リソースがないようです。バインディングを生成するための巧妙な方法があるようですが、完全ではなく(例:PyKDEターミナルkpart)、ドキュメントが不足しています(開発者が認めるように)。 QtのUIデザイナーとの互換性は素晴らしいです。

wxpython-コントロールは見栄えがよくありません。ウィジェットライブラリはKDEほど大きくありません。

OpenGL-デフォルトではフォントもサポートしていません... pygameは問題ありませんが、openglがステートマシンであることは非常に煩わしいです(オブジェクト指向モデルは間違った状態での呼び出しを防ぎます)。

XUL-きちんとした考え、それがうまくいけばいいのに。 pyxulrunner チュートリアルは機能しませんでした-最初にxulrunner/usr/libパスをLD_LIBRARY_PATHに追加する必要がありましたが、それでも「from xpcom import components」に問題がありました...

私のuiライブラリのウィッシュリストは

  • Python統合(つまり、Unicodeなどの組み込み関数、スレッドなどのモジュール、クロージャーなどの言語機能を使用します)
  • 適切な中間表現(「listbox91.addChild(label28)」のように見える数百行を生成する代わりにXULのように)
  • simpleマルチスレッドサポート(自動ロックまたはイベントポスティング。たとえば、elt.setTextを任意のスレッドから呼び出すことができます。デザイナーがPython locks必要であれば)
  • ユーザー中心の機能も-UIイベントのシーケンスのスクリプト、あらゆるものをキーバインドする機能(KDEにはdcopがありますが、afaikバインディングはUIライブラリによって自動的には行われません)、およびイベントのインターセプト。
  • 大きくて貢献しやすい標準ライブラリの可能性。
  • ドキュメンテーション。ライブラリが適切に設計され、十分な関心を集めていれば、これは当然のことです。

私の経験では、htmlはUIライブラリよりも見栄えの良いものを取得する方がはるかに簡単です。

edit-しばらくPyQt 4を操作した後、シンプルなUIの仕事を完了します。私は現在エンドユーザー向けに開発しているわけではないので、見た目は関係ありません。 QTextBrowserは、基本的なHTMLテーブルの表示とHTMLリンクの生成に非常に役立ちます。

5
gatoatigrado

プロwxPython

  • たくさんのチュートリアル
  • エディターとしてのwxGlade:まだ完璧ではありませんが、使用可能です。
0
Danny