python - Python + Cairo + GTK / GDKピクセルバッファーの簡単なセットアップ

python pygtk pycairo

私自身の利益のために、そしておそらく教育用に、PythonとCairoのためのpygameのようなAPIを作成したいと思います。しかし、私はそれを正確にpygameにしたくありません。代わりに、GTK / GDKを使用して1つ以上の画像を表示する半静的な描画プラットフォームにし、TiKZ(latexパッケージ)の優れたAPI原則を模倣したいと思います。 PyGame APIは悪くありませんが、私はそれに満足していません。特定の問題の1つは、すべてをpixbufに(Cairoを使用して)描画することでパッケージがウィンドウの更新を処理し、ウィンドウが開かれたときにpixbufを自動的に再描画することです。そうすれば、エンドプログラマはウィンドウの更新について心配する必要がなくなります。実際、エンドプログラマーは、単一のクラスや関数を書く必要はありません。グラフィックライブラリは、TkInterの場合のように、保存されたシェイプオブジェクトのリストをこれまでよりも長く維持する必要もありません。 (少なくとも、カイロが私の意図に反してそうしないことを願っています。)

ImageMagickとPostscriptへの出力により、pycairoでさまざまなものを描画することに成功しました。だから私はピカイロ自体で大丈夫です。

残念ながら、私が見つけたcairo / gtk / pycairo / pygtkのドキュメント---誰のために書かれたのかわかりませんが、私にはわかりません。現時点では、私はProject Eulerタイプのプログラマーであり、「5つの最先端の超オブジェクト指向API」タイプのプログラマーではありません。私は何をすべきかについての明確な説明、および/または明確な例を見たいのですが。



わかりました。投稿された1つの回答は、少なくとも少し役に立ったので受け入れました。しかし、ここで一言で言えば、本当のポイントです。ポイントは、Cairoの使用を含め、GDKで描画するときにGDKが一時的なダブルバッファを作成することです。エクスポーズイベントを処理するときは、すべてを再描画するだけです。しかし、非常に複雑なイメージがある場合、これは特にPythonの場合、処理が遅くなります。したがって、Cairoが一時的なバッファではなく永続的なダブルバッファに書き込むことができ、その永続的なダブルバッファがGDKで公開されると、はるかに優れています。何人かの開発者がこの問題の解決策を望んでいました。なんらかの解決策があるように思われるプロジェクトの1つはGoogle Chromiumです--- LinuxなどのGoogle Chromeでウィンドウの露出がいかに素晴らしいか気づいたことはありますか?そこで、Chromiumのソースコードを見て、これが簡単にできるかどうかを確認します。

補遺:「pixbufs」を具体的に参照することで、問題を混乱させたようです。私はpixbufにはあまり関心がありません(そして、質問のタイトルを再度変更しました)。私が本当に気にしているのは、一時的なダブルバッファーピクセルアレイではなく、CairoとGTK / GDKの間に永続的なダブルバッファーピクセルアレイを作成することです。これを行う最も簡単な方法は、GTKウィンドウをカイロサーフェスにして、ダブルバッファーを別のカイロサーフェスにすることです。私は私の質問でサンプルを求めたので、ここにいくつかあります:

class Canvas(gtk.DrawingArea):
    def __init__(self):
        super(Canvas, self).__init__()
        self.connect("expose_event", self.expose)
        self.set_size_request(width,height)

    def expose(self, widget, event):
        cr = widget.window.cairo_create()
        cr.set_source_surface(mybuffer,0,0)
        cr.paint()


すぐに発生したもう1つのトリッキーな問題は、これを、Pythonが要求する描画をすぐに描画するWYSISWYG描画環境にしたかったことです。アニメーションに拡張できます。ただし、ほとんどのGTKサンプルはそのように設定されていません。イベント処理は、gtk.main()を呼び出すまで延期されます。 (またはPythonで、raw_input()も何らかの形でGTKイベントキューをフラッシュすることを発見して驚いた。)Pythonの例で、a nice explanationを見つけて、GTKにイベントコントロールを提供する代わりの方法を見つけました。最も簡単な解決策、そしておそらく私が採用する解決策は、これを使用して、イベントバッファーをフラッシュするときにいつでもフラッシュすることです。

while gtk.events_pending(): gtk.main_iteration(False)


ピクセルバッファーとイベントバッファーをフラッシュするために、最後に1つ必要です。これは1つの方法のように見えますwindow.queue_draw()
答え
これはコメントに対して大きすぎるため、これを応答として追加しました。
質問ははっきりしていません。 cairo描画を使用してGtkウィジェットに描画する方法を尋ねるつもりですか?まず、GTK Pixbufと呼ばれるものは何もありません。GDKPixbufを参照していると思います。 GTKのほとんどの描画はGDKレイヤーで行われます。ウィンドウ処理、描画メカニズム、画像操作について知りたい場合は、GDKで詳細を確認してください。 These linksがcairo-gdkの相互作用についての洞察を得るのに役立つことを願っています。 GTK、GDK、CairoのPythonバインディングに関する私の経験はありませんが、gdk-cairoのサンプルを調べれば、Googleがいくつかの優れたリソースを提供すると思います。
これが少なくとも少し役立つことを願っています!
関連記事

python - JavaScriptを介してMongoインデックスを追加する

python - タブ化された一連のQDockWidgetのトップQDockWidgetを設定する

python - あるプログラムから別のプログラムでstdoutを読み取る

python - Pythonで数値を分割する方法の数

python - pythonはhtmlフォームからファイルを受け取ります

python - PyDevを使用してPythonで変数アクセスにブレークポイントを設定する方法はありますか?

python - ターゲット関数が完了した後にPythonスレッドが確実に終了するようにするにはどうすればよいですか?

python - django / python:複数のテーブルを持つ生のSQL

python - ブレンダーは頂点ごとのUV座標をエクスポートできますか?

python - Pythonのインタラクティブ(注釈付き)チャート[終了]