Как нарисовать любой виджет GTK поверх поверхности Каира

Я хотел бы сохранить внешний вид окна GTK и всех кнопок и других виджетов, которые он содержит, в файл PNG или PDF. Каир поддерживает рисование на таких поверхностях. Могу ли я как-нибудь попросить виджет GTK нарисовать себя на поверхности Каира? Пример кода очень ценится, так как я новичок в GTK и Каире. Python - мой любимый язык.

2 ответа

В C вы можете поместить свои кнопки и виджеты в GtkOffscreenWindow с помощью gtk_widget_reparent() а затем использовать gtk_offscreen_window_get_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)
Другие вопросы по тегам