2011-02-09 90 views
11

我想保存一个GTK窗口的外观,以及它包含的所有按钮和其他小部件到PNG或PDF文件。开罗支持在这些表面上绘图。 我能以某种方式请求一个GTK小部件在开罗表面绘制自己吗? 代码示例将非常感谢,因为我是GTK和开罗的新手。 Python是我选择的语言。如何在开罗表面上绘制任何GTK小部件

回答

10

在C语言中,你可以把你的按钮和小部件在使用GtkOffscreenWindowgtk_widget_reparent()然后用gtk_offscreen_window_get_pixbuf()以使其到GdkPixbuf,然后你就可以保存到一个文件中。对不起,我没有任何Python代码,但我不认为PyGTK中的屏幕外窗口可用。

10

ptomato说什么。如果您需要在屏幕外执行此操作,请使用Gtk.OffscreenWindow,否则只需获取Gdk窗口和窗口小部件的分配即可将其剪下。这是一个可用于获取任何窗口小部件快照的片段。如下面的代码所示,您还可以使用Gtk.Widget.draw()方法在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') 

可以暂时重新设置父级的窗口小部件(如ptomato说的)这个Gtk.OffscreenWindow,为了使快照。

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

# do snapshot 

canvas.reparent(original_parent)