1

その大きなクラスを恐れないでください-それがその普遍的な方法で機能するように書くことは私にとって興味深いことでした. 透明な要素の親クラスであり、親ではない可能性があります。それで、トラブル。メインの gtk.Window、gtk.EventBox、およびその他の gtk.widgets を透明にすることができますが、gtk.Layout では機能しません。助けてください。質問を送信するには、まだ十分に書いたと思います。申し訳ありませんが私の英語:)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gtk
import cairo
class Transparent:
    def __init__(self,*rgba):
        Transparent.makeTransparent(self)
        if len(rgba)>0:
            self.rgba=rgba[0]
    @staticmethod
    def expose (widget, event):
        cr = widget.window.cairo_create()
        cr.set_operator(cairo.OPERATOR_CLEAR)
        cr.rectangle(event.area)
        cr.fill()
        cr.set_operator(cairo.OPERATOR_OVER)
        try:
            widget.rgba
        except AttributeError:
            widget.rgba=(0.0,0.0,0.0,0.0)
        cr.set_source_rgba(*widget.rgba)
        cr.rectangle(event.area)
        cr.fill()  
    @staticmethod
    def makeTransparent(thing,*rgba): 
        if len(rgba)>0:
            thing.rgba=rgba[0]   
        thing.expose=Transparent.expose
        thing.set_app_paintable(True)
        screen = thing.get_screen()
        rgba = screen.get_rgba_colormap()
        thing.set_colormap(rgba)
        thing.connect('expose-event', thing.expose)

win = gtk.Window()
Transparent.makeTransparent(win)

#works with EventBox:
eb=gtk.EventBox()
win.add(eb)
Transparent.makeTransparent(eb)

#but not with Layout:
#l=gtk.Layout(None,None)
#win.add(l)
#Transparent.makeTransparent(l)

win.show_all()
win.show()
gtk.main()
4

1 に答える 1

2

とてもいいです...私はこのことを学んでいて、あなたのコードが好きです。

pygtk マニュアルから (強調を追加):

gtk.Layout は、gtk.DrawingArea での描画と同様に描画することもできます。gtk.Layout で公開イベントを処理するときは、ウィジェットの window 属性ではなく、bin_window 属性で指定されたウィンドウに描画する必要があります

あなたの関数では、cairoが描画するbin_windowではなく、window属性を取得していると思います。

公開関数を次のように変更します。

@staticmethod
def expose (widget, event):
    if 'gtk.Layout' in str(type(widget)):
        cr=widget.bin_window.cairo_create()
    else:
        cr = widget.window.cairo_create()
    cr.set_operator(cairo.OPERATOR_CLEAR)
    cr.rectangle(event.area)
    cr.fill()
    cr.set_operator(cairo.OPERATOR_OVER)
    try:
        widget.rgba
    except AttributeError:
        widget.rgba=(0.0,0.0,0.0,0.0)
    cr.set_source_rgba(*widget.rgba)
    cr.rectangle(event.area)
    cr.fill()  
于 2012-07-19T21:38:10.163 に答える