Вопрос

Я использую pygtk с PIL. Я уже нашел способ конвертировать PIL Image в gtk.gdk.Pixbuf . Чтобы отобразить pixbuf, я создаю gtk.gdk.Image , а затем использую img.set_from_pixbuf . Теперь я хочу нарисовать несколько линий на этом изображении. Очевидно, мне нужен Drawable для этого. Я начал просматривать документы, но у меня уже открыто 8-10 окон, и это не так просто.

Итак - какую магию мне нужно набрать, чтобы получить Drawable, представляющий мою картинку, нарисовать на нем некоторые вещи, а затем превратить его в gdk.Image , чтобы я мог отобразить его на своем приложение?

Это было полезно?

Решение

Я делал нечто подобное (рисование в gdk.Drawable) и обнаружил, что set_foreground не работает. Чтобы на самом деле рисовать, используя нужный мне цвет, я использовал следующее:

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

Другие советы

Боже мой. Так больно. Вот оно:

    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)

На самом деле он рисует черную линию банкомата, а не красную, поэтому у меня есть еще работа ...

Вы пробовали контекст Каира? извините, я не могу прокомментировать ваш пост. поэтому я разместил это здесь.

Я сам не пробовал этого, но я считаю, что Каир - твой друг, когда дело доходит до рисования в gtk. Вы можете установить источник своего контекста в Каире как pixbuf, так что я думаю, что это полезно для вас.

gdkcairocontext

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)

Должен сделать свое дело.

Вы должны подключиться к сигналу expose-event (GTK 2) или draw (GTK 3). В этом обработчике просто используйте image.window , чтобы получить gtk.gdk.Window виджета; это подкласс gtk.gdk.Drawable , так что вы можете рисовать на нем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top