如何在开罗表面上绘制任何GTK小部件

tza*_*dor 12 gtk pygtk cairo

我想保存GTK窗口的外观,以及它包含的所有按钮和其他小部件到PNG或PDF文件.开罗支持在这样的表面上绘画.我可以以某种方式要求GTK小部件在开罗表面上绘制自己吗?我非常感谢代码示例,因为我是GTK和Cairo的新手.Python是我的首选语言.

pto*_*ato 10

在C中,您可以将按钮和小部件放在GtkOffscreenWindow使用中gtk_widget_reparent(),然后使用gtk_offscreen_window_get_pixbuf()它将其渲染到a GdkPixbuf,然后可以将其保存到文件中.对不起,我没有任何Python代码,但我不认为PyGTK中的屏幕外窗口可用.


小智 10

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')
Run Code Online (Sandbox Code Playgroud)

你可以暂时将一个小部件(如ptomato所说)重新显示给这个Gtk.OffscreenWindow,以便制作快照.

original_parent = canvas.get_parent()
canvas.reparent(offscreen_window)

# do snapshot

canvas.reparent(original_parent)
Run Code Online (Sandbox Code Playgroud)