2009-07-31 14 views
3

Ich benutze pygtk mit PIL. Ich habe bereits einen Weg gefunden, PIL Image s zu gtk.gdk.Pixbuf s zu konvertieren. Was ich mache, um den Pixbuf anzuzeigen, ist, dass ich ein gtk.gdk.Image erstelle und dann img.set_from_pixbuf verwende. Ich möchte jetzt ein paar Zeilen auf dieses Bild zeichnen. Anscheinend brauche ich dazu eine Drawable. Ich habe angefangen, die Dokumente durchzusehen, aber ich habe bereits 8-10 Fenster geöffnet und es ist überhaupt nicht einfach.pygtk: Zeichnen Sie Linien auf eine gtk.gdk.Pixbuf

Also - welche Magie muss ich eingeben, um ein Drawable zu bekommen, das mein Bild darstellt, ein paar Dinge darauf zeichnet und es dann in ein gdk.Image verwandelt, damit ich es in meiner App anzeigen kann?

Antwort

4

Ich war etwas ähnliches (Zeichnung auf einem gdk tun. Drawable), und ich fand, dass set_foreground nicht funktioniert. Um tatsächlich die Farbe zu zeichnen mit Ich wollte, habe ich die folgenden:

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

Haben Sie den Kontext von cairo ausprobiert? Entschuldigung, ich kann meinen Beitrag nicht kommentieren. Daher habe ich es hier gepostet.

Ich habe das selbst nicht versucht, aber ich glaube, dass Kairo dein Freund ist, wenn es darum geht, in GTK zu zeichnen. Sie können die Quelle Ihres kairo-Kontexts als pixbuf festlegen, also denke ich, dass dies für Sie nutzbar ist.

gdkcairocontext

3

Oh mein Gott. So schmerzhaft. Hier ist sie:

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) 

Es zieht tatsächlich eine schwarze Linie ATM, nicht ein rotes, so habe ich einige Arbeit zu tun links ...

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) 

sollte es tun.

1

Sie sollten an das Signal expose-event (GTK 2) oder draw (GTK 3) anschließen. Verwenden Sie in diesem Handler einfach image.window, um die gtk.gdk.Window; Dies ist eine Unterklasse von gtk.gdk.Drawable, so dass Sie darauf zurückgreifen können.

Verwandte Themen