CellRenderCombobox y Treeview: Cómo obtener una columna que no es la que se muestra.

Miguel Ángel García magmaxlistas en gmail.com
Jue Ago 14 20:22:05 CEST 2008


Hola a todos.

Estoy usando un TreeView con un CellRenderCombobox. El modelo del
combobox tiene dos columnas que representan datos de una base de datos,
por lo que, como suele ser habitual, tengo un ID y un TEXTO.

Cuando implemento la señal "on_change", el valor recibido en el campo
"new value" es sólo el texto, pero no consigo obtener el id
correspondiente a la misma fila del modelo del combobox.

Ahí va el código simplificado:
---------------------------------------------------------------------------------------
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
import gobject


def edit(cell, path, data, user_data=None):
    print cell, path, data, user_data
    if user_data:
        user_data[path][0]=data

w = gtk.Window()

#list store for cell
modelcell = gtk.ListStore(int, gobject.TYPE_STRING)
for x in range(1, 5):
    modelcell.append([x, "selection %d" % x])

#list store for treeview
modelstore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_OBJECT)
modelstore.append(("nothing selected 1", modelcell))
modelstore.append(("nothing selected 2", modelcell))

#Building the render
cb = gtk.CellRendererCombo()
cb.set_property("model",modelcell)
cb.set_property('text-column', 1)
cb.set_property('editable', gtk.TRUE)

#Setting signals
cb.connect('edited', edit, modelstore)

#Building treeview
# first: columns
c = gtk.TreeViewColumn("Test", cb)
c.set_attributes(cb, text = 0)
# second: treeview
t = gtk.TreeView()
t.append_column(c)
t.set_model(modelstore) 

#building the window
w.add(t)
w.show_all()
gtk.main()
---------------------------------------------------------------------------------------

Como se puede observar, trato de imprimir las herramientas de las que
dispongo en la función "edit" pero sólo tengo acceso al valor nuevo
(que puede estar repetido).

Creo que debe haber una manera sencilla de obtener únicamente el id y,
posteriormente, acceder al modelo para buscar la fila cuyo id sea el id
dado y poder seleccionar el texto a mostrar (y actualizar la BBDD,
claro). He tratado de cambiar la propiedad "text-column" para que me
pase el id:
cb.set_property("text-column", 0)
pero da error. Además, me muestra sólo los IDs y no los textos.

¿alguien puede echarme una mano?


Muchas gracias de antemano.


PD: Tal vez veáis este mail repetido en la lista pygtk. Hace un año que
abandoné mi pequeña utilidad por no ser capaz de resolver el problema y
he vuelto al ataque.... y me he vuelto a quedar atascado en el mismo
sitio. Por eso he decidido preguntar :(




-- 
In a world without walls and fences, who needs Windows and Gates?
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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