Sobre pygtk y TreeView

Pepe Aracil pepe en diselpro.com
Vie Mar 5 12:34:02 CET 2004


Hola Lorenzo.

Antes que nada, darte las gracias por el magnifico tutorial de pygtk 2.0.

>Con un TreeView lo maximo que puedes conseguir es que pinte las filas
>pares de un color y las impares de otro. Supongo que eso ya lo habras
>probado pero por si acaso:

Si, ya lo he probado, pero no me sirve :-(, necesito dibujar lineas de 
separación entre las celdas.... bueno por no hay mal que por bien no venga y 
seguro que terminaré aprendiendo un huevo sobre los CellRenders :-)))

>Cuando dices de hacerte un widget yo distingo dos casos:
>- Tu widget es composicion de otros widgets existentes (como un
>GtkFileSelector).
>- Tu widget no es composicion de otros widgets y hay que hacerlo 'desde
>cero'.

Mi widget es un dígito de 7 segmentos. En teoría solo me hacia falta un 
"lienzo" para pintar los segmentos y capturar unas cuantas callback's como
expose_event para repintarlo cuando haga falta. La verdad es que durante el
tiempo que la lista de correo ha estado colgada y no podia preguntar la mejor 
forma de hacerlo, tuve que intentarlo heredando de DrawingArea.

Envío el código por si a alguien  encuentra algún fallo garrafal 
debido a mi falta de experiencia con python y pygtk ó se le ocurre algo para 
mejorarlo.


Saludos.


class Segments(gtk.DrawingArea):

    def __init__(self, segw = 3, on = "#FF0000", off = "#D0D0D0"):
        gtk.DrawingArea.__init__(self)
        self.gc_on = None  # inicializado en el manejador realize-event
        self.gc_off = None  # idem
        self.on_color = on
        self.off_color = off
        self.width  = 0 # actualizado en el manejador size-allocate
        self.height = 0 # idem
        self.segment_width = segw
        self.segments=(0,)*8
        self.connect('size-allocate', self.on_size_allocate)
        self.connect('expose-event', self.on_expose_event)
        self.connect('realize', self.on_realize)

    def set_segments(self, segments):
        self.segments=segments
        self.window.invalidate_rect((0,0,self.width,self.height),gtk.FALSE)
        

    def on_realize(self, widget):
        self.gc_on = widget.window.new_gc()
        self.gc_on.foreground=widget.get_colormap().alloc_color(self.on_color)
        self.gc_on.line_width = 1
        self.gc_on.fill=gtk.gdk.SOLID
        self.gc_off = widget.window.new_gc()
        self.gc_off.foreground=widget.get_colormap().alloc_color(self.off_color)
        self.gc_off.line_width = 1
        self.gc_off.fill=gtk.gdk.SOLID

    def on_size_allocate(self, widget, allocation):
        self.width = allocation.width
        self.height = allocation.height

    def on_expose_event(self, widget, event):
        w = (self.width - 1 ) - (self.segment_width * 2 + 1)
        h = self.height - 1
        p = self.segment_width
        
        gctuple = (self.gc_off,self.gc_on)
        gc = gctuple[self.segments[0]]
        widget.window.draw_polygon(gc,gtk.TRUE,((p,p),(p*2,0),(w-p*2,0),
(w-p,p),(w-p*2,p*2),(p*2,p*2)))        
        
        gc = gctuple[self.segments[6]]
        widget.window.draw_polygon(gc,gtk.TRUE,((p,h/2),(p*2,h/2-p),
(w-p*2,h/2-p),(w-p,h/2),(w-p*2,p+h/2),(p*2,p+h/2)))        
        
        gc = gctuple[self.segments[3]]
        widget.window.draw_polygon(gc,gtk.TRUE,((p,h-p),(p*2,h-p*2),
(w-p*2,h-p*2),(w-p,h-p),(w-p*2,h),(p*2,h)))        

        gc = gctuple[self.segments[5]]
        widget.window.draw_polygon(gc,gtk.TRUE,((p,p),(p*2,p*2),(p*2,h/2-p),
(p,h/2),(0,h/2-p),(0,p*2)))        

        gc = gctuple[self.segments[1]]
        widget.window.draw_polygon(gc,gtk.TRUE,((w-p,p),(w,p*2),(w,h/2-p),
(w-p,h/2),(w-p*2,h/2-p),(w-p*2,p*2)))        

        gc = gctuple[self.segments[4]]
        widget.window.draw_polygon(gc,gtk.TRUE,((p,h/2),(p*2,p+h/2),
(p*2,h-p*2),(p,h-p),(0,h-p*2),(0,p+h/2)))        

        gc = gctuple[self.segments[2]]
        widget.window.draw_polygon(gc,gtk.TRUE,((w-p,h/2),(w,p+h/2),(w,h-p*2),
(w-p,h-p),(w-p*2,h-p*2),(w-p*2,p+h/2)))        

        gc = gctuple[self.segments[7]]
        widget.window.draw_rectangle(gc,gtk.TRUE,w+2,h-p*2,p*2,p*2)




Más información sobre la lista de distribución Python-es