2014-01-18 3 views
0

Я хочу построить таблицу в окне; то в каждой ячейке я хочу поставить Gtk.DrawingArea, а затем рисовать прямоугольник для всех.Pygtk: как работает cairo_create()?

Но я не могу понять, как создать контекст КАИР, потому что я получаю эту ошибку:

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

Здесь ниже я покажу вам мой код (это все еще прототип, но я хочу, чтобы узнать, как связать контекст Каира правого объекта):

#!/usr/bin/python3.3 

# example drawingarea.py 
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

как сообщение об ошибке говорит GdkWindow не существует в этой точке, так что вы не можете еще сделать.

Все чертежи должны выполняться в соответствующем сигнальном обработчике DrawingAreas: в GTK 2 сигнал «expose-event», а в обработчике сигнала вы должны создать контекст Каира и рисовать каждый раз, когда вызывается обработчик. This answer имеет пример с использованием подкласса DrawingArea (который является разумной идеей)

Просто предупреждение, в GTK3 эта часть немного отличается.

+0

Извините, но DrawingArea уже существует .. Я создал его раньше. В ** self.DrawingArea_list ** есть 9 DrawingArea. Так что, может быть, beacause я должен рисовать внутри обработчика сигнала для события-экспоната – FrancescoN

+0

. Есть места рисования, но в GdkWindows этих чертежей нет. Не до того, как объекты рисования будут реализованы (см. «Осознать» сигнал, если вам нужно знать, когда это произойдет). В любом случае, вы правы, что единственное правильное место для рисования в GtkWidget - в обработчике «expose-event». – jku

+0

Хорошо, но .. у меня не может быть окна для каждого DrawingArea .. как я могу это сделать? – FrancescoN

Смежные вопросы