2011-02-03 13 views
6

He estado tratando realmente de crear una ventana sin decoración y un fondo transparente usando PyGTK. Entonces dibujaría el contenido de la ventana con El Cairo. Pero no puedo hacer que funcione.¿Cómo obtener un fondo transparente en la ventana con PyGTK y PyCairo?

He intentado un montón de diferentes maneras, todos fracasaron, este es uno de ellos

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

Así que, ¿cuál es la forma más sencilla de hacer esto?

Respuesta

9

Así que, de hecho, me di cuenta de esto.

Este es un ejemplo de trabajo. He comentado las partes relevantes solo 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() 
0

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

Siga este: Linux Questions

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

+0

Ese código se parece mucho a mi código anterior. Cambié mi código de acuerdo con el código C++, pero tampoco funciona. – paldepind

Cuestiones relacionadas