Python - 如何使用gtk.Window创建透明窗口,但不使用Gtk.Window?

时间:2013-10-24 21:50:28

标签: python user-interface gtk pygtk transparent

如何制作gtk.Window(不用导入Gtk,Gtk.Window我的意思)透明? 例如,使用import gtk,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()

1 个答案:

答案 0 :(得分:6)

(注意:更简单的方法就是使用Gtk.Window.set_opacity(),它既适用于旧的pygtk又适用于基于内省的新绑定。这样做的缺点是至少在我的系统上,它似乎使窗口控件和窗口内容一样透明。)

以下是适用于GTK2和旧pygtk绑定的代码。如你所见,它几乎相同。唯一真正的变化是,我们不是检查然后设置RGBA Gdk.Visual,而是检查RGBA gtk.gdk.Colormap(当然我们必须将draw回调更改为{{1但是我相信你已经知道了:-))

expose-event