2013-02-22 82 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。當你完成繪圖時不要忘記摧毀它。