Wrong types in Gtk.Snapshot.to_node() and Gsk.Renderer.render_texture()
I'm trying to save a GTK4 widget to a PNG file, but I'm unable to use the Gtk.Snapshot.to_node()
and Gsk.Renderer.render_texture()
functions due to wrong types.
Here is the script I'm using:
import gi
gi.require_version("Gdk", "4.0")
gi.require_version("Gtk", "4.0")
gi.require_version("Graphene", "1.0")
from gi.repository import GLib, Graphene, Gtk
loop = GLib.MainLoop()
win = Gtk.Window()
paintable = Gtk.WidgetPaintable(widget=win)
def on_paintable_invalidate_contents(paintable) -> None:
snapshot = Gtk.Snapshot.new()
width = win.get_allocated_width()
height = win.get_allocated_height()
paintable.snapshot(snapshot, width, height)
node = snapshot.to_node()
renderer = win.get_native().get_renderer()
texture = renderer.render_texture(
node,
Graphene.Rect().init(0, 0, width, height))
texture.save_to_png('ok.png')
loop.quit()
paintable.connect("invalidate-contents", on_paintable_invalidate_contents)
win.present()
loop.run()
snapshot.to_node()
prints two warnings and a critical:
test.py:18: Warning: g_object_get_qdata: assertion 'G_IS_OBJECT (object)' failed
node = snapshot.to_node()
test.py:18: Warning: g_object_is_floating: assertion 'G_IS_OBJECT (object)' failed
node = snapshot.to_node()
** (process:30012): CRITICAL **: 12:01:08.835: pygobject_register_wrapper: assertion 'PyObject_TypeCheck(self, &PyGObject_Type)' failed
Nevertheless, it creates the Gsk.RenderNode
. type(node)
gives <class 'gi.repository.Gsk.ColorNode'>
.
However, using renderer.render_texture()
raises a TypeError
:
Traceback (most recent call last):
File "test.py", line 21, in on_paintable_invalidate_contents
texture = renderer.render_texture(
TypeError: expected GObject but got <gi.repository.Gsk.ColorNode object at 0x7f9dc899f4f0>
It seems to expect a GObject, but according to the docs, Gsk.Renderer.render_texture()
wants a Gsk.RenderNode
, which is not a GObject.