Partage
  • Partager sur Facebook
  • Partager sur Twitter

Self et attributs fonction get dans class

Python - Tkinter

Sujet résolu
    25 décembre 2016 à 22:32:40

    from tkinter import *
    
    fen = Tk()
    fen.geometry("200x100")
    
    
    def option():
        variable1 = StringVar
        E1 = Entry (fen, textvariable = variable1)
        B2 = Button(fen, text = "yop", command = CM.prend(variable1))
        
        E1.pack(side = RIGHT)
        B2.pack(side = CENTER)
            
    
    class CM():
        def prend(self, variable1):
            self.variableA = self.variable1.get()
    
    CM = CM()
    B1 = Button(fen, text = "yop", command = option())
    
            
    B1.pack(side = LEFT)
    
    
    fen.mainloop()


    But du jeu: faire marcher l'tout X)

    Ce code est l'extrait sur lequel je bloque, donc oui la classe est obligatoire, et est appelé depuis la def options().

    Le message d'erreur est le suivant: self.variableA = self.variable1.get()

    Attribute Error: 'CM' object has no attributes 'variable1'

    Si cela me semble logique, je vois néamoins pas comment faire autrement... :/

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      25 décembre 2016 à 23:02:49

      Salut,

      Aussi niaiseux que cela: :) :) :)

      class CM():
          def prend(self, variable1):
              self.variableA = variable1.get()


      Vous passer la variable1 en argument de la fonction prend(), donc variable1 ne prend pas de self.

      Bonne chance

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        26 décembre 2016 à 0:51:15

        Héhé ^^ merci nolimitech, mais, débutant de mon état, c'est quand même le premier truc que j'avais tenté XD

        self.variableA = variable1.get()
        TypeError: get() missing 1 required positional argument: 'self'

        Mais apparement si get()  n'a pas son self python n'est pas content -_- XD

        Une autre idée? :p

        PS: ce code là à été fait pour être testable ;)

        • Partager sur Facebook
        • Partager sur Twitter
          26 décembre 2016 à 9:02:25

          Ligne 8, tu ne crées pas un objet StringVar, tu assignes la classe StringVar au nom variable1. Il faudrait faire StringVar() pour instancier un objet.

          Aussi, ligne 20, pourquoi utiliser un même nom pour la classe et son instance ?

          • Partager sur Facebook
          • Partager sur Twitter
            26 décembre 2016 à 20:31:58

            entwanne à raison, comme toujours :)

            Quel est le but de votre fonction? Sauvegardez la variable du entry, vers la classe CM ?

            Si vous faite un print() à votre fonction, vous allez voir qu'elle est appelé, avant même que vous pesez sur le bouton, pour sauvegarder et il ne fonctionne plus après.

            class CM():
                def prend(self, variable1):
                    self.variableA = variable1.get()
                    print("J'ai sauvegardé %s" % variable1.get())

            Donc, il ne sauvegarde rien :(

            Vous pouvez enlever le bouton et mettre un bind() à votre widget Entry()

            import tkinter as tk
            
            root = tk.Tk()
            root.geometry("200x100")
            
            def key_pressed(evt, laVariable):
                #print('AxeX:', evt.x, 'AxeY:', evt.y)
                _CM.prend(laVariable)
            
            def option():
                ##Instance de StringVar()
                var1 = tk.StringVar()
                E1 = tk.Entry(root, textvariable=var1)
                ##Bind à la place d'un bouton (Peu remplacer la clef <'Key'>, par une autre touche)
                ##La fonction lambda, vous permet d'introduire des arguments dans la fonction à appeler. C'est une fonction anonyme (mot clef google)
                E1.bind('<Key'>, lambda event, key=var1: key_pressed(event, key))
                #E1.bind('<Key'>, lambda event: key_pressed(event, var1)) ##OU CECI..
                E1.pack(side = tk.RIGHT)
            
            class CM():
                def prend(self, variable1):
                    self.variableA = variable1.get()
                    print("J'ai sauvegardé %s" % variable1.get())
            
            ##Python sait pas si vous voulez une variable ou une classe?
            _CM = CM() ##Pourquoi le même nom ? 
            
            B1 = tk.Button(root, text="Yoop", command=option())
            B1.pack(side=tk.LEFT)
            
            root.mainloop()




            Voici un lien, pour connaître tous les bindings et events, que vous pouvez attraper.. Surtout si vous faite un Jeu :) :)

            Bonne Chance

            A+

            -
            Edité par nolimitech 26 décembre 2016 à 20:37:29

            • Partager sur Facebook
            • Partager sur Twitter
              26 décembre 2016 à 20:48:18

              Ah oui, effectivement c'était bien les StringVar() qui posaient problème.... #hontesurmoi XD

              De plus CENTER n'est pas un argument 'side' mais un argument 'anchor', comme quoi ..

              En tout cas merci pour ta réponse entwanne ^-^

              EDIT:

              Merci nolimitech :D dans tout les cas, l'utilisateur doit cliquer sur un bouton, donc l'entry avait juste à être banal (mais je garde quand même votre code sous le coude ^^ #gnark).

              En fait je voulais aussi que l'utilisateur puisse rentrer les flèches clavier dans les entry (car oui, le code est en fait un paramétrage de touches), sans pour autant écrire 'Up', 'Down'...

              Donc j'avais effectivement pensé à la fonction .bind avec un focus (que je sais pas gérer).

              Genre: quand .bind est exécuté, le focus passe à l'entry suivante. Mais là mon problème était que je ne savais pas comment faire pour faire passer le focus d'une entry à une autre dans le cas ou l'utilisateur rentrait un simple lettre (d'où la probable exploitation de votre code ^^)

              En tout cas, merci pour ces réponses, je vais étudier votre lien B) :D

              -
              Edité par Titou210Titou 27 décembre 2016 à 2:41:09

              • Partager sur Facebook
              • Partager sur Twitter
                28 décembre 2016 à 17:56:42

                Fait plaisir :)

                Si vous voulez redirigez le focus, voici un exemple:

                entry = tk.Entry(...)
                entry.place(...)
                entry.focus_set() #Set focus sur ce widget Entry.

                Vous avez juste à sélectionner le widget que vous voulez 'focus'. Donc, lorsqu'un entry est rempli, vous sélectionnez le prochain entry.

                Très pratique, lorsque tous nos widgets sont dans un dictionnaire et que l'on a besoin que l'utilisateur, commence par un entry spécifique.


                De plus, il y a tous les touches disponibles, avec le bind('<>').

                Vous pouvez même ajouter la touche F1 en tout temps, pour afficher une fenêtre d'aide à l'utilisateur.

                Pour ce qui est du Entry banale :),  pas de problème, tous les binds fonctionnent sur tous les widgets (ou presque). Donc, si vous comprenez le principale c'est déjà pas mal, pour avancer.

                Pour finir, même les flèches peuvent être gérées par la même fonction, qui contiendra les conditions. À la place de créer une fonction par flèche. Grâce à bind et lambda

                L'utilisateur, pourra définir ces propres touches.

                -
                Edité par nolimitech 28 décembre 2016 à 18:01:42

                • Partager sur Facebook
                • Partager sur Twitter

                Self et attributs fonction get dans class

                × 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