Python - как сделать прозрачное окно с помощью gtk.Window, но не с помощью Gtk.Window?
Как сделать gtk.Window (не с импортом Gtk, я имею в виду Gtk.Window) прозрачным? например, делать то же самое с импортом 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()
1 ответ
(Примечание: гораздо проще просто использовать Gtk.Window.set_opacity()
, который работает как со старым pygtk
и новые привязки, основанные на самоанализе. Это имеет тот недостаток, что, по крайней мере, в моей системе кажется, что элементы управления окнами прозрачны, а также содержимое окна.)
Ниже приведен ваш код, адаптированный для GTK2 и старого pygtk
привязок. Как видите, он практически идентичен. Единственное реальное изменение заключается в том, что вместо проверки, а затем настройки RGBA Gdk.Visual
Проверяем RGBA gtk.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()