不要害怕這樣的大班級 - 寫這樣的文章讓我感到很有趣,所以它可以以通用的方式工作。它可能是透明元素的父級,而不是父級。那麼,麻煩了。它可以使主透明gtk.Window,gtk.EventBox如下例所示,以及其他gtk.widgets,但它不適用於gtk.Layout,請幫助我。我想我寫了足夠的信息來發送問題。對不起我的英語:)如何使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()
一件事,你可以多一點可讀使你的代碼。使用默認參數('rgba =(.0,.0,.0,.0)')而不是'* rgba'並檢查其長度。一些類似PEP8的空白也很好。 – liori 2012-07-19 21:35:15
你是對的,我在晚上寫了它,所以忘了默認參數,謝謝:) – scythargon 2012-07-20 07:24:33