Pygtk3:对象没有属性'cairo_create'

时间:2014-01-18 16:56:15

标签: python gtk pygtk cairo

我想在窗口中构建一个表;然后在每个单元格中,我想放置一个Gtk.DrawingArea,然后为每个人绘制一个矩形。

但是我无法理解如何创建cairo上下文,因为我收到了这个错误:

AttributeError: 'NoneType' object has no attribute 'cairo_create'

下面我将向您展示我的代码(它仍然是原型,但我想学习如何将cairo上下文绑定到正确的对象):

#!/usr/bin/python3  
import pygtk
pygtk.require('2.0')
import gtk

class collega_GUI:  
    def __init__(self):
            self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.window.set_title("Drawing Area Example")
            self.window.connect("destroy", lambda w: gtk.main_quit())

            self.rows=3
            self.columns=3
            self.table = gtk.Table(self.rows,self.columns,True)
            self.window.add(self.table)

            self.DrawingArea_list = list()
            for i in range(self.rows*self.columns):
                self.DrawingArea_list.append(gtk.DrawingArea())

            for row in range(0,self.rows):
                for column in range(0,self.columns):
                    cr = self.DrawingArea_list[row*2+column].window.cairo_create()
                cr.set_line_width(9)
                cr.set_source_rgb(0.7, 0.2, 0.0)
                cr.rectangle(0.25, 0.25, 0.5, 0.5)
                cr.stroke()
                cr.set_source_rgb(0.5, 0.2, 0.3)
                cr.fill()
                self.table.attach(self.DrawingArea_list[row*2+column], row, row+1, column, column+1)

                self.window.show()

if __name__ == '__main__':
    prova = collega_GUI()
    gtk.main()

1 个答案:

答案 0 :(得分:1)

由于错误消息显示此时GdkWindow不存在,因此您无法进行绘制。

所有绘图都应该在DrawingAreas的相应信号处理程序中进行:在GTK 2中,信号为"expose-event",在信号处理程序中,您应该创建Cairo上下文并在每次处理程序时绘制调用。 This answer有一个使用DrawingArea子类的例子(这是一个明智的想法)

只是警告,在GTK3中这部分有点不同。