不要害怕那个大类——我很感兴趣的是,这样它就可以以通用的方式工作。它可以是透明元素的父类,而不是父类。所以,麻烦来了。它可以使主gtk透明。窗口,gtk。下面的例子中的EventBox和其他gtk.widget,但它不适用于gtk。布局,请帮我。我想我写的已经足够发送问题了。对不起,我的英语:)
#!/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()
非常好。。。我一直在学习这些东西,我喜欢你的代码。
来自pygtk手册(增加重点):
gtk。布局也可以类似于在gtk上绘制。绘图区域。在gtk上处理公开事件时。布局,您必须绘制到bin_window属性指定的窗口,而不是小部件窗口属性。
我认为在你的函数中,你得到的是window属性,而不是cairo要使用的bin_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()