2

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

ImageMagick と Postscript への出力で pycairo にいろいろ描画することに成功しました。だから私はpycairo自体で大丈夫です。

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


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

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

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

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

最後にもう 1 つ、ピクセル バッファーとイベント バッファーをフラッシュする必要があります。それを行う1つの方法のように見えますwindow.queue_draw()

4

1 に答える 1

2

これはコメントには大きすぎるので、これを応答として追加しました。
質問はあまり明確ではありません。cairo drawing を使用して Gtk Widgets に描画する方法を尋ねるつもりですか? まず、GTK Pixbuf と呼ばれるものはありません。GDK Pixbuf のことを指していると思います。GTK でのほとんどの描画はGDKレイヤーで行われます。ウィンドウ処理、描画メカニズム、または画像操作について知りたい場合は、GDK を調べて詳細を確認してください。これらの リンクが、cairo と gdk の相互作用に関する洞察を得るのに役立つことを願っています。GTK、GDK、および Cairo の Python バインディングに関する私の経験はゼロですが、gdk-cairo サンプルを検索すると、Google がいくつかの優れたリソースを提供すると思います。
これが少なくとも少し役立つことを願っています!

于 2011-10-20T03:44:44.650 に答える