2012-07-19 30 views
2

不要害怕這樣的大班級 - 寫這樣的文章讓我感到很有趣,所以它可以以通用的方式工作。它可能是透明元素的父級,而不是父級。那麼,麻煩了。它可以使主透明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() 
+1

一件事,你可以多一點可讀使你的代碼。使用默認參數('rgba =(.0,.0,.0,.0)')而不是'* rgba'並檢查其長度。一些類似PEP8的空白也很好。 – liori 2012-07-19 21:35:15

+0

你是對的,我在晚上寫了它,所以忘了默認參數,謝謝:) – scythargon 2012-07-20 07:24:33

回答

3

非常好...我一直在學習這個東西,我喜歡你的代碼。

從pygtk的手冊(強調):

的gtk.Layout也可以在類似的繪製在繪圖gtk.DrawingArea。在處理gtk.Layout,上的公開事件時,您必須繪製到由bin_window屬性指定的窗口,而不是窗口小部件窗口屬性

我認爲在你的函數中,你正在獲取窗口屬性而不是開羅繪製的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() 
+0

你是對的,幫助!非常感謝!:) – scythargon 2012-07-20 07:30:01