2011-02-03 113 views
6

我一直在努力創建一個沒有裝飾和使用PyGTK的透明背景的窗口。然後我會和開羅一起繪製窗口的內容。但我無法讓它工作。如何在PyGTK和PyCairo的窗口中獲得透明背景?

我已經嘗試了很多不同的方式,他們都失敗了,這是他們

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

所以之一,什麼是最簡單的方法是什麼?

回答

9

所以,我其實自己想出了這件事。

這是一個工作示例。我已經評論過相關部分,以防其他人對如何做到這一點感興趣。

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

確切的問題已在論壇中解決。但它是用C++編寫的。試着理解這一點。

關注這個: Linux Questions

見發表phorgan1評論。 希望這可以幫助....

+0

該代碼看起來很像我上面的代碼。我根據C++代碼改變了我的代碼,但它也不起作用。 – paldepind 2011-02-03 19:24:50