2011-02-03 17 views
6

Bardzo staram się stworzyć okno bez dekoracji i przezroczystego tła za pomocą PyGTK. Chciałbym wtedy narysować zawartość okna z Kairu. Ale nie mogę zmusić go do działania.Jak uzyskać przezroczyste tło w oknie z PyGTK i PyCairo?

Próbowałem wiele różnych sposobów, wszystkie one zawiodły, to jedna z nich

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk, sys, cairo 

win = None 

def expose (widget, event): 
    cr = widget.window.cairo_create() 

    #Start drawing 
    cr.set_operator(cairo.OPERATOR_CLEAR) 
    cr.set_source_rgba(0.5,1.0,0.0,0.5) 
    cr.rectangle(0, 0, 0.9, 0.8) 
    cr.fill() 

def main (argc): 
    global win 

    win = gtk.Window() 

    win.set_decorated(False) 

    win.connect('delete_event', gtk.main_quit) 
    win.connect('expose-event', expose) 

    win.set_app_paintable(True) 

    win.show() 

    gtk.main() 

if __name__ == '__main__': 
    sys.exit(main(sys.argv)) 

Więc, co jest najprostszym sposobem, aby to zrobić?

Odpowiedz

9

Tak, sam to wymyśliłem.

Oto działający przykład. Skomentowałem odpowiednie części, na wypadek gdyby ktoś inny był zainteresowany tym, jak to zrobić.

#!/usr/bin/env python 

import pygtk 
pygtk.require('2.0') 
import gtk, sys, cairo 
from math import pi 

def expose (widget, event): 
    cr = widget.window.cairo_create() 

    # Sets the operator to clear which deletes everything below where an object is drawn 
    cr.set_operator(cairo.OPERATOR_CLEAR) 
    # Makes the mask fill the entire window 
    cr.rectangle(0.0, 0.0, *widget.get_size()) 
    # Deletes everything in the window (since the compositing operator is clear and mask fills the entire window 
    cr.fill() 
    # Set the compositing operator back to the default 
    cr.set_operator(cairo.OPERATOR_OVER) 

    # Draw a fancy little circle for demonstration purpose 
    cr.set_source_rgba(0.5,1.0,0.0,1) 
    cr.arc(widget.get_size()[0]/2,widget.get_size()[1]/2, 
      widget.get_size()[0]/2,0,pi*2) 
    cr.fill() 

def main (argc): 

    win = gtk.Window() 

    win.set_decorated(False) 

    # Makes the window paintable, so we can draw directly on it 
    win.set_app_paintable(True) 
    win.set_size_request(100, 100) 

    # This sets the windows colormap, so it supports transparency. 
    # This will only work if the wm support alpha channel 
    screen = win.get_screen() 
    rgba = screen.get_rgba_colormap() 
    win.set_colormap(rgba) 

    win.connect('expose-event', expose) 

    win.show() 
0

Dokładny problem został rozwiązany na forum. Ale jest w C++. Spróbuj to zrozumieć.

Postępuj następująco: Linux Questions

Zobacz komentarz Wysłany przez phorgan1. Mam nadzieję, że to pomoże ...

+0

Ten kod wygląda trochę jak mój kod powyżej. Zmieniłem kod zgodnie z kodem C++, ale to też nie działa. – paldepind

Powiązane problemy