2011-02-09 17 views
11

Chciałbym zapisać wygląd okna GTK, a także wszystkie przyciski i inne widżety, które zawiera plik PNG lub PDF. Kair wspiera rysowanie na takich powierzchniach. Czy mogę poprosić widżet GTK, aby narysował się na powierzchni Kairu? Próba kodu byłaby bardzo cenna, ponieważ jestem nowym graczem zarówno w GTK, jak i w Kairze. Python jest moim wybranym językiem.Jak narysować dowolny widget GTK na powierzchni Kairu

Odpowiedz

10

W C, można umieścić przyciski i widżety w GtkOffscreenWindow użyciu gtk_widget_reparent() a następnie użyć gtk_offscreen_window_get_pixbuf() aby uczynić go na GdkPixbuf, które można następnie zapisać do pliku. Przepraszam, nie mam żadnego kodu Pythona, ale nie sądzę, że okno poza ekranem jest już dostępne w PyGTK.

10

Co mówi ptomato. Użyj Gtk.OffscreenWindow, jeśli chcesz zrobić to poza ekranem, w przeciwnym razie po prostu pobierz okno Gdk i alokację widżetu, aby go przyciąć. Oto fragment, za pomocą którego można uzyskać migawkę dowolnego widżetu. Jak pokazuje poniższy kod, możesz również użyć metody Gtk.Widget.draw(), aby renderować ją w kontekście Kairu.

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') 

Można tymczasowo reparent widget (jak ptomato powiedział) do tej Gtk.OffscreenWindow, w celu uczynienia migawkę.

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

# do snapshot 

canvas.reparent(original_parent)