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