1

カスタム cairo コードでカスタム GTK3 描画領域をレンダリングする際に問題があります。カイロのコンテキストは、私が指定した形で問題を起こしたくないようです。形状に関係なく、ソース全体を宛先全体に書き込みます。

たとえば、小さな白い長方形を描画するために完全に白いソース領域を設定し、カイロにfill()その長方形を要求すると、その長方形ではなく DrawingArea ウィジェット全体が描画されます。ここで何が欠けていますか?

#!/usr/bin/env python3
from gi.repository import Gtk as gtk
from gi.repository import Gdk as gdk
import cairo

class Canvas(gtk.DrawingArea):
    def __init__(self):
        gtk.DrawingArea.__init__(self)
        self.set_size_request(600,400)
        self.connect('draw',Canvas.on_draw)

    def on_draw(self,context):
        context.set_source_rgb( 0.1, 0.0, 0.1 )
        context.fill()
        context.set_source_rgb( 1.0, 1.0, 1.0 )
        context.rectangle(50,50,100,100)
        context.fill()
        context.paint()
        return False

#look at this code
class MainWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self, title="Game Centurion")

        self.dummy0 = gtk.Label(label="dummy₀")
        self.canvas = Canvas()
        self.box = gtk.Box()

        self.box.pack_start(self.canvas, True, True, 0)
        self.box.pack_start(self.dummy0, True, True, 0)

        self.add(self.box)

        self.connect('delete-event', gtk.main_quit)

if __name__ == '__main__':
    w = MainWindow()
    w.show_all()
    gtk.main()

これが結果ウィンドウです。上記のコードで指定したように、濃い紫色の背景に小さな白い四角形が表示されているのではなく、全体が白くなっていることがわかります。

DrawingArea 結果

助けてくれてありがとう。

4

1 に答える 1

3

わかった。

paintobjectのメソッドの役割を誤解していましたcontext。以前に指定されたすべての操作を実際に実行するのは、ある種の「コミット」だと思いました。実際には、これらの操作は「その場で」(またはリターンコールの後、私にはわかりません)ペイントされ、ペイントはソース全体を宛先にコピーする操作です。

うまくいかなかったのも不思議ではありません。とてもよく出ます。

正しい描画コールバックは次のとおりです。

def on_draw(self,emitter,context):
    context.set_source_rgb( 0.1, 0.0, 0.1 )
    context.paint()
    context.rectangle(50,50,100,100)
    context.set_source_rgb( 1.0, 1.0, 1.0 )
    context.fill()
    return False
于 2014-11-18T22:06:32.340 に答える