2009-06-09 54 views
1

如何創建一個像素值設置爲透明的PyGTK pixmaps?我知道它有東西與創建一個深度爲1的像素圖並將其設置爲一個蒙版,但我找到的是它或者什麼都不做或完全擦除我的像素圖繪製時。此刻,我就與PyGTK中的Pixmap透明度

r = self.get_allocation() 
p1 = gtk.gdk.Pixmap(self.window,r.width,r.height) 
p1_c = p1.cairo_create() 

像素圖再畫黑線都使用它在開羅。我希望能夠做的就是讓所有區域都沒有被透明線覆蓋(使透明顏色變成白色),這樣,當我用draw_drawable將它繪製到窗口時,它會將所有內容都留在「下方」完整。

關於這個問題的常見問題和郵件列表張貼是最無用的,因爲它們太過時了。有人必須知道這裏!

+0

另請參閱http://stackoverflow.com/questions/3048148/alpha-blending-in-gtk – sdaau 2013-12-10 13:53:38

回答

1

它看起來像你想使用Pixbuf而不是Pixmap。 Pixbuf包含一個alpha設置,它會給你透明度,而Pixmap不會。

+1

謝謝。我已經瀏覽了PyGTK Pixbuf文檔,但似乎沒有任何方法可以將它們用作開羅繪製的表面。我需要在Pixbuf和ImageSurface之間來回轉換才能使用它們嗎? – 2009-06-10 01:37:40

2

我不認爲你可以做你想做一個PixmapPixbuf什麼,但這裏是實現塗鴉在現有Widget的前兩名策略。其中最明顯的就是趕上抽獎活動,直畫到WidgetDrawable,在中間沒有任何保留的圖像:

from gtk import Window, Button, main 
from math import pi 
import cairo 

w = Window() 
b = Button("Draw on\ntop of me!") 

def scribble_on(cr): 
    cr.set_source_rgb(0, 0, 0) 
    cr.rectangle(10, 10, 30, 30) 
    cr.fill() 
    cr.arc(50, 50, 10, 0, pi) 
    cr.stroke() 

def expose_handler(widget, event): 
    cr = widget.window.cairo_create() 
    cr.rectangle(event.area.x, event.area.y, 
       event.area.width, event.area.height) 
    cr.clip() 
    scribble_on(cr) 
    return False 

b.connect_after("expose_event", expose_handler) 
w.add(b) 
w.set_size_request(100, 100) 
w.show_all() 
main() 

第二個選擇,如果你想有一箇中介ARGB形象,每次請求重繪時不必更新,而是將圖像預先渲染到ImageSurface。下面是expose_handler,上面的替代品,只繪製圖像一次:

import cairo 
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100) 
scribble_on(cairo.Context(surface)) 

def expose_image_handler(widget, event): 
    cr = widget.window.cairo_create() 
    cr.rectangle(event.area.x, event.area.y, 
       event.area.width, event.area.height) 
    cr.clip() 
    cr.set_source_surface(surface) 
    cr.paint() 

如果這是你要找的那種事情,我會建議更新問題的標題,以反映您的實際需要: )。