2011-02-09 8 views
11

Vorrei salvare l'aspetto di una finestra GTK e tutti i pulsanti e altri widget che contiene in un file PNG o PDF. Il Cairo supporta il disegno su tali superfici. Potrei chiedere in qualche modo a un widget GTK di disegnarsi sulla superficie del Cairo? Un esempio di codice sarebbe molto apprezzato, dal momento che sono un nuovo arrivato sia per GTK che per Il Cairo. Python è il mio linguaggio preferito.Come disegnare qualsiasi widget GTK sulla superficie del Cairo

risposta

10

In C, si può mettere i pulsanti e widget in un GtkOffscreenWindow utilizzando gtk_widget_reparent() e quindi utilizzare gtk_offscreen_window_get_pixbuf() per renderlo su un GdkPixbuf, che è possibile salvare in un file. Scusa se non ho alcun codice Python, ma non penso che la finestra fuori schermo sia ancora disponibile in PyGTK.

10

Cosa dice ptomato. Usa Gtk.OffscreenWindow se hai bisogno di farlo fuori dallo schermo, altrimenti prendi semplicemente la finestra di Gdk e l'allocazione del widget per ritagliarla. Ecco uno snippet che può essere utilizzato per ottenere un'istantanea di qualsiasi widget. Come mostra il codice seguente, puoi anche usare il metodo Gtk.Widget.draw() per renderlo nel contesto di 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') 

È possibile Reparent temporaneamente un widget (come diceva ptomato) di questa Gtk.OffscreenWindow, al fine di rendere l'istantanea.

original_parent = canvas.get_parent() 
canvas.reparent(offscreen_window) 

# do snapshot 

canvas.reparent(original_parent)