Как нарисовать любой виджет 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)