Python GTK - 带有透明度的DrawingArea

5
我正在制作一个透明窗口,其中包括一个DrawingArea小部件,该小部件有一个实心背景颜色,并且要保持其透明性。我已经尝试了一切,但不幸的是文档有点过时(在顶部使用PyGTK)。我还尝试将其draw事件与窗口连接在一起,但没有成功。
当然,我需要显示正方形,所以我只需要将背景颜色设置为透明即可。我也尝试过使用modify_bg,但我只能将其设置为实心颜色。
这是我目前所拥有的。
#!/usr/bin/env python

from gi.repository import Gtk, Gdk
import cairo

class GWin (Gtk.Window):
  def __init__(self):
    super(GWin, self).__init__()
    self.set_position(Gtk.WindowPosition.CENTER)
    self.screen = self.get_screen()
    self.visual = self.screen.get_rgba_visual()
    if self.visual != None and self.screen.is_composited():
      self.set_visual(self.visual)
    self.connect("draw", self.on_win_draw)
    self.set_app_paintable(True)
    self.show_all()
    self.draw_area = Gtk.DrawingArea()
    self.draw_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) 
    self.draw_area.connect('draw', self.begin_draw)
    self.draw_area.show()
    self.add(self.draw_area)

  def begin_draw(self, draw_area, cairo_context):
    cairo_context.rectangle(20, 20, 120, 120)
    cairo_context.stroke()

  def on_win_draw(self, widget, cr):
    cr.set_source_rgba(1, 1, 1, 0.1)
    cr.set_operator(cairo.OPERATOR_SOURCE)
    cr.paint()
    cr.set_operator(cairo.OPERATOR_OVER)

win = GWin()
win.connect('delete-event', Gtk.main_quit)
Gtk.main()
1个回答

0

在创建矩形之前,您需要设置cairo.Context源RGBA。以下是代码,编辑的行用### ADDED THIS LINE标记:

#!/usr/bin/env python

from gi.repository import Gtk, Gdk
import cairo

class GWin (Gtk.Window):
    def __init__(self):
        super(GWin, self).__init__()
        self.set_position(Gtk.WindowPosition.CENTER)
        self.screen = self.get_screen()
        self.visual = self.screen.get_rgba_visual()
        if self.visual != None and self.screen.is_composited():
            self.set_visual(self.visual)
        self.connect("draw", self.on_win_draw)
        self.set_app_paintable(True)
        self.show_all()
        self.draw_area = Gtk.DrawingArea()
        self.draw_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) 
        self.draw_area.connect('draw', self.begin_draw)
        self.draw_area.show()
        self.add(self.draw_area)

    def begin_draw(self, draw_area, cairo_context):
        cairo_context.set_source_rgba(1, 1, 1, 1)  ### ADDED THIS LINE
        cairo_context.rectangle(20, 20, 120, 120)
        cairo_context.stroke()

    def on_win_draw(self, widget, cr):
        cr.set_source_rgba(1, 1, 1, 0.1)
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()
        cr.set_operator(cairo.OPERATOR_OVER)

win = GWin()
win.connect('delete-event', Gtk.main_quit)
Gtk.main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接