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

Programmation multimédia/Jeux Python Discussion :

Erreur : "indentation" incohérente vraiment ? [Python 3.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Erreur : "indentation" incohérente vraiment ?
    Bonjour,

    Je débute dans Python et Pygame et je tente de résoudre un problème qui me bloque de façon récurrente (j'avais déjà buté et abandonné il y a longtemps, sur un autre jeu). Cela me bloque en fait dès que je développe un programme un peu long, j'ai l'impression (à chaque fois partir de modèles basiques existants).

    En l'occurrence, j'ai suivi le cours suivant (très bien fait) :
    http://sdz.tdct.org/sdz/interface-gr...ur-python.html
    et j'ai amélioré le jeu de Donkey Kong proposé :
    http://sdz.tdct.org/sdz/interface-gr...P-DKLabyrinthe

    Le problème, c'est que, depuis que je tente d'introduire un écran de défaite (l'écran de victoire ne pose aucun problème), le programme plante systématiquement et j'obtiens la fameuse erreur "Inconsistent indentation detected". Or, je n'identifie aucune erreur d'indentation (mais j'avoue ne pas en comprendre encore parfaitement la logique). De plus, le déboggeur d'EDLE m'indique une ligne bien antérieure, qui n'a pas été modifiée, et qui, si je supprime mon ajout final, fonctionne à nouveau et n'empêche pas le jeu de fonctionner !

    La ligne indiquée est la quatrième ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		#Escalator(montant) -> Chgmt de carte
    		if niveau.structure[dk.case_y][dk.case_x] == 'e':
                            #Génération d'un niveau à partir d'un fichier
                            if choix == 'n5':
                                    choix = 'n5b'
                            if choix == 'n4':
                                    choix = 'n4b'
                            niveau = Niveau(choix)
                            niveau.generer()
                            niveau.afficher(fenetre)
    L'ajout que je fais et qui plante le programme :

    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
    		# Défaite -> Ecran de défaite et retour à l'accueil
    		if tpsmilli>=30000:
     
                            tps_fin = pygame.time.get_ticks()
                            score = tps_fin
     
                            pygame.mixer.music.stop()
                            pygame.mixer.music.load("musique/bonus-win2.wav")
                            pygame.mixer.music.play()
     
                            pygame.display.flip()
                            fenetre.fill([0,0,0])
                            bravo = pygame.image.load(image_bravo).convert()
                            fenetre.blit(bravo, (150,180))
                            txt = 'Perdu ! =)'
                            text = fontfin.render(txt, 1, blanc)
                            affichfin(text)
                            affichtpsfin(text_tps)
     
                            pygame.display.flip()
    C'est la deuxième ligne en particulier qui semble poser problème (erreur d'indentation indiquée, au début, avant que EDLE m'indique la ligne plus haut).

    Je précise que les deux "if" litigieux ne sont pas de même niveau (c'est les deux "if" en ligne 2 à chaque fois qui le sont - la modification en "elif" ne change rien, apparemment).

    Pour information, j'ai installé un autre éditeur (Komodo Edit) qui me fait apparaître plusieurs lignes où l'indentation semble poser problème (dont les deux ci-dessus), mais - même quand je change les tabulations en espace ou les espaces en tabulations, même quand la ligne semble "corrigée" - qui ne résout rien.

    Voilà ! J'espère que quelqu'un comprend quelque chose à ce problème sur lequel j'ai déjà passé des heures sans succès...

    Bien cordialement,
    Jean-Baptiste

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    L'indentation peut soit avoir été faite à l'aide d'espaces ou d'une tabulation. Visuellement il n'y aucune différence, mais pour python il y en a bien une! Si je reprends le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		#Escalator(montant) -> Chgmt de carte
    		if niveau.structure[dk.case_y][dk.case_x] == 'e':
                            #Génération d'un niveau à partir d'un fichier
    Les deux premières lignes sont tabulées avec des "tabs" (chaine de caractères "\t") tandis que la troisième est tabulée avec des espaces. Surlignez le code pour vous en convaincre. L'interpréteur Python ne parviens pas à différencier les blocs indentés si on mélange les deux.

    Je vous conseil de remplacer toutes ces tabs par 4 espaces. 4 espaces c'est la tabulation préconisée en Python. Une convention. Vous pouvez paramétrer votre éditeur de texte pour qu'à l'appuie de la touche tab 4 espaces soient créées.

    Ciao

    J

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Salut,

    Merci beaucoup pour la réponse, précise et rapide ! Je ne comprends pas pourquoi IDLE n'a pas corrigé toutes les tabulations en espaces, comme je lui avais demandé. Quoi qu'il en soit, j'ai maintenant tout corrigé à la main (ouf !), et ce problème est réglé. Désormais, je peux avoir accès aux vrais problèmes, qui étaient cachés en fait par ce problème d'indentation.

    Précision donc pour tous les débutants : visiblement, certaines erreurs d'indentation ne font pas planter le programme au début mais, à partir d'un certain stade, elles empêchent le déboggeur d'afficher le problème principal à l'origine du plantage !

    Encore merci !
    Jean-Baptiste

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Y'a pas de quoi. Je me suis fait avoir pas mal de fois au début... Surtout en bossant avec des collègues ne respectant pas la convention de 4 espaces. Vu que Python est interprété, les erreurs ne sont relevées que lorsqu'elles apparaissent. Une section du code peut être bourrée d'erreurs mais si elle n'est pas exécutée rien ne plantera. C'est une source de problèmes non négligeable.

    Si vous avez de nouvelles questions, n'hésitez pas!

    J

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

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