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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    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 confirmé
    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
    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 Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

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

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    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 confirmé
    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
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 687
    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 687
    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.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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