2011-12-22 52 views
4

我目前正在通過PyGobject學習GTK +,需要類似畫布的東西。我已經搜索了這些文檔,發現了兩個看起來可能完成這個工作的小部件:GtkDrawingArea和GtkLayout。我需要一些基本的功能,如fillrect或drawline ...事實上,這些功能可從c,但我無法找到方向如何使用它們從python。你能推薦一個教程或手冊頁來處理他們的python等價物嗎?Python GTK + Canvas

如果你有一個更好的主意如何得到類似於畫布的東西,每一個提示將不勝感激。我仍然在學習,只要它可以嵌入到我的Gtk應用程序中,我就會滿足於任何解決方案。

+1

的apropriate小部件是GtkDrawingArea。我現在沒有任何樣本,但是您應該使用pycairo來繪製它,作爲對「揭露」事件的反應。 – rodrigo 2011-12-22 19:19:36

+0

這意味着GtkDrawingArea只是一個可以被其他框架填充的容器嗎? GTK +中是否包含任何畫布? – lhk 2011-12-22 19:33:13

+1

@rodrigo根據[參考手冊](http://developer.gnome.org/gtk3/3.3/ch25s02.html#id1413935),'expose-event'信號已被gtk3中的'draw'信號取代。 – jcollado 2011-12-22 20:00:42

回答

10

爲了說明在意見中提出我的觀點,讓我張貼的使用GtkDrawingArea創建一個畫布,畫成其使用開羅

修正一個quick'n'dirty PyGTK的例子:你說PyGObject,即GTK + 3,所以示例如下(主要的區別是,沒有expose事件,相反,它是draw和開羅上下文作爲參數已經通過):

#!/usr/bin/python 
from gi.repository import Gtk 
import cairo 
import math 

def OnDraw(w, cr): 
    cr.set_source_rgb(1, 1, 0) 
    cr.arc(320,240,100, 0, 2*math.pi) 
    cr.fill_preserve() 

    cr.set_source_rgb(0, 0, 0) 
    cr.stroke() 

    cr.arc(280,210,20, 0, 2*math.pi) 
    cr.arc(360,210,20, 0, 2*math.pi) 
    cr.fill() 

    cr.set_line_width(10) 
    cr.set_line_cap(cairo.LINE_CAP_ROUND) 
    cr.arc(320, 240, 60, math.pi/4, math.pi*3/4) 
    cr.stroke() 

w = Gtk.Window() 
w.set_default_size(640, 480) 
a = Gtk.DrawingArea() 
w.add(a) 

w.connect('destroy', Gtk.main_quit) 
a.connect('draw', OnDraw) 

w.show_all() 

Gtk.main() 
+0

好吧,集成pygame的優勢比明顯。事件提供了開羅語境,這一事實非常美麗。我會將其標記爲問題的答案。當然,我會欣賞替代想法,儘管這看起來很完美。 – lhk 2011-12-23 10:23:37

+0

非常感謝你 – lhk 2011-12-23 10:23:53

+0

嘿,我剛剛實際運行你的代碼。酷! – lhk 2011-12-31 17:42:45