2011-02-09 5 views
11

GTK 윈도우와 그 안에 포함 된 모든 버튼 및 기타 위젯을 PNG 또는 PDF 파일로 저장하고 싶습니다. 카이로는 그러한 표면을 그리는 것을 지원합니다. 어떻게 든 GTK 위젯에 카이로 표면에 그려달라고 부탁 할 수 있을까요? 코드 샘플은 GTK와 Cairo의 신인입니다. Python이 제 언어입니다.카이로 표면 위에 어떤 GTK 위젯을 그리는 방법

답변

10

는 C에서, 당신은 gtk_widget_reparent()를 사용하여 GtkOffscreenWindow에 버튼과 위젯을 넣어 다음 다음 파일로 저장할 수 있습니다 GdkPixbuf,에 그것을 렌더링하는 gtk_offscreen_window_get_pixbuf()를 사용할 수 있습니다. 죄송합니다. 파이썬 코드가 없지만 아직 PyGTK에서 오프 스크린 창을 사용할 수 있다고 생각하지 않습니다.

10

ptomato는 다음과 같이 말합니다. 화면에서 해제해야하는 경우 Gtk.OffscreenWindow를 사용하십시오. 그렇지 않으면 Gdk 창과 위젯의 할당을 가져와 클립으로 잘라냅니다. 다음은 위젯의 스냅 샷을 얻는 데 사용할 수있는 스 니펫입니다. 다음 코드에서 볼 수 있듯이 Gtk.Widget.draw() 메서드를 사용하여 카이로 컨텍스트에서 렌더링 할 수도 있습니다.

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에 위젯을 reparent 수 있습니다.

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

# do snapshot 

canvas.reparent(original_parent) 
관련 문제