【问题标题】:Cannot paint paths with cairo on gtk widgets in python 3无法在 python 3 中的 gtk 小部件上使用 cairo 绘制路径
【发布时间】:2015-01-12 19:55:32
【问题描述】:

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

例如,如果我设置一个全白的源区域来绘制一个小的白色矩形,并且我要求 cairo 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()

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

感谢您的帮助。

【问题讨论】:

    标签: python-3.x pygtk gtk3 pygobject pycairo


    【解决方案1】:

    好的,我明白了。

    我误解了对象context的方法paint的作用。 我认为实际上执行之前指定的所有操作是某种“提交”。 实际上,这些操作是“现场”绘制的(或者在返回调用之后,我不知道),并且绘制是将整个源复制到目标的操作。

    难怪它不起作用。效果很好。

    这是正确的绘图回调:

    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
    

    【讨论】:

    • 您可以发布您的工作示例的完整版本吗?
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多