Big*_*ale 5 python transparency window cairo gtk3
这是我的代码,我根本无法弄清楚为什么我的顶级窗口没有变得透明。
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()
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题,这是有效的代码。重要的部分是为正在表面上执行的操作设置正确的操作员。
#!/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()
Run Code Online (Sandbox Code Playgroud)