2013-10-24 2 views
2

gtk.Window (가져 오기 Gtk, Gtk.Window 의미) 투명하게 만드는 방법? 예를 들어 gtk, gtk.Window 가져 오기를 사용하여이 작업을 수행합니다.파이썬 - gtk.Window와 함께 투명 윈도우를 만드는 방법은 Gtk.Window가 아닌가?

#!/usr/bin/env python 
import cairo 
from gi.repository import Gtk, Gdk 

class MyWin (Gtk.Window): 
    def __init__(self): 
    super(MyWin, self).__init__() 
    self.set_position(Gtk.WindowPosition.CENTER) 

    self.set_size_request(300, 220) 
    self.set_border_width(11) 

    self.screen = self.get_screen() 
    self.visual = self.screen.get_rgba_visual() 
    if self.visual != None and self.screen.is_composited(): 
     print "yay" 
     self.set_visual(self.visual) 

    self.set_app_paintable(True) 
    self.connect("draw", self.area_draw) 
    self.show_all() 

    def area_draw(self, widget, cr): 
    cr.set_source_rgba(.2, .2, .2, 0.3) 
    cr.set_operator(cairo.OPERATOR_SOURCE) 
    cr.paint() 
    cr.set_operator(cairo.OPERATOR_OVER) 

MyWin() 
Gtk.main() 

답변

6

(참고 :. 훨씬 쉬운 방법은 바로 이전 pygtk 새로운 성찰 기반 바인딩에서 모두 작동 Gtk.Window.set_opacity()을 사용하는 것입니다이 내 시스템에 적어도,을 보인다 단점이있다 투명 창 컨트롤뿐만 아니라 창 내용.)

다음이 코드는 GTK2 및 이전 pygtk 바인딩에 적용된다. 보시다시피, 거의 동일합니다. 유일한 변화는 대신 검사 한 다음 RGBA Gdk.Visual을 설정, 우리는 RGBA gtk.gdk.Colormap를 확인한다는 것입니다 (물론 우리는 expose-eventdraw 콜백을 변경해야합니다,하지만 난 당신이 :-) 이미 알고 확신)

#!/usr/bin/env python 
import cairo 
import gtk 

class MyWin (gtk.Window): 
    def __init__(self): 
    super(MyWin, self).__init__() 
    self.set_position(gtk.WIN_POS_CENTER) 

    self.set_size_request(300, 220) 
    self.set_border_width(11) 

    self.screen = self.get_screen() 
    colormap = self.screen.get_rgba_colormap() 
    if (colormap is not None and self.screen.is_composited()): 
     print "yay" 
     self.set_colormap(colormap) 

    self.set_app_paintable(True) 
    self.connect("expose-event", self.area_draw) 
    self.show_all() 

    def area_draw(self, widget, event): 
    cr = widget.get_window().cairo_create() 
    cr.set_source_rgba(.2, .2, .2, 0.3) 
    cr.set_operator(cairo.OPERATOR_SOURCE) 
    cr.paint() 
    cr.set_operator(cairo.OPERATOR_OVER) 
    return False 

MyWin() 
gtk.main()