IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Acces ecriture sur un attribut via un dictionnaire


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut Acces ecriture sur un attribut via un dictionnaire
    Bonjour à tous.

    Après avoir cherché un moment, je viens demander conseil à propos des dictionnaires.

    En effet, j'ai des objets avec des attributs, j'ai une fenetre avec des labels et des champs de saisie. Sur chaque ligne, un label et un champ de saisie.

    Je précise que le code qui pose problème est dans une sous-classe, qui construit une fenetre Toplevel, sous Tkinter.

    Je voudrais mettre à jour des attributs d'objets dispersés dans mon programme, lorsqu'on clique sur le bouton "Recuperer les valeurs". Pour cela je souhaite faire appel à un dictionnaire dont je complète les associations, et ensuite automatiser l'action grâce à un compteur i (et les boucles for ou while qui vont bien).

    Le souci est que je ne peux pas ecrire dans l'objet avec cette méthode. Ca fonctionne si j'écris directement dans l'objet, mais je n'y arrive pas en passant par le dictionnaire, l'attribut n'est pas modifié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    def __init__ (self) :
            global association
            global liste
     
            self.association = {0: objetA.attribut}
            self.liste= {0 : self.objetB.champSaisie}
     
     
            self.association = {1: objetC.attribut}
            self.liste= {1 : self.objetD.champSaisie}
     
     
     
        def Appliquer(self) :
     
            self.association[i] = self.liste[i].valeur.get()
     
     
        def Raffraichir(self) :
            self.liste[i].valeur.set(self.association[i])
    Sachant que si je tape à la main : objetA.attribut = self.objetB.champSaisie.get(), celà fonctionne, je suis ouvert aux conseils qui me permettraient de résoudre ce souci.

    Merci par avance pour vos conseils éventuels.

  2. #2
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Bonjour

    je n'ai pas lu le détail de tes explications car mon attention a été retenue par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.association = {0: objetA.attribut}
    self.liste= {0 : self.objetB.champSaisie}
    suivi, dans la même méthode (le constructeur), par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.association = {1: objetC.attribut}
    self.liste= {1 : self.objetD.champSaisie}
    Les deux premières lignes ne servent strictement à rien étant donné que tu réaffectes (ce n'est pas une modification ou une mise à jour) self.association et self.liste. Est-ce que ça affecte le problème posé (que, du coup, je n'ai pas lu) ?

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    En dehors du problème mentionné par plxpy, et du i non initialisé qui apparait ensuite, je crois comprendre l'objectif...

    Je propose ceci: dans les associations, enregistrer une référence à l'objet et le nom de l'attribut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    associations[0] = (objetA, "attribut")
    Pour "appliquer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    setattr(obj, attr, self.liste[i].valeur.get())
    Pour "rafraîchir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    self.liste[i].valeur.set(getattr(obj, attr))
    Je ne suis pas sûr qu'un dictionnaire soit la structure de donnée la mieux adaptée pour tout cela. Pourquoi pas une simple liste ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Bonjour

    je n'ai pas lu le détail de tes explications car mon attention a été retenue par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.association = {0: objetA.attribut}
    self.liste= {0 : self.objetB.champSaisie}
    suivi, dans la même méthode (le constructeur), par ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.association = {1: objetC.attribut}
    self.liste= {1 : self.objetD.champSaisie}
    Les deux premières lignes ne servent strictement à rien étant donné que tu réaffectes (ce n'est pas une modification ou une mise à jour) self.association et self.liste. Est-ce que ça affecte le problème posé (que, du coup, je n'ai pas lu) ?
    En fait je ne reaffecte pas. Le chiffre 0 ou 1 correspond à un "numéro" de correspondance entre champ de saisie et attribut à modifier. En fait j'ai essayé de trouver une solution pour associer un numéro (afin de pouvoir utiliser une boucle for ou while) avec un champ de saisie et l'attribut d'un objet.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Citation Envoyé par dividee Voir le message
    En dehors du problème mentionné par plxpy, et du i non initialisé qui apparait ensuite, je crois comprendre l'objectif...

    Je propose ceci: dans les associations, enregistrer une référence à l'objet et le nom de l'attribut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    associations[0] = (objetA, "attribut")
    Pour "appliquer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    setattr(obj, attr, self.liste[i].valeur.get())
    Pour "rafraîchir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    self.liste[i].valeur.set(getattr(obj, attr))
    Je ne suis pas sûr qu'un dictionnaire soit la structure de donnée la mieux adaptée pour tout cela. Pourquoi pas une simple liste ?
    Merci à vous deux de vous être penché sur ce souci.

    Ce que tu proposes m'a l'air d'être une bonne idée, je vais essayer de ce pas. Je te tiens au courant dès que l'essai est fait.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Citation Envoyé par dividee Voir le message
    En dehors du problème mentionné par plxpy, et du i non initialisé qui apparait ensuite, je crois comprendre l'objectif...

    Je propose ceci: dans les associations, enregistrer une référence à l'objet et le nom de l'attribut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    associations[0] = (objetA, "attribut")
    Pour "appliquer":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    setattr(obj, attr, self.liste[i].valeur.get())
    Pour "rafraîchir":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    obj, attr = associations[i]
    self.liste[i].valeur.set(getattr(obj, attr))
    Je ne suis pas sûr qu'un dictionnaire soit la structure de donnée la mieux adaptée pour tout cela. Pourquoi pas une simple liste ?
    Ca marche impeccablement bien ! Merci beaucoup pour ton aide !

    Une petite question (j'ai enlevé la déclaration des listes en global). Pourquoi est-ce que cela fonctionne alors que mes listes ne sont plus déclarées en global ?

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Une petite question (j'ai enlevé la déclaration des listes en global). Pourquoi est-ce que cela fonctionne alors que mes listes ne sont plus déclarées en global ?
    On fait des tests ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >>> def test(b):
    ...     global a
    ...     a = 5
    ...     print "a vaut {} et b vaut {}".format(a, b)
    ...     print "les globals sont dans ce dictionnaire :"
    ...     print globals()
    ...     print "les locals sont dans ce dictionnaire :"
    ...     print locals()
    ... 
    >>> test(12)
    a vaut 5 et b vaut 12
    les globals sont dans ce dictionnaire :
    {'a': 5, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, 'test': <function test at 0x7fdc5b51bf50>, '__name__': '__main__', '__doc__': None}
    les locals sont dans ce dictionnaire :
    {'b': 12}

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par luluunix Voir le message
    Une petite question (j'ai enlevé la déclaration des listes en global). Pourquoi est-ce que cela fonctionne alors que mes listes ne sont plus déclarées en global ?
    Ben c'est l'orientation objet. Ce n'est pas la variable globale association qui est utilisée mais self.association, qui est un attribut de l'objet. Sa visibilité dépend de celle de l'instance de la classe, et cette instance est automatiquement passée comme premier argument (self) aux méthodes de l'objet (c'est explicite en Python). Imagine que self est un genre dictionnaire, qui contient une clé "association", et tu ne sera pas loin de la vérité.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Comme vous utilisez tkinter, les "champsaisie" peuvent généralement être définis comme "Variables" Tk et se décliner en IntVar, StringVar,...

    Un objet devra toujours avoir sa collection d'attributs et de variables correspondantes associées, mais Tk s'occupe de les mettre à jour "automatiquement".

    Comme vous ne nous avez pas trop montré de code sur la partie tk, je ne peux que vous proposer un exemple qui ne sera peut être pas adapté à ce que vous voulez...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import Tkinter as tk
    from Tkconstants import *
     
    class Object:
        _attrs = 'var1', 'var2'
        def __init__(self):
            for x in self._attrs:
                setattr(self, x, tk.StringVar(value=x))
                getattr(self, x).trace_variable(mode='w', callback=self._update)
        def _update(self, *args):
            print (self)
        def __str__(self):
            return ', '.join('%s=%s' % (x, getattr(self, x).get()) \
                             for x in self._attrs)
    root = tk.Tk()
    obj = Object()
    for x in obj._attrs:
        tk.Entry(root, textvariable=getattr(obj, x)).pack(side=TOP)
    root.mainloop()
    Ca fait quoi?
    .attrs liste les variables de l'objet qui doivent être affichées côté GUI,
    Pour chacune de ces variables, on crée une .Entry dont le contenu sera associé à la Variable,
    J'ai collé un callback à la variable qui permet d'afficher la valeur des variables après une modification dans le GUI. C'est juste là pour montrer que çà "fonctionne".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Merci beaucoup à vous tous pour vos explications. Je vais étudier vos exemples pour bien comprendre tout ça.

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. accès simultanément sur un fichier via ssh
    Par MSM_007 dans le forum Linux
    Réponses: 0
    Dernier message: 04/05/2010, 11h18
  2. Réponses: 4
    Dernier message: 12/04/2010, 18h40
  3. [2K5] Droits d'accès sur les tables; via une stored procedure
    Par cavo789 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/04/2008, 06h57
  4. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  5. Réponses: 7
    Dernier message: 12/04/2006, 23h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo