我想保存一個GTK窗口的外觀,以及它包含的所有按鈕和其他小部件到PNG或PDF文件。開羅支持在這些表面上繪圖。 我能以某種方式請求一個GTK小部件在開羅表面繪製自己嗎? 代碼示例將非常感謝,因爲我是GTK和開羅的新手。 Python是我選擇的語言。如何在開羅表面上繪製任何GTK小部件
11
A
回答
10
在C語言中,你可以把你的按鈕和小部件在使用GtkOffscreenWindow
和gtk_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)
相關問題
- 1. 如何在開羅/ Gtk繪製圓角圖像?
- 2. GTK + /開羅 - 繪製到臨時圖層?
- 3. 繪製圖像的一部分開羅表面
- 4. 如何在開羅上下文中使用Skia繪製Gtk3
- 5. 如何繪製子類DrawingArea小部件?
- 6. Java:如何在儘可能小的表面上繪製圖像?
- 7. 如何從開羅表面創建GtkImage?
- 8. 如何複製或複製gtk小部件?
- 9. 如何旋轉gtk小部件?
- 10. 如何更改GTK +中任意小部件的顏色?
- 11. 開羅和高DPI繪圖(視網膜上表面,OS X圖)
- 12. Qt4如何在小部件內部繪製?
- 13. 如何繪製表面圖
- 14. 在GTK中,如何在屏幕上獲取小部件的實際大小?
- 15. 開羅圖像不在GtkDrawingArea上繪畫
- 16. 如何在Gtk#窗口上繪製某些東西(線,圓等)?
- 17. 如何直接在桌面上繪製?
- 18. 如何在桌面上繪製文字?
- 19. 如何在指針向下事件的位置上繪製CustomPaint小部件?
- 20. 多線程,gtk3和開羅:在開羅表面拉絲
- 21. GTK或Qt的圖表小部件
- 22. 撥號/儀表GTK小部件
- 23. 如何在小圖上用很多點繪製圖表
- 24. GTK 2.9需要什麼開羅才能編譯(在Lucid Lynx上)?
- 25. 如何在圖表上繪製線條?
- 26. 堆疊GTK +小部件
- 27. 如何在GTK +中設置小部件的位置?
- 28. 在現有的sdl_opengl上下文上繪製小部件
- 29. 如何控制稍後在c中用gtk添加的小部件?
- 30. 繪製任何矩形到一個GTK + DrawingArea填充整個DrawingArea