2011-02-03 22 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

関連する問題