pygtk: рисовать линии на gtk.gdk.Pixbuf
Вопрос
Я использую 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, так что я думаю, что это полезно для вас.
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
, так что вы можете рисовать на нем.