Как получить прозрачный фон в окне с помощью PyGTK и PyCairo?

Я очень старался создать окно без украшения и с прозрачным фоном, используя PyGTK. Затем я рисовал содержимое окна с помощью Cairo. Но я не могу заставить его работать.

Я пробовал много разных способов, все они потерпели неудачу, это один из них

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

Итак, каков самый простой способ сделать это?


person paldepind    schedule 03.02.2011    source источник


Ответы (2)


Так что, я действительно понял это сам.

Это рабочий пример. Я прокомментировал соответствующие части на всякий случай, если кто-то еще заинтересован в том, как это сделать.

#!/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()
person paldepind    schedule 04.02.2011

Точная проблема обсуждалась на форуме. Но это на С++. Попытайтесь это понять.

Следуйте этому : вопросы по Linux

См. комментарий, отправленный phorgan1. Надеюсь это поможет....

person vettipayyan    schedule 03.02.2011
comment
Этот код очень похож на мой код выше. Я изменил свой код в соответствии с кодом C++, но он тоже не работает. - person paldepind; 03.02.2011