13

GTK ウィンドウの外観と、そこに含まれるすべてのボタンとその他のウィジェットを PNG または PDF ファイルに保存したいと考えています。Cairo は、そのような表面への描画をサポートしています。どうにかして、GTK ウィジェットに Cairo サーフェス上に自分自身を描画するように依頼できますか? 私はGTKとCairoの両方に慣れていないので、コードサンプルをいただければ幸いです。Python は私が選んだ言語です。

4

2 に答える 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)
于 2012-03-06T04:52:19.327 に答える
10

C では、ボタンとウィジェットをGtkOffscreenWindowusingに配置しgtk_widget_reparent()、 を使用gtk_offscreen_window_get_pixbuf()して にレンダリングしGdkPixbuf、それをファイルに保存できます。申し訳ありませんが、Python コードはありませんが、オフスクリーン ウィンドウは PyGTK でまだ利用できないと思います。

于 2011-02-09T14:40:02.947 に答える