2013-02-22 77 views
1

我想优化我的开罗绘图。我在开罗图形绘制的顶部有一个不变的背景。对于类的每个实例,背景可以不同,因此它不能是静态文件。为了绘制背景,我愿做这样的事情:如何创建内存映像

if self.pixbuf is None: 
     self.pixbuf = self.draw_background(cr, width, height) 
     #self.pixbuf = gtk.gdk.pixbuf_new_from_file("/path/to/file.png") 

    cr.set_source_pixbuf(self.pixbuf, 0, 0) 
    cr.paint() 

所以,我只创建背景一次,然后将其显示为图像,并在它上面画的东西。这是为了节省时间,而不是在每次别人改变时重新绘制整个不变的背景。注释掉的代码行工作正常,但我真的不想创建一个PNG,将其保存到临时文件,然后加载该文件。这似乎是IO的浪费。

我尝试这样做:

self draw_background (self, cr, width, height) 
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, int(width), int(height)) 

    cr.set_source_color(gtk.gdk.color_parse('black')) 
    cr.set_line_width(2) 
    cr.rectangle(0, 0, width, height) 
    cr.stroke() 

    cr.paint() 
    return pixbuf 

但不显示背景。

我在做什么错?

+0

不应该draw_background()函数绘制到它创建的新pixbuf吗?您粘贴的代码会创建一个新的pixbuf,但不会为其绘制任何内容。换句话说:它不应该有cr参数,而应该为新的pixbuf创建一个cairo上下文。这有多帮助? – 2013-02-23 10:43:55

+0

@UliSchlachter:虽然可能的确如此,但我不知道该怎么做......我通过Google搜索找到的大多数函数都会返回'gtk.gdk.pixbuf_get_from_surface',它不会出现在我的系统上(pygtk v2.24)。你有一段代码,我可以看看吗? – Sardathrion 2013-02-25 08:11:51

+0

我不明白你的第一个代码片段中的“其他”。第一次创建像素图时,这不会使它不会将背景绘制到控件上吗? – Ancurio 2013-03-01 10:57:38

回答

1

正如Uli指出的那样,您正在使用指向您的小部件作为目标的上下文进行绘制,而不是您的pixbuf。要为pixbuf创建新的cairo上下文,请使用cairo_create。当你完成绘图时不要忘记摧毁它。