Access Gtk.Treeiter interside render () Función de GTK.Cellrenderer - Pygtk
-
26-10-2019 - |
Pregunta
Estoy tratando de codificar lo siguiente: dos columnas. Uno contiene un elemento, el otro contiene un typeId. Quiero renderizar el itemId solo cuando el typeId es igual a un valor específico.
class IDRenderer(gtk.CellRendererText):
def __init__(self):
gtk.CellRendererText.__init__(self)
def do_render(self,window, widget, background_area, cell_area, expose_area, flags):
if ----} Condition to ask for value of the typeId - Cell {-----:
gtk.CellRendererText.do_render(self, window, widget, background_area, cell_area,
expose_area, flags)
gobject.type_register(IDRenderer)
No sé cómo obtener el ITER de la fila actualmente representada, que necesito para determinar el valor del TypeID. ¿Es esto incluso posible?
Solución
Ahora me enteré, gracias a un buen chico en #Pygtk en Gimpirc:
Puede hacerlo, con las llamadas funciones de datos de celdas llamadas a la correspondiente GTK.TreeviewColumn como se hace aquí en este ejemplo
def renderId(celllayout, cell, model, iter):
if model.get_value(iter,1) == 3:
cell.set_property('visible',True)
else:
cell.set_property('visible',False)
treeviewcolumn = gtk.TreeViewColumn()
renderer = gtk.CellRendererText()
treeviewcolumn.add_attribute(renderer,'text',0)
treeviewcolumn.set_cell_data_func(renderer,renderId)
Se omití algún código relevante para representar una vista completa, pero creo que muestra lo que quería hacer y cómo hacerlo.
La columna presenta el valor en la primera columna (0) del modelo solo si el valor en el segundo modelo COLUMN (1) es igual a 3
Espero que esto pueda ayudar a alguien en algún momento.
Otros consejos
No es posible hasta donde yo sepa. Debe usar propiedades del renderizador personalizado que se establecerá automáticamente mediante el código que llama a la función de renderizado. (Como el text
propiedad de CellRendererText
- El código de renderizado no obtiene el texto del modelo de árbol, pero el modelo de árbol establece el text
propiedad del renderizador antes de llamar al código de renderizado).