1

我无法使用自定义 cairo 代码渲染自定义 GTK3 绘图区域。cairo 上下文似乎不想为我指定的形状带来麻烦。无论形状如何,它将整个源写入整个目的地。

例如,如果我设置一个全白的源区域来绘制一个小的白色矩形,然后我向fill()那个矩形询问 cairo,它会绘制整个 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()

这是结果窗口,您可以看到它是全白的,而不是像我在上面的代码中指定的那样在深紫色背景上显示一个小白色方块。

绘图区结果

感谢您的任何帮助。

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 回答