新的 绘制 信号使用已将cairo上下文作为参数传递的回调,您无需
window =widget.get_window()像在PyGtk中所做的那样在参加 暴露事件 信号时就获得cairo上下文。在PYGObject中比较简单:
import cairoclass Foo(object): def __init__(self): (...) self.image = cairo.ImageSurface.create_from_png('logo.png') (...) def draw(self, widget, context): if self.image is not None: context.set_source_surface(self.image, 0.0, 0.0) context.paint() else: print('Invalid image') return False那就是如果您不需要PixBuf,但是如果您需要它来做其他事情,则可以有几种选择:
- 使两个对象都在内存中。如果两者都是从PNG加载的,那么除了浪费内存外,应该不会有太多问题。
- 将GdkPixbuf转换为PIL图像,然后将PIL图像转换为数据数组,然后使用create_for_data()从该数据数组创建Cairo ImageSurface。k牛:SI不太了解,对不起:S
- 使用 hock 建议的 Gdk.cairo_set_source_pixbuf() 。这似乎是在ImageSurface中绘制Pixbuf的正确方法,但是它完全是非Python的(这就是为什么我讨厌这种自省的东西,它们看起来都像C,就像一个坏的C端口)。
如果您选择糟糕的第二个选项,请按以下步骤操作:
import Imageimport arrayfrom gi.repository import Gtk, GdkPixbufwidth = 25height = 25pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size('logo.png', width, height)pil_image = Image.fromstring('RGBA', (width, height), pixbuf.get_pixels())byte_array = array.array('B', pil_image.tostring())cairo_surface = cairo.ImageSurface.create_for_data(byte_array, cairo.FORMAT_ARGB32, width, height, width * 4)需要注意的是 create_for_data()
是尚未提供Python3,只为Python2。
如果这是您要达到的目的,还请查看我的回答如何在PyGObject中使用双缓冲区:在PyGobject(python3)中绘图
亲切的问候



