Что говорит ptomato. Используйте Gtk.OffscreenWindow, если вам нужно сделать это вне экрана, в противном случае просто получите окно Gdk и выделение виджета для его обрезки. Вот фрагмент, который можно использовать для получения снимка любого виджета. Как показывает следующий код, вы также можете использовать метод Gtk.Widget.draw () для его рендеринга в контексте Cairo.
from gi.repository import Gtk
import cairo
WINDOW_WIDTH, WINDOW_HEIGHT = 400, 300
window = Gtk.OffscreenWindow()
window.set_default_size(WINDOW_WIDTH, WINDOW_HEIGHT)
window.show()
canvas = Gtk.HBox()
window.add(canvas)
canvas.show()
button = Gtk.Button("Hello World!")
canvas.add(button)
button.show()
# this is needed, otherwise the screenshot is black:
while Gtk.events_pending():
Gtk.main_iteration()
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32,
WINDOW_WIDTH, WINDOW_HEIGHT)
cr = cairo.Context(surf)
canvas.draw(cr)
surf.write_to_png('test.png')
Вы можете временно переопределить виджет (как сказал ptomato) для этого Gtk.OffscreenWindow, чтобы сделать снимок.
original_parent = canvas.get_parent()
canvas.reparent(offscreen_window)
# do snapshot
canvas.reparent(original_parent)