2011-02-09 51 views
11

GTKウィンドウの外観と、それに含まれるすべてのボタンやその他のウィジェットをPNGまたはPDFファイルに保存します。カイロはそのような面での描画をサポートしています。 GTKウィジェットに何とかカイロの表面に描くように頼んでもらえますか? GTKとCairoの新人ですので、コードサンプルが大変ありがとうございます。 Pythonが私の選択言語です。カイロ表面の上にGTKウィジェットを描画する方法

答えて

10

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

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) 
関連する問題