如何在Cairo曲面上绘制任何GTK小部件

如何在Cairo曲面上绘制任何GTK小部件,gtk,pygtk,cairo,Gtk,Pygtk,Cairo,我想将GTK窗口的外观以及它包含的所有按钮和其他小部件保存到PNG或PDF文件中。Cairo支持在此类曲面上绘制。 我是否可以要求GTK小部件在Cairo曲面上绘制自己? 如果有代码示例,我将不胜感激,因为我是GTK和Cairo的新手。 Python是我的首选语言。在C语言中,你可以将你的按钮和小部件放在一个using中,然后使用gtk\u offscreen\u window\u get\u pixbuf()将其渲染到一个GdkPixbuf中,然后保存到一个文件中。很抱歉,我没有任何Pytho

我想将GTK窗口的外观以及它包含的所有按钮和其他小部件保存到PNG或PDF文件中。Cairo支持在此类曲面上绘制。 我是否可以要求GTK小部件在Cairo曲面上绘制自己? 如果有代码示例,我将不胜感激,因为我是GTK和Cairo的新手。
Python是我的首选语言。

在C语言中,你可以将你的按钮和小部件放在一个using中,然后使用
gtk\u offscreen\u window\u get\u pixbuf()
将其渲染到一个
GdkPixbuf
中,然后保存到一个文件中。很抱歉,我没有任何Python代码,但我认为PyGTK中还没有屏幕外的窗口。

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)