2010-04-29 14 views
1

Je dois afficher certaines données dans une arborescence. Le "vrai" modèle de données est énorme et je ne peux pas copier tout ce qui se trouve dans un TreeStore, donc je suppose que je devrais utiliser un GenericTreeModel pour agir comme une arborescence virtuelle. Btw, la première colonne est l'icône classique + style de texte et je pense que je devrais déclarer une colonne avec un CellRendererPixbuf (faq sample), mais je ne suis pas sûr de ce que les méthodes du modèle on_get_n_columns() et on_get_value() devraient retourner. C'est à la fois un Pixbuf et une valeur de chaîne pour la même colonne.Comment rendre des colonnes personnalisées avec un GenericTreeModel

+0

Vos données sont-elles énormes, car elles contiennent beaucoup de lignes ou parce que chaque ligne contient de grandes quantités de données? – krawyoti

+0

beaucoup de lignes. et des colonnes aussi, mais je n'ai besoin de montrer que certaines d'entre elles. –

Répondre

0

Regardez at the tutorial, il y a un exemple qui emballe deux renderer de cellules à une colonne. La différence est que vous utilisez un modèle d'arborescence personnalisé et le comportement dépend de la façon dont vous modélisé votre modèle. Si vous avez une colonne avec le texte et une colonne avec le pixbuf vous pouvez utiliser set_attributes:

column = gtk.TreeViewColumn('Pixbuf and text') 
cell1 = gtk.CellRenderText() 
cell2 = gtk.CellRenderPixbuf() 
column.pack_start(cell1, True) 
column.pack_start(cell2, False) 
column.set_attribute(cell1, 'text', 0) # the first column contains the text 
column.set_attribute(cell2, 'pixbuf', 1) # the second column contains the pixbuf 

Vous pouvez avoir autrement un modèle d'arbre avec une seule colonne avec les objets qui contient tout ce que vous avez besoin, donc il suffit de définir un callback:

class MyObject: 
    def __init__(self, text, pixbuf): 
     self.text = text 
     self.pixbuf = pixbuf 

def cell1_cb(col, cell, model, iter): 
    obj = model.get_value(iter) 
    cell.set_property('text', obj.text) 

def cell2_cb(col, cell, model, iter): 
    obj = model.get_value(iter) 
    cell.set_property('pixbuf', obj.pixbuf) 

column = gtk.TreeViewColumn('Pixbuf and text') 
cell1 = gtk.CellRenderText() 
cell2 = gtk.CellRenderPixbuf() 
column.pack_start(cell1, True) 
column.pack_start(cell2, False) 
column.set_cell_data_func(cell1, cell1_cb) 
column.set_cell_data_func(cell2, cell2_cb) 

J'espère que je vous donne une idée de ce que vous pouvez faire et un point de départ. Disclaimer: Je n'ai pas testé le code.

+0

il semble exactement ce que je cherchais (premier cas, icône séparée et texte dans le modèle), je vais vérifier ce soir, merci –

+0

ok je l'ai essayé et la solution était exactement le tutoriel: avoir un modèle générique ou quelque chose d'autre "derrière" l'arbre ne fait aucune différence. Je vous remercie. –