我想在窗口中构建一个表;然后在每个单元格中,我想放置一个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()
答案 0 :(得分:1)
由于错误消息显示此时GdkWindow
不存在,因此您无法进行绘制。
所有绘图都应该在DrawingAreas
的相应信号处理程序中进行:在GTK 2中,信号为"expose-event"
,在信号处理程序中,您应该创建Cairo上下文并在每次处理程序时绘制调用。 This answer有一个使用DrawingArea
子类的例子(这是一个明智的想法)
只是警告,在GTK3中这部分有点不同。