Gestion d'un widget Table - 2

Tagged:

Bon j'ai fais un peu murir l'idée ... il y a tout un tas de choses qui n'allait pas dans le billet précédent !!!

On était obligé de définir un objet a chaque fois, un objet qui ne faisait rien du tout d'autre que stoquer des données ... et on ne pouvait pas avoir des colonnes avec accents enfin bref c'était pas terrible ... pratique mais pas au point ;)

Voila l'idée murie : On fait un objet TObject qui se chargera de stoquer les données et de donner la possibilité de faire un mapping entre le nom des colonnes et le nom des propriétées ... Cet objet fonctionne pour bien des situations et si on veut faire quelque chose de particulier c'est possible grâce à l'héritage ...

Voici l'objet en question :

class TObject:
    def __init__(self,mapping,values):
        if type(mapping) != dict:
            keys = mapping
            mapping = dict([(m,m) for m in mapping])
        else:
            keys = mapping.keys()
 
        self.mapping = mapping
 
        if type(values) != dict:
            values = dict([(key,val) for key,val in zip(keys,values)])
        self.values = values
    
    def get(self,data):
        return self.values[self.mapping[data]]

Voila j'apprends plein de choses en faisant ça ... rien que la technique du zip() qui parcours deux tableaux en même temps, la technique qui consiste a faire [elt for elt in elts] ... enfin c'est instructif ;)

Du coup notre fonction TreeObject ne fonctionne plus... Pour qu'elle fonctionne on aurait du faire

        [setattr(self,k,v) for k,v in values] #à la place de self.values = values

mais j'aime pas l'idée d'accéder directement a une propriété ... pour étendre cet objet il faudrait bidouiller tandisqu'avec la fonction get il suffit de surcharger la fonction ;)

Donc voici la fonction qui fonctionne avec ce type d'objets :

def TreeObject(column, renderer, model, iter, data):
    item = model.get_value(iter, 0)
    if item == None:
        return
    renderer.set_property('text', item.get(data))

en plus c'est plus simple ;)

Pour l'utilisation :

class MainWindow(GLObject):
    def __init__(self):
        GLObject.__init__(self,"monFichier.glade","winMain")
 
        treeTables = self.widgets.get_widget('treeTables')
        self.tree = TreeView(treeTables)
        self.treeCols = ['col1','col2']
        self.tree.setColumns(self.treeCols)
        
        self.tree.append(TObject(self.treeCols,['test','test2']))

Pour une utilisation simple sans mapping, enfin je suppose que si vous saisissez les besoins du mapping, vous comprenez également comment s'en servir ;)

[Edit]
Bugfix sur le TObject... la fonction dict ne garde pas l'ordre de la liste passé en paramètre alors le contenu des colonnes était mélangé !!!

Comments

Grand merci pour ces informations qui m'ont été très utiles!