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 :

Question de débutant : Problème de classes dans un autre fichier


Sujet :

Python

  1. #1
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut Question de débutant : Problème de classes dans un autre fichier
    Bonjour à tous.
    Je débute totalement avec Python et je bloque sur un truc qui va certainement vous paraitre tout bête
    Dans mon fichier principal : j'ai ce code qui marche. Mon objectif étant de faire des "Boutons"
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #Importation des différentes modules nécessaires"
    import pygame
    from pygame.locals import *
     
     
     
    class BouttonLettre:
        """Cette classe permet de créer les bouton avec les différentes lettres
            Un bouton du clavier est défini :
            -sa valeur
            sa position"""
        hovered = False
     
        def __init__(self, text, pos):
            self.text = text
            self.pos = pos
            self.set_rect()
            self.draw()
     
        def draw(self):
            self.set_rend()
            fenetre.blit(self.rend, self.rect)
     
        def set_rend(self):
            self.rend = police.render(self.text, True, self.get_color())
     
        def get_color(self):
            if self.hovered:
                return (255, 255, 255)
            else:
                return (100, 100, 100)
     
        def set_rect(self):
            self.set_rend()
            self.rect = self.rend.get_rect()
            self.rect.topleft = self.pos
     
     
    #Innitialisation de pygame"
    pygame.init()
    police = pygame.font.Font('BradBunR.ttf', 60)
    #Création de la fenêtre principale
    fenetre = pygame.display.set_mode((1150,700))
    pygame.display.set_caption("Jeu du pendu ")
    fond = pygame.image.load("images/backgroundJeu.jpg").convert()
    fenetre.blit(fond,(0,0))
     
    #Création d'une boucle infinie
    continuer = 1
     
    bouttonA = BouttonLettre("A", (140, 105))
     
    #Rafraîchissement de l'écran
    pygame.display.flip()
     
    #Création d'une boucle infinie
    while continuer:
       for event in pygame.event.get():   #On parcours la liste de tous les événements reçus
            if event.type == QUIT:     #Si un de ces événements est de type QUIT
                continuer = 0
    Ce n'est pas moi qui ait créé la classe, c'est un bout de code que j'ai trouvé sur internet.
    Par contre si je copie la classe dans un fichier Classe.py et que dans mon fichier principal j'ajoute
    J'ai une erreur me disant :
    self.rend = police.render(self.text, True, self.get_color())
    NameError: name 'police' is not defined

    Est ce que quelqu'un peut m'expliquer pourquoi ca ne fonctionne pas
    Merci d'avance pour votre aide
    Fred

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par amelyfred Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #Importation des différentes modules nécessaires"
     
    class BouttonLettre:
        ...
        def set_rend(self):
            self.rend = police.render(self.text, True, self.get_color())
        # set_rend
        ...
    # class BouttonLettre
     
    #Initialisation de pygame"
    police = pygame.font.Font('BradBunR.ttf', 60)
    ...
    Par contre si je copie la classe dans un fichier Classe.py et que dans mon fichier principal j'ajoute
    J'ai une erreur me disant :
    self.rend = police.render(self.text, True, self.get_color())
    NameError: name 'police' is not defined

    Est ce que quelqu'un peut m'expliquer pourquoi ca ne fonctionne pas
    Bonjour

    La variable "police" est créée en dehors de la classe (qui peut quand-même y accéder car elle est connue de tout le code un peu comme une globale mais qu'on ne peut pas modifier).
    Si tu ne copies que la classe, ben là tu n'as plus cette variable. Bref ce bout de code trouvé sur internet n'est pas des meilleurs (une classe se doit être totalement indépendante)...

    Solution: tu crées ta police dans le __init__ (créée une fois) ou dans le set_rend (créée à chaque appel). Et tu essayes de prendre l'habitude de clore tes blocs de contrôles (if/while/for/fonctions/classes) par un commentaire marquant sa fin (comme je l'ai fait dans ton code). Ca te permettra de mieux appréhender/relire un code Python. Remplacer les mots clefs ou accolades par des indentations c'est super pour l'alignement mais ça induit un manque ensuite qu'il faut combler soi-même...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Bonjour Sve@r
    Tout d'abord merci pour ton aide et tes conseils. Je me doutais bien qu'il y avait une histoire de portabilité de variable.
    Mais j'ai essayé de mettre ma variable police dans ma classe mais j'avais une erreur me disant que pygame n'était pas une variable définie.

    A quel endroit je dois importer les modules pygame : dans mon fichiers Classes ou dans mon fichier principal ou dans les 2?

    Merci pour tes conseils sur les commentaires en fin de fonction et de blocs. C'est comme cela qu'on progresse;-)

    Fred

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu l'importes dans tous les modules (fichiers) qui en font usage.

    Python ne le charge qu'une fois en mémoire mais cela sert à définir pygame dans l'espace de nom du module en question et donc lui permet de l'utiliser.

  5. #5
    Membre habitué
    Inscrit en
    Avril 2010
    Messages
    313
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 313
    Points : 176
    Points
    176
    Par défaut
    Salut VinsS
    OK merci
    Je vais essayer de modifier mon code
    Bonne journée
    Fred

Discussions similaires

  1. [débutant]Instancier une classe dans une autre classe
    Par g_tarik0010 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 28/10/2008, 11h05
  2. [Joomla!] appel de fonction d'une autre classe dans un autre fichier
    Par lkryss dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/07/2007, 16h55
  3. Utilisation d'une classe dans un autre fichier
    Par melotron dans le forum Général Python
    Réponses: 1
    Dernier message: 09/07/2006, 13h11
  4. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 13h13

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