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 :

Appel d'un module dans une classe différente


Sujet :

Python

  1. #1
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut Appel d'un module dans une classe différente
    Bonjour,
    En tant que débutant j'ai un peu de mal avec les classes , et j'ai un probléme . J'ai une classe qui en autre dicte un score (dans le cadre d'un jeu) :

    PRG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Plateau(object):
    [...]
    def score(self):
             [...]
             print "Score joueur 1: ",score_1
             print "Score joueur 2: ",score_2
    [...]

    Ensuite j'ai une classe qui me permet de placer mes widgets (Tkinter) :
    WID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Program(object):
     
        fen=Tk()
       [...]
     
    Program.fen.mainloop()
    J'aimerais maintenant afficher le score dynamiquement dans un widget de texte , j'ai donc fait :

    WID:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Program(object):
     
        fen=Tk()
       [...]
       def score_affi(texto,fenetre=group):
            Label(fenetre, text=texto,fg='#FFFFFF',font="Georgia",bg='#99CCFF',width="60").pack()
     
        #score_affi("Textooo")  : marche ici
     
    Program.fen.mainloop()
    et

    PRG:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Plateau(object):
    [...]
    def score(self):
             [...]
             print "Score Rouge : ",score_rouge
             print "Score vert : ",score_vert
             Program.score_affi("test")
    [...]
    Comme je m'y attendais l'erreur retourné est : NameError: global name 'Program' is not defined

    PS: PRG est avant WID dans le code , et [...] sont tout les codes complémentaire qui ne servent pas dans l'explication (déclaration de variable , autre fonctions...)

    Savez vous comment faire? Merci !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    imaginons que ta classe Plateau est définie dans le fichier plateau.py et que ta classe Program est définie dans le fichier program.py.

    dans le fichier plateau.py, il faut que tu fasses:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from program import Program
    avant d'utiliser la classe Program.

    Si je peux me permettre un conseil, procède par étape:

    - comprendre les mécanismes d'import
    - comprendre les classes
    - mettre en pratique dans Tkinter

    cela permettra de diviser les difficultés que tu auras et au final tu vas gagner beaucoup de temps

  3. #3
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    En fait j'ai deux fichiers (un pour le gameplay et un pou l'interface graphique) En d'autre terme WID se trouve dans le fichier interface et PRG dans le fichier gameplay , dans le fichier interface j'importe déjà mon fichier gameplay et quand je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     from interface import Program
    , ça me met lorsque que je lance le fichier interface :

    File "C:\Python26\gameplay.py", line 1, in <module>
    from interface import Program
    File "C:\Python26\interface.py", line 79
    SyntaxError: Non-ASCII character '\xe9' in file C:\Python26\interface.py on line 79, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details (interface.py, line 79)

    ....Si je supprime la ligne 79 ça me dit pareil à la 80 ...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 061
    Points : 1 398
    Points
    1 398
    Par défaut
    dégage les caractères accentués ...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    oui ou alors ajoute ça en haut de tes fichiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-

  6. #6
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Merci,

    seulement aprés il me dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "C:\Python26\interface.py", line 2, in <module>
        from gameplay import *
      File "C:\Python26\gameplay.py", line 1, in <module>
        from interface import Program
      File "C:\Python26\interface.py", line 12, in <module>
        class FramePlateau(Plateau,Frame):
    NameError: name 'Plateau' is not defined

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 399
    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 399
    Points : 36 963
    Points
    36 963
    Par défaut
    Salut,

    De toutes façon les import sont croisés donc ça risque d'être pénible sauf à se souvenir que çà ne fait qu'ajouter des chemins dans l'espace global au module et... çà devrait fonctionner en mettant l'import "plus bas" - à la fin du fichier plutôt qu'au début. Mais c'est plutôt "beurk".

    Une solution plus élégante est de dire à l'instance de Plateau la méthode à appeler après avoir mis à jour le 'score'.
    i.e:
    • ajout d'une variable self._score_callback initialisé à None dans le constructeur de Plateau (la fonction __init__).
    • ajout d'une fonction set_score_callback dans Plateau qui permettra à Program d'y coller la méthode qu'il souhaite.

    De ce fait, Plateau n'a plus besoin de savoir qui est 'Program' et fini les problèmes d'import.

    - W
    PS: Tk doit permettre d'associer des variables à des labels et d'afficher la dernière valeur de la variable sans passer par un callback. Mais j'ai la flemme de chercher dans la doc.

  8. #8
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Ok , mais si j'ai bien compris dans Program je pourrait appelé la variable _score_callback qui contient le score? J'ai essayé dans Plateau j'ai mis ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     def __init__([...]):
          self._score_callback=score_callback=None
     
     
     
        def score(self):
             self.score_callback = "test"

    Et dans Program j'ai mis ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cl=Plateau()    
    print "test:"+cl.score()
    Mais il en sort une erreur sur une autre variable(f_in) dans ma classe Plateau ...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "C:\Python26\interface.py", line 223, in <module>
        class Program(object):
      File "C:\Python26\interface.py", line 254, in Program
        cl=Plateau()
      File "C:\Python26\gameplay.py", line 17, in __init__
        f_in = open(filename,'r')
    TypeError: coercing to Unicode: need string or buffer, NoneType found
    Miaouuuuuuuuuu

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 399
    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 399
    Points : 36 963
    Points
    36 963
    Par défaut
    Comment a été initialisé filename?
    - W

  10. #10
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def __init__(self, filename=None, case=None):
     self.filename   = filename

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 399
    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 399
    Points : 36 963
    Points
    36 963
    Par défaut
    Mouais,

    Si filename = None:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    filename = None
    r = open(filename, 'r')
    se vautre bien avec:
    Traceback (most recent call last):
    File "<stdin>", line 2, in <module>
    TypeError: coercing to Unicode: need string or buffer, NoneType found

    Comment envisagez vous la gestion du cas où l'appelant n'a pas donné un nom de fichier "utilisable" par open???
    Parce que...
    soit on peut faire "sans" filename et on évite 'open'
    soit il faut faire et à part avoir un message d'erreur plus joli.
    - W

  12. #12
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Comment envisagez vous la gestion du cas où l'appelant n'a pas donné un nom de fichier "utilisable" par open???


    Il a pas le choix il doit en choisir un parmis une liste.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 399
    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 399
    Points : 36 963
    Points
    36 963
    Par défaut
    Citation Envoyé par biot22 Voir le message
    Comment envisagez vous la gestion du cas où l'appelant n'a pas donné un nom de fichier "utilisable" par open???
    Ben on peut mettre un nom par défaut autre que "None", mais comme je n'ai pas trop compris à quoi, pourquoi était utilisé le fichier..

    Il a pas le choix il doit en choisir un parmis une liste.
    Dans ce cas, se retrouver avec filename == None n'est pas raisonnable et il est préférable d'avoir if not filename: raise Exception("il est ou le fichier") que de laisser open retourner des erreurs difficiles à décoder parce que le pré-requis "je dois avoir un nom de fichier "valide" n'est pas rempli.
    - W

Discussions similaires

  1. Appel de méthode protected dans une classe fille
    Par Le Mérovingien dans le forum C++
    Réponses: 11
    Dernier message: 05/06/2012, 16h04
  2. appel d'une instance dans 2 classes différentes
    Par fennec62 dans le forum Général Python
    Réponses: 2
    Dernier message: 20/10/2008, 16h37
  3. Réponses: 2
    Dernier message: 18/01/2008, 11h59
  4. Appel de fonction dans une classe
    Par Seth77 dans le forum Langage
    Réponses: 8
    Dernier message: 16/01/2006, 10h32
  5. Réponses: 14
    Dernier message: 04/12/2005, 08h08

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