Partage
  • Partager sur Facebook
  • Partager sur Twitter

Où est l'erreur?

Titre laconique mais difficile de faire mieux...

Sujet résolu
    17 août 2010 à 19:14:54

    Désolé pour un titre aussi peu explicite, mais je ne sais vraiment pas comment l'intituler.

    Bref...

    J'ai commencé à suivre un tuto (dont j'ai trouver le lien sur le forum) pour créer des GUI avec Tk. Le code que j'ai écrit (voir ci-dessous) me renvoie l'erreur suivante lors de son exécution:

    Citation : Python

    $ ./main.py
    Traceback (most recent call last):
    File "./main.py", line 6, in <module>
    class simpleapp_tk(Tkinter.Tk):
    File "./main.py", line 16, in simpleapp_tk
    self.entry.grid(column=0,row=0,sticky='EW')
    NameError: name 'self' is not defined



    Voici le code:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import Tkinter
    
    class simpleapp_tk(Tkinter.Tk):
    	def __init__(self,parent):
    		Tkinter.Tk.__init__(self,parent)
    		self.parent = parent
    		self.initialize()
    		
    	def initialize(self):
    		self.grid()
    		
    		self.entry = Tkinter.Entry(self)
            self.entry.grid(column=0,row=0,sticky='EW')
            
            button = Tkinter.Button(self,text=u"Click me !")
            button.grid(column=1,row=0)
    
    if __name__ == '__main__':
    	app = simpleapp_tk(None)
    	app.title('My tk app')
    	app.mainloop()
    


    Et voici le code d'origine, trouvé sur le tuto, qui lui par contre fonctionne sans problème:

    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
    
    import Tkinter
    
    class simpleapp_tk(Tkinter.Tk):
        def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
    
        def initialize(self):
            self.grid()
    
            self.entry = Tkinter.Entry(self)
            self.entry.grid(column=0,row=0,sticky='EW')
    
            button = Tkinter.Button(self,text=u"Click me !")
            button.grid(column=1,row=0)
    
    if __name__ == "__main__":
        app = simpleapp_tk(None)
        app.title('my application')
        app.mainloop()
    


    Pour moi ils sont identiques...

    j'ai eu beau chercher et rechercher, je ne vois absolument pas où est l'erreur dans celui que j'ai écrit.

    Merci de m'aider si vous voyez un truc que j'ai pas vu. :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 août 2010 à 19:18:26

      Problème d'indentation ce me semble (les 3 lignes avant le if).
      • Partager sur Facebook
      • Partager sur Twitter
        17 août 2010 à 19:20:23

        Salut,
        Tu as un problème d'indentation dans le 1er code, ligne 16. le self.entry ce trouve en dehors de la méthode, d'où le message d'erreur.
        • Partager sur Facebook
        • Partager sur Twitter
          17 août 2010 à 20:12:31

          Gagné les gars...

          Je suis confus. Y a des parties que j'ai copié collé, elles était indentées avec des espaces, et moi j'indente avé des tabulations.

          Ca me servira de leçon.

          Cette histoire d'indentation c'est un truc qui m'avait découragé de m'intéresser à Python, au départ.

          Et puis en fait, y a peu j'ai commencé à suivre le tuto du site, et finalement ça m'a beaucoup plus Python. :)

          Bref, j'raconte ma life mais je suis bien content d'avoir franchi le pas et de m'intéresser à ce langage qu'à mon niveau ridicule et avec mes yeux d'amateur je trouve très séduisant et motivant.

          D'ailleurs, puisqu'on en parlait j'en profite pour poser une question sur l'indentation... Que préconisez-vous, que préférerez-vous, qu'est-ce qui vaut le mieux? Espaces ou tabulations?

          Edit:

          la différence entre espace et tabulations apparrait dans les codes que j'ai posté. Mais dans mon éditeur c'était pas apparant, à moins de tester avec un retour arrière (ça reculait par espaces quand c'était indenté avec des espaces et par tabulations dans l'autre cas).

          Démo sur la capture ci-dessous:

          Image utilisateur


          A gauche le code que j'ai tapé, à droite l'original proposé sur le site.
          • Partager sur Facebook
          • Partager sur Twitter
            18 août 2010 à 1:37:51

            Grande question, la plupart des programmeurs à ma connaissance utilisent des espaces, et moi par habitude, j'en utilise aussi.

            Mais récemment je suis tombé sur un article qui parlait de ça, et finalement j'ai l'impression que ça se vaut plus ou moins...

            Le problème des tabulations dans un code posté sur le web c'est qu'elles font en gros 8 espaces de long et c'est fixe, la plupart des gens trouve ça énorme (en général on utilise plutôt des longueurs de 4 espaces). Dans un éditeur de code c'est pas gênant, on peut modifier la longueur des tabulations, mais dans une page web non.
            • Partager sur Facebook
            • Partager sur Twitter

            Blond, bouclé, toujours le sourire aux lèvres...

              18 août 2010 à 11:33:29

              Pour les indentations, l'ami Guido préconise 4 espaces (donc pas de tabulation) dans la PEP-8.
              C'est à peu près le meilleur compromis lisibilité/portabilité à mon goût.

              Pour d'autres langages comme C ou C++, j'aurais plutôt tendance à en utiliser/préconiser 2 (pas de tabulations non plus), mais puisqu'ici on parle de Python et qu'il y a une coding-style "standard" définie par la PEP-8, autant la suivre. ;)

              Il suffit de régler l'éditeur de texte que tu utilises pour coder pour qu'il gère ça proprement.

              EDIT:
              D'une manière générale, quand tu copies/colles un code, un petit remplacement systématique ('\t' -> '    ') ne fait pas de mal.

              Je ne sais pas ce qu'il en est de Geany, mais dans la plupart des éditeurs tu peux aussi afficher des symboles qui te permettent de visualiser les retours à la ligne, les tabulations etc.
              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                18 août 2010 à 18:17:45

                Citation : NoHaR

                Je ne sais pas ce qu'il en est de Geany, mais dans la plupart des éditeurs tu peux aussi afficher des symboles qui te permettent de visualiser les retours à la ligne, les tabulations etc.



                Ouep, Geany gère ça. Mais de toute façon comme je le disais plus haut, maintenant je vais faire gaffe. Avant je me posais pas la question (avant Pyhton), et l'indentation c'était juste pour la lisibilité... (et aussi paske y a une certaine esthétique, à mes yeux, dans un code bien indenté).

                Sinon, je connaissais pas la PEP 8... (va falloir que je passe plus de temps sur python.org).

                Par contre je comprends pas en quoi c'est génant les tabulations, mais bon, il y a certainement une très bonne raison j'imagine.

                Merci à tous pour vos réponses! :)
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  18 août 2010 à 18:25:13

                  Citation

                  Par contre je comprends pas en quoi c'est génant les tabulations, mais bon, il y a certainement une très bonne raison j'imagine



                  C'est pas les tabulations qui sont gênantes, c'est la longueur conventionnelle des tabulations qui le sont.

                  En gros une tabulation doit représenter 4 fois la longueur d'un espacement.

                  C'est juste une convention, pour se rapprocher d'autres codeurs python.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 août 2010 à 18:35:14

                    All right, thanks fred! : )

                    (fait peur ton avatar :D )
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      18 août 2010 à 18:41:52

                      C'est pas le but, je le trouve surtout original :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 août 2010 à 18:48:42

                        mdr, c'est juste que quand je suis arrivé sur la page, après avoir cliqué sur le lien dans le mail de notif, je tombe directement, grace à l'ancre, sur ton post.
                        Et là la 1ère chose qu'on vot c'est cette mine irascible...

                        Ca choque! ^^

                        Mais c'est rien, c'est ma réaction à moi, une réaction primaire en l'occurence. D'autres réagiront différement.

                        Tu peux difficilement tenir compte de l'avis de tous de toutes façons... So...

                        Et puis c'est vrai qu'il est rigolo ton avatar.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Où est l'erreur?

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown