2011-02-09 18 views
11

Bir GTK penceresinin görünümünü ve içerdiği tüm düğmeleri ve diğer parçacıkları bir PNG veya PDF dosyasına kaydetmek istiyorum. Kahire böyle yüzeylerde çizim yapmayı destekliyor. Bir şekilde GTK widget'ının kendisini Kahire yüzeyine çekmesini isteyebilir miyim? Bir kod örneği, hem GTK hem de Kahire'nin yeni üyesi olduğum için çok takdir edilecek. Python benim tercihimdir.Kahire yüzeyinin üstünde herhangi bir GTK parçacığı nasıl çizilir?

cevap

10

C olarak, gtk_widget_reparent() kullanarak GtkOffscreenWindow da düğmeler ve widget'lar koymak ve daha sonra daha sonra bir dosyaya kaydedebileceğiniz bir GdkPixbuf, üzerine işlemek için gtk_offscreen_window_get_pixbuf() kullanabilirsiniz. Üzgünüz, herhangi bir Python kodum yok, fakat ekran penceresinin PyGTK'de henüz mevcut olduğunu düşünmüyorum.

10

Ne ptomato diyor. Ekrandan çıkarmanız gerekirse bir Gtk.OffscreenWindow kullanın, aksi takdirde Gdk penceresini ve widget'ı kopyalamak için ayırın. İşte herhangi bir widget'ın anlık görüntüsünü almak için kullanılabilecek bir snippet. Aşağıdaki kodun gösterdiği gibi, bunu Kahire bağlamında oluşturmak için Gtk.Widget.draw() yöntemini de kullanabilirsiniz.

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 söylediği gibi) geçici olarak anlık yapmak için, bu Gtk.OffscreenWindow bir widget Reparent edebilirsiniz.

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

# do snapshot 

canvas.reparent(original_parent)