3

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()
4

1 に答える 1

6

(注: はるかに簡単な方法はGtk.Window.set_opacity()、古いイントロスペクション ベースのバインディングと新しいイントロスペクション ベースのバインディングの両方で動作するを使用することpygtkです。これには、少なくとも私のシステムでは、ウィンドウ コントロールとウィンドウ コンテンツが透明になるように見えるという欠点があります。 .)

以下は、GTK2 と古いpygtkバインディングに合わせたコードです。ご覧のとおり、ほぼ同じです。唯一の実際の変更点は、 RGBA をチェックしてから設定する代わりに、 RGBAGdk.Visualをチェックすることです(もちろん、コールバックをgtk.gdk.Colormapに変更する必要がありますが、既にご存知だと思います :-) )drawexpose-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()
于 2013-10-25T05:27:45.667 に答える