Python如何制作透明窗口gtk.窗口但不是和Gtk。窗户?

2024-05-17 05:45:04 发布

您现在位置:Python中文网/ 问答频道 /正文

如何制作gtk.窗口(不适用于进口Gtk,Gtk.窗口我是说)透明? 例如,对import gtk执行相同的操作,gtk.窗口? 在

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

Tags: importselfgtkgetinitdefscreencr
1条回答
网友
1楼 · 发布于 2024-05-17 05:45:04

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

下面是适应GTK2和旧的pygtk绑定的代码。如你所见,它几乎是一样的。唯一真正的改变是,我们不再检查并设置RGBAGdk.Visual,而是检查RGBAgtk.gdk.Colormap(当然,我们必须将draw回调改为expose-event,但我相信您已经知道了这一点:—)

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

相关问题 更多 >