2009-06-09 2 views
1

한 픽셀 값을 투명으로 설정하여 PyGTK 픽스맵을 만들려면 어떻게해야합니까? 나는 뭔가를 가지고 깊이 1의 pixmap을 만들고 그것을 마스크로 설정하는 것과 관련이있다.하지만 내가 찾은 것은 그것이 그릴 때 아무것도하지 않거나 완전히 내 pixmap을 지우는 것이다. 현재 픽스맵을PyGTK의 픽스맵 투명도

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

답변

1

Pixmap이 아닌 Pixbuf를 사용하려는 것 같습니다. Pixbuf에는 알파 설정이 포함되어있어 투명도를 제공하지만 Pixmap에는 적용되지 않습니다.

+1

감사합니다. 필자는 PyGTK Pixbuf 문서를 살펴 봤지만 카이로를 그리기위한 표면으로 사용할 방법이없는 것 같습니다. Pixbuf와 ImageSurface를 앞뒤로 변환해야 사용할 수 있습니까? –

2

Pixmap 또는 Pixbuf으로 원하는 것을 수행 할 수 있다고 생각하지 않지만 기존 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으로 사전 렌더링하는 것이 좋습니다. 이것이 당신이 찾고있는 물건의 종류 인 경우 나는 당신의 진짜 필요를 반영하기 위해 질문의 제목을 업데이트하는 것이 좋습니다 것,

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() 

: 여기에 위의 expose_handler, 대체는 한 번 이미지를 그리는 것이있다 :).