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 :

Interaction entre classes. Utilisation du "self"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut Interaction entre classes. Utilisation du "self"
    Développeuses, Développeurs, bonjour !

    encore un problème avec "self" en tentant de passer une variable d'une classe à une autre.
    Comment actualiser la fenêtre principale "uiClass" avec les données d'une sous-fenêtre "ClassPref" ?

    Le code épuré:
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    # La fenetre principale 
    class uiClass :
     
        def __init__ ( self, ... ) :
     
            # Champ texte
            self.ch_dest = tk.Text   ( self.frame, ... )
            # Menu depuis lequel on lance la sous-fenetre (Preferences)
            menuChoix.add_command ( label='Preferences', self.lance_pref () )
     
        def lance_pref ( self ) :
            # instance de la sous-fenetre (Preferences)
            inst_ClassPref = ClassPref ()
     
        def ch_actualisation ( self ) :
            # Ici la recuperation des donnees creees dans ClassPref
            # insertion de ces donnees dans le champ texte ch_dest
            self.ch_dest.insert ( 1.0, ClassPref.passer_pref_on_ok () )
     
    # La sous-fenetre: Classe des Preferences
    class ClassPref ( tk.Toplevel ) :
     
        def __init__ ( self, parent=uiClass ):
     
            self.parent = parent
            self.btn = tk.Button ( ... , command = self.passer_pref_on_ok () )
     
        def passer_pref_on_ok ( self ) :
     
            self.new_text = "du texte"
     
            # lance l actualisation de la fenetre principale (uiClass)       
            self.parent.ch_actualisation ( self.parent )
     
            return ( self.new_text )
    Message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python32\lib\tkinter\__init__.py", line 1456, in __call__
        return self.func(*args)
      File "C:/Python32/MES_PROGS/lettre10_python3_8.py", line 527, in passer_pref_on_ok
        self.parent.ch_actualisation ( self.parent )
      File "C:/Python32/MES_PROGS/lettre10_python3_8.py", line 389, in ch_actualisation
        self.ch_dest.insert ( 1.0, ClassPref.passer_pref_on_ok () )
    AttributeError: type object 'uiClass' has no attribute 'ch_dest'
    Comment se fait-il que l'instance de uiClass ne reconnaisse plus son champs défini dans son __init__ ?
    Je ne dois pas encore bien saisir l'histoire du "self" ...
    Merci pour toute info !

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.btn = tk.Button ( ... , command = self.passer_pref_on_ok () )
    tu ne peux pas mettre les parenthèses sinon cela veut dire que la commande est le retour de passer_pref_on_ok () et donc la fonction a été appelée directement à la création du bouton.


    Maintenant, pourquoi la fonction __init__() de la classe uiClass n'a pas été exécutée initialement, il n'y a que toi qui peux le dire.

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    ton objet uiClass n'est pas initialisé correctement.

    Je dirais plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.parent = parent(...)
    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> class A:
    ...     def __init__(self):
    ...         self.x = 2
    ... 
    >>> class B:
    ...     def __init__(self, parent=A):
    ...         self.parent = parent()
    ...     def get_x(self):
    ...         return self.parent.x
    ... 
    >>> b = B()
    >>> b.get_x()
    2

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.btn = tk.Button ( ... , command = self.passer_pref_on_ok () )
    tu ne peux pas mettre les parenthèses sinon cela veut dire que la commande est le retour de passer_pref_on_ok () et donc la fonction a été appelée directement à la création du bouton.
    Merci ! C'est corrigé !

    Citation Envoyé par fred1599 Voir le message
    ton objet uiClass n'est pas initialisé correctement.

    Je dirais plutôt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     self.parent = parent(...)
    Ok merci !
    Mais si je mets seulement
    self.parent = parent ()
    J'ai le message erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Python32\lib\tkinter\__init__.py", line 1456, in __call__
        return self.func(*args)
      File "C:\Python32\MES_PROGS\lettre10_python3_8.py", line 288, in lance_pref
        inst_ClassPref = ClassPref ( Mere.dic_des_as_sorted_list )
      File "C:\Python32\MES_PROGS\lettre10_python3_8.py", line 425, in __init__
        self.parent = parent ()
    TypeError: __init__() takes exactly 5 arguments (1 given)
    Ma classe uiClass demande 5 arguments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class uiClass:
        def __init__ (self,master,ar,xy,flex ):
    Elle instanciée comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        mainUI = uiClass(root, '850x730', '+300+5', 0)
    Si je remets ces mêmes arguments dans le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.parent = parent (root, '850x730', '+300+5', 0)
    alors j'ai une deuxième fenêtre principale qui s'ouvre et encore d'autres messages d'erreur ...

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Mais si je mets seulement
    self.parent = parent ()
    Ça c'est évident, mais je sais pas pourquoi je m'attendais à cette réponse.

    Il est normal que si ta classe attend des arguments pour l'initialisation, il faut instancier ta classe avec ces arguments.

    alors j'ai une deuxième fenêtre principale qui s'ouvre et encore d'autres messages d'erreur ...
    Hmmm... Oui c'est normal !

    Regardes un tutoriel sur l'héritage.

    Bonne continuation...

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2007
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 103
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Ça c'est évident, mais je sais pas pourquoi je m'attendais à cette réponse.

    Il est normal que si ta classe attend des arguments pour l'initialisation, il faut instancier ta classe avec ces arguments.
    .
    C'est parce que j'avais pas capté que ça crée une instance, je pensais que ça passait simplement l'instance de uiClass déjà générée prélablement (mainUI) comme classe "parente".
    Dans ton exemple avec self.parent = parent () (parent= A), tu crées une instance de A. Or moi, je ne peux pas recréer une instance puisque je l'ai déjà, c'est ma fenêtre principale mainUI = uiClass (...)

    Je vais me pencher tout de suite sur l'étude de l'héritage.
    Merci en tout cas !

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    "Or moi, je ne peux pas recréer une instance puisque je l'ai déjà, c'est ma fenêtre principale mainUI = uiClass (...)"

    Eh bien dans ce cas, il faut placer en paramètre un objet ou instance et non une classe (attention c'est différent)

    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
    >>> class A:
    ...     x = 2
    ... 
    >>> class B:
    ...     def __init__(self, obj):
    ...         self.x = obj.x
    ...     def get_x(self):
    ...         return self.x
    ... 
    >>> a = A()
    >>> a.x
    2
    >>> b = B(a)
    >>> b.get_x()
    2
    Bonne continuation...

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

Discussions similaires

  1. [Débutant] Interactions entre classes
    Par ledany dans le forum ASP.NET
    Réponses: 3
    Dernier message: 09/11/2011, 10h27
  2. [Language]Interaction entre class
    Par LordBob dans le forum Langage
    Réponses: 10
    Dernier message: 14/12/2005, 10h14

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