我想将 GTK 窗口的外观以及它包含的所有按钮和其他小部件保存到 PNG 或 PDF 文件中。Cairo 支持在此类表面上绘图。我可以以某种方式要求 GTK 小部件在开罗表面上绘制自己吗?非常感谢代码示例,因为我是 GTK 和 Cairo 的新手。Python 是我选择的语言。
问问题
4635 次
2 回答
10
番茄说什么。如果您需要在屏幕外执行此操作,请使用 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)
于 2012-03-06T04:52:19.327 回答
10
在 C 中,您可以将按钮和小部件放在GtkOffscreenWindow
using 中gtk_widget_reparent()
,然后使用gtk_offscreen_window_get_pixbuf()
将其渲染到 a 上GdkPixbuf
,然后您可以将其保存到文件中。抱歉,我没有任何 Python 代码,但我认为 PyGTK 中还没有屏幕外窗口。
于 2011-02-09T14:40:02.947 回答