¿Cómo obtener un fondo transparente en la ventana con PyGTK y PyCairo?

Me he esforzado mucho para crear una ventana sin decoración y un fondo transparente utilizando PyGTK. Luego dibujaría el contenido de la ventana con el Cairo. Pero no puedo hacerlo funcionar.

He probado muchas maneras diferentes, todas fallaron, esta es una de ellas.

#!/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)) 

Entonces, ¿cuál es la forma más sencilla de hacer esto?

Así que, en realidad me di cuenta de esto.

Este es un ejemplo de trabajo. He comentado las partes relevantes en caso de que alguien más esté interesado en cómo hacer esto.

 #!/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() 

El problema exacto ha sido abordado en un foro. Pero está en C ++. Intenta entender eso.

Sigue esto: Preguntas sobre Linux

Ver el comentario publicado por phorgan1. Espero que esto ayude….