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

13

我想将一个GTK窗口及其中包含的所有按钮和其他小部件的外观保存为PNG或PDF文件。Cairo支持在这些表面上进行绘制。有什么办法可以让GTK小部件在Cairo表面上自行绘制吗?鉴于我对GTK和Cairo都是新手,如果能提供一份代码示例,那就太好了。我的编程语言是Python。

2个回答

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')

你可以像ptomato所说的那样,将一个小部件暂时重新分配给这个Gtk.OffscreenWindow,以便进行快照。

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

# do snapshot

canvas.reparent(original_parent)

10

在C语言中,你可以使用GtkOffscreenWindow来放置你的按钮和小部件,并使用gtk_widget_reparent()将它们重新定位,然后使用gtk_offscreen_window_get_pixbuf()将它们呈现到一个GdkPixbuf中,然后可以将其保存到文件。很抱歉我没有Python代码,但我认为目前PyGTK中还没有离屏窗口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接