Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur l'interface graphique avec Tkinter

    15 août 2010 à 14:41:59

    Bonjour tout le monde,

    Je suis occupé à apprendre Python et les interfaces graphiques.

    Je me base sur un article dont voici le lien :

    http://sebsauvage.net/python/gui/index_fr.html

    J'ai ce code :

    from Tkinter import*
    
    class simple_app_tk(Tk):
        def __init__ (self,parent):
            Tk.__init__(self, parent)
            self.parent = parent
        
        #Il est généralement préférable de garder la portion de code qui créé les éléments graphique (boutons, champs texte...)
        #séparée de la logique du programme.
        #C'est pour cela que nous créons une méthode initialize(). Nous allons crées tous nos widgets dans cette méthode.        
            
        def initialize(self): #nous allons créer tous nos widgets dans cette fonction
            self.grid
            self.entry = Tk.
            self.entry.grid(column=0, row=0, sticky='EW')
    
    if __name__ == "__main__":
        app = simple_app_tk(None) #Avec Tkinter, nous instancions notre classe (app=simpleapp_tk()). On ne lui donne aucun parent (None), car c'est le premier élément graphique que nous créons.
        app.title('my application')
        app.mainloop() #boucler sans fin, en attente d'évènements, C'est de la programmation évènementielle(Car chaque programme ne fait rien d'autre qu'attendre des évènements, et ne
                       #réagit que quand il en reçoit un.)
    


    Plusieurs questions :

    Ceci ne fonctionne pas chez moi :

    class simpleapp_tk(Tkinter.Tk):
    


    Je suis obligé de mettre :

    class simple_app_tk(Tk):
    


    Autrement erreur.

    Ceci ne fonctionne pas non plus :



    self.entry = Tkinter.Entry(self)
    


    Une fenêtre apparaît mais elle est vide alors qu'elle est censée avoir une zone de texte.

    Je pense que le code de l'article a été écrit pour linux, je programme sous Windows (avec wing IDE personnal), le problème vient peut-être de là ?

    Merci d'avance pour l'aide.

    beegees
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 août 2010 à 14:58:25

      Moi aussi j'ai une question:

      As-tu des notions de POO? :)


      Si non! Je pense que tu devrais commencer par un code équivalent.

      from Tkinter import *
      
      parent=Tk()
      parent.title('Titre de ma fenetre')
      entry=Entry(parent)
      entry.grid(column=0, row=0, sticky='EW')
      parent.mainloop()
      


      Quelle version de python as-tu?


      Pour python 2.6 ou 2.7 mon code est ok

      Pour la version 3, j'attend confirmation, mais tu devras mettre en 1ere ligne

      from tkinter import * # c'est un t minuscule et non un t majuscule
      


      Avec une petite connaissance en POO, voila ce que ça donne

      from Tkinter import *
      
      class simple_app_tk(Tk):
          def __init__(self, parent):
              Tk.__init__(self, parent)
              self.parent=parent
          def initialize(self):
              self.grid
              self.entry=Entry(self.parent)
              self.entry.grid(column=0, row=0, sticky='EW')
      
      if __name__=="__main__":
          app=simple_app_tk(None)
          app.title('Ma fenetre')
          app.initialize()
          app.mainloop()
      
      • Partager sur Facebook
      • Partager sur Twitter
        15 août 2010 à 15:11:56

        Bonjour,

        Merci pour ta réponse rapide.

        Je travaille avec Python 2.6.

        Pour répondre à ta question, je t'avoue que mon point faible est la P.O.O.

        Si je comprends bien, ton code et le mien sont équivalent ?

        Sauf que ton code est plus facile mais pas utilisable avec une grid ?

        Le code que tu me montres doit se trouver dans la fonction "Main" ?

        Merci sincèrement pour ton aide.

        beegees
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 août 2010 à 15:18:08

          Citation

          Sauf que ton code est plus facile mais pas utilisable avec une grid ?



          J'utilise la méthode grid, que veux-tu dire?

          Citation

          Le code que tu me montres doit se trouver dans la fonction "Main" ?



          Houla! va voir

          • Partager sur Facebook
          • Partager sur Twitter
            15 août 2010 à 15:27:22

            Je n'avais remarqué que tu avais mis à jour ta réponse.

            Ton code fonctionne parfaitement.

            Mais le code que j'ai ne fonctionne pas ? pourquoi ?

            Je pensais que Python était portable.

            Sais-tu me dire pourquoi met-on toujours self. en début de ligne de code ?

            Je vais regarder le lien que tu m'as passé.

            Merci pour l'aide et surtout pour la réactivité sur ce forum (Python)

            beegees
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 août 2010 à 15:32:17

              beegees: tu suis quel tuto ?

              Pour info :
              fred1599, ton code marche avec Python 3 si on remplace la majuscule de Tkinter par une minuscule. ;)
              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2010 à 15:33:53

                Salut,

                J'utilisais ce tuto :

                Ce tuto

                Mais je lis le livre de Gérard Swinnenn qui est grandiose.

                beegees
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  15 août 2010 à 15:36:39

                  Citation

                  fred1599, ton code marche avec Python 3 si on remplace la majuscule de Tkinter par une minuscule.



                  Merci de la confirmation ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    15 août 2010 à 15:41:38

                    Ok !

                    Avant de suivre ce tuto, tu devrais étudier un peu plus le langage Python en lui même et notamment la POO en Python.
                    Après ça tu sauras ce qu'est - self - et tu pourras suivre plus facilement le(s) mini-cours de SebSauvage ;) !

                    fred1599: Y'a pas de quoi ^^ !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 août 2010 à 15:43:30

                      Que pensez-vous de l'IDE "Wing IDE personnal" ?

                      C'est vraiment super d'avoir des membres comme vous sur ce forum de python.

                      Merci pour votre dévouement.

                      beegees
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        15 août 2010 à 15:47:14

                        Citation

                        Je n'avais remarqué que tu avais mis à jour ta réponse.



                        Mais j'ai utilisé la méthode grid dans mon 1er code, et je ne l'avais pas édité o_O

                        Citation

                        Mais le code que j'ai ne fonctionne pas ? pourquoi ?



                        Eh bien pour cela il me faudrait déjà un lien vers ce code, qui ne fonctionne pas.

                        Citation

                        Sais-tu me dire pourquoi met-on toujours self. en début de ligne de code ?



                        C'est plus une convention qu'une obligation.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 août 2010 à 15:51:24

                          Merci pour ta réponse Fred.

                          Mon ancien code est maintenant obsolète, j'utilise ton code.

                          J'ai essayé de remplacer la zone de texte par un widget de type Label mais ça ne fonctionne pas :

                          self.labelMicro = Label(self.parent, Text="Micro1")
                                  self.labelMicro.grid(column=0, row=0, sticky='EW')
                          


                          Citation : Wing IDE

                          _tkinter.TclError: unknown option "-Text"
                          File "C:\Documents and Settings\David\Mes documents\untitled-1.py", line 15, in <module>
                          app.initialize()
                          File "C:\Documents and Settings\David\Mes documents\untitled-1.py", line 9, in initialize
                          self.labelMicro = Label(self.parent, Text="Micro1")
                          File "C:\Python26\Lib\lib-tk\Tkinter.py", line 2464, in __init__
                          Widget.__init__(self, master, 'label', cnf, kw)
                          File "C:\Python26\Lib\lib-tk\Tkinter.py", line 1930, in __init__
                          (widgetName, self._w) + extra + self._options(cnf))



                          Vois-tu l'erreur ?

                          Merci pour l'aide.
                          beegees
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            15 août 2010 à 15:57:43

                            Citation

                            Vois-tu l'erreur ?



                            Il n'y a pas une erreur d'indentation dans ton 1er code

                            Sinon la correction est ci-dessous.

                            from Tkinter import *
                            
                            class simple_app_tk(Tk):
                                def __init__(self, parent):
                                    Tk.__init__(self, parent)
                                    self.parent=parent
                                def initialize(self):
                                    self.grid
                                    self.labelMicro=Label(self.parent, text="Micro1")
                                    self.labelMicro.grid(column=0, row=0, sticky='EW')
                            
                            if __name__=="__main__":
                                app=simple_app_tk(None)
                                app.title('Ma fenetre')
                                app.initialize()
                                app.mainloop()
                            
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 août 2010 à 16:17:15

                              Merci pour ta réponse Fred.

                              C'était juste le t de texte qui devait être un t minuscule et non majuscule.

                              Mon IDE me proposait pourtant "Text" et non "text".

                              Comprends pas.

                              Encore merci.

                              beegees
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                15 août 2010 à 16:24:17

                                Citation

                                Mon IDE me proposait pourtant "Text" et non "text".



                                Je pense qu'il a simplement confondu la classe Text du module Tkinter avec l'argument text de la classe Label.

                                :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 août 2010 à 17:17:13

                                  Citation : fred1599

                                  Citation

                                  Mon IDE me proposait pourtant "Text" et non "text".



                                  Je pense qu'il a simplement confondu la classe Text du module Tkinter avec l'argument text de la classe Label.

                                  :)



                                  J'ai encore beaucoup de choses à apprendre.

                                  Merci pour tout.

                                  beeges
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 août 2010 à 23:02:32

                                    Bonjour,

                                    Citation : beegees



                                    J'ai ce code :

                                    from Tkinter import*
                                    
                                    class simple_app_tk(Tk):
                                        def __init__ (self,parent):
                                            Tk.__init__(self, parent)
                                            self.parent = parent
                                        
                                        #Il est généralement préférable de garder la portion de code qui créé les éléments graphique (boutons, champs texte...)
                                        #séparée de la logique du programme.
                                        #C'est pour cela que nous créons une méthode initialize(). Nous allons crées tous nos widgets dans cette méthode.        
                                            
                                        def initialize(self): #nous allons créer tous nos widgets dans cette fonction
                                            self.grid
                                            self.entry = Tk.
                                            self.entry.grid(column=0, row=0, sticky='EW')
                                    
                                    if __name__ == "__main__":
                                        app = simple_app_tk(None) #Avec Tkinter, nous instancions notre classe (app=simpleapp_tk()). On ne lui donne aucun parent (None), car c'est le premier élément graphique que nous créons.
                                        app.title('my application')
                                        app.mainloop() #boucler sans fin, en attente d'évènements, C'est de la programmation évènementielle(Car chaque programme ne fait rien d'autre qu'attendre des évènements, et ne
                                                       #réagit que quand il en reçoit un.)
                                    



                                    Plusieurs questions :

                                    Ceci ne fonctionne pas chez moi :

                                    class simpleapp_tk(Tkinter.Tk):
                                    



                                    Je suis obligé de mettre :

                                    class simple_app_tk(Tk):
                                    



                                    Autrement erreur.



                                    C'est tout à fait normal car tu importe le module Tkinter en faisant "from ... import *" donc tu n'as pas besoin d'utiliser le préfixe tkinter. quand tu utilises quelque chose qui vient de tkinter.
                                    Désolé si c'est ecrit a l'arrache, mais j'ai pas le temps

                                    PS: tu devrais renommer ta fonction initialize en __init__ (pur affaire de conventions)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Question sur l'interface graphique avec Tkinter

                                    × 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