pygtk:在gtk.gdk.Pixbuf上画线

时间:2009-07-31 15:10:42

标签: python gtk drawing pygtk

我正在使用Pygtk和PIL。我已经找到了将PIL Image转换为gtk.gdk.Pixbuf的方法。我在显示pixbuf时所做的是创建gtk.gdk.Image,然后使用img.set_from_pixbuf。我现在想在这张图片上画几条线。显然我需要一个Drawable来做到这一点。我已经开始查看文档,但我已经打开了8-10个窗口,而且根本不是直截了当的。

那么 - 我需要输入什么魔法才能让Drawable代表我的图片,绘制一些东西,然后把它变成gdk.Image以便我可以在我的应用上显示它?

5 个答案:

答案 0 :(得分:4)

我正在做类似的事情(绘制到gdk.Drawable),我发现set_foreground不起作用。为了使用我想要的颜色实际绘制,我使用了以下内容:

# Red!
gc.set_rgb_fg_color(gtk.gdk.Color(0xff, 0x0, 0x0))

答案 1 :(得分:3)

天哪啊。如此痛苦。这是:

    w,h = pixbuf.get_width(), pixbuf.get_height()
    drawable = gtk.gdk.Pixmap(None, w, h, 24)
    gc = drawable.new_gc()
    drawable.draw_pixbuf(gc, pixbuf, 0, 0, 0, 0, -1, -1)

    #---ACTUAL DRAWING CODE---
    gc.set_foreground(gtk.gdk.Color(65535, 0, 0))
    drawable.draw_line(gc, 0, 0, w, h)
    #-------------------------

    cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_best(), False)
    pixbuf.get_from_drawable(drawable, cmap, 0, 0, 0, 0, w, h)

它实际上画了一条黑线ATM,而不是红线,所以我还有一些工作要做......

答案 2 :(得分:1)

您是否尝试过cairo上下文?抱歉,我似乎无法对你的帖子发表评论。因此我将它发布在这里。

我自己没有试过这个,但我相信在绘制gtk时,cairo是你的朋友。你可以将你的cairo上下文的来源设置为pixbuf所以我认为这对你有用。

gdkcairocontext

答案 3 :(得分:1)

image = gtk.Image()
pixmap,mask = pixbuf.render_pixmap_and_mask() # Function call
cm = pixmap.get_colormap()
red = cm.alloc_color('red')
gc = pixmap.new_gc(foreground=red)
pixmap.draw_line(gc,0,0,w,h)
image.set_from_pixmap(pixmap,mask)

应该做的伎俩。

答案 4 :(得分:1)

您应该连接到expose-event(GTK 2)或draw(GTK 3)信号。在该处理程序中,只需使用image.window即可获取小部件的gtk.gdk.Window;这是gtk.gdk.Drawable的子类,因此您可以使用它。