使 Gtk.Window 透明吗?

使 Gtk.Window 透明吗?

这是我的代码,我只是想不明白为什么我的顶层窗口没有变得透明。

xwininfo 说 Windows 有 32 位深度。我正在运行 Ubuntu 11.10,如果我在窗口本身上调用 .set_opacity(.5),它将变得透明。但窗口的所有内容也是如此。我想要一个透明的背景,但小部件应该保持不透明。

我查看了notify-osd代码,它们在主窗口上调用set_opacity。但是,我无法弄清楚为什么osd上的其他小部件保持不透明。以下是代码:

#!/usr/bin/env python

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_border_width(30)
        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)

        box = Gtk.Box()
        btn1 = Gtk.Button(label="foo")
        box.add(btn1)
        self.add(box)

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

    def area_draw(self, widget, cr):
        cr.set_source_rgba(0, 0, 0, .3)
        cr.paint()

#    def screen_changed(self, widget, cr):
#        self.screen = widget.get_screen()
#        self.visual = self.screen.get_rgba_visual()
#        if self.visual != None and self.screen.is_composited():
#            self.set_visual(self.visual)

MyWin()
Gtk.main()

答案1

我解决了这个问题,这是可以运行的代码。 重要的是为表面上正在执行的操作设置正确的运算符。

#!/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_border_width(30)
        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)

        box = Gtk.Box()
        btn1 = Gtk.Button(label="foo")
        box.add(btn1)
        self.add(box)

        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.9)
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()
        cr.set_operator(cairo.OPERATOR_OVER)

MyWin()
Gtk.main()

相关内容