2009-07-31 51 views
3

我使用pygtk和PIL。我已經想出了一種將PIL Image s轉換爲gtk.gdk.Pixbuf s的方法。我做什麼來顯示pixbuf是我創建一個gtk.gdk.Image,然後使用img.set_from_pixbuf。我現在想在這張圖上畫幾行。顯然我需要一個Drawable來做到這一點。我已經開始瀏覽文檔,但是我已經打開了8-10個窗口,並且它不是簡單的。pygtk:畫線到gtk.gdk.Pixbuf

所以 - 我需要輸入什麼魔法才能得到代表我的照片的Drawable,然後將其繪製成一個gdk.Image,以便我可以在我的應用程序上顯示它?

回答

4

我在做類似的東西(繪製一個GDK。 Drawable),我發現set_foreground不起作用。實際上把利用我想要的顏色,我使用了以下內容:

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

您是否嘗試過cairo上下文?對不起,我似乎無法評論你的帖子。因此我在這裏發佈。

我還沒有嘗試過這個,但我相信cairo是你繪製gtk的朋友。你可以設置你的開羅上下文的來源爲pixbuf,所以我認爲這對你很有用。

gdkcairocontext

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,而不是紅色的,所以我有一些工作剩下要做......

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) 

應該做的伎倆。

1

您應該連接到expose-event(GTK 2)或draw(GTK 3)信號。在該處理程序中,只需使用image.window即可獲取小部件的gtk.gdk.Window;這是gtk.gdk.Drawable的一個子類,所以你可以借鑑它。