2011-02-09 22 views
11

Tôi muốn lưu giao diện của cửa sổ GTK và tất cả các nút và các tiện ích con khác chứa trong tệp PNG hoặc PDF. Cairo hỗ trợ vẽ trên các bề mặt như vậy. Tôi bằng cách nào đó có thể hỏi một widget GTK để vẽ chính nó trên bề mặt Cairo? Một mẫu mã sẽ được đánh giá cao, vì tôi là người mới đến cả GTK và Cairo. Python là ngôn ngữ tôi chọn.Cách vẽ bất kỳ tiện ích GTK nào trên bề mặt Cairo

Trả lời

10

Trong C, bạn có thể đặt các nút và tiện ích của mình trong GtkOffscreenWindow sử dụng gtk_widget_reparent() và sau đó sử dụng gtk_offscreen_window_get_pixbuf() để hiển thị nó trên GdkPixbuf, sau đó bạn có thể lưu vào tệp. Xin lỗi tôi không có bất kỳ mã Python, nhưng tôi không nghĩ rằng các cửa sổ offscreen có sẵn trong PyGTK được nêu ra.

10

Những gì ptomato nói. Sử dụng một Gtk.OffscreenWindow nếu bạn cần phải làm điều đó tắt màn hình, nếu không chỉ nhận được cửa sổ Gdk và phân bổ của widget để cắt nó. Dưới đây là một đoạn trích có thể được sử dụng để có được ảnh chụp nhanh của bất kỳ tiện ích con nào. Như đoạn mã sau đây, bạn cũng có thể sử dụng phương thức Gtk.Widget.draw() để render nó trong ngữ cảnh 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') 

Bạn có thể tạm thời sửa lại một tiện ích (như ptomato đã nói) với Gtk.OffscreenWindow này, để tạo ảnh chụp nhanh.

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

# do snapshot 

canvas.reparent(original_parent) 
Các vấn đề liên quan