Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question classe, tkinter

Sujet résolu
    16 mai 2014 à 14:47:28

    Bonjour à tous,

    Voilà, je me suis mis à la POO depuis peu de temps, jusqu'ici je ne faisais que du script avec python.

    Alors voilà, je voulais créer une interface pour l'un de mes petits programmes et j'ai un problème qui m'échappe, je vous mets le code :

    import tkinter as tk
    
    class fenetre(object):
        def __init__(self):
            self.valeur = 0
            self.fen1 = tk.Tk()
            self.bouton = tk.Button(self.fen1, text='plus5', command=self.plus(5))
            self.bouton.grid(row = 1,column = 1)
            self.bouton = tk.Button(self.fen1, text='plus10', command=self.plus(10))
            self.bouton.grid(row = 1,column = 2)
            self.fen1.mainloop()
    
        def plus(self,b):
            self.valeur = self.valeur + b
            print (self.valeur)
            
    f = fenetre()
    



    Alors en gros le but c'est de créer une fenêtre avec plusieurs boutons qui change une valeur. J'aurais pu écrire une fonction différente pour chaque bouton .... mais je trouvais ça vraiment moche. Donc du coup j'ai décidé de passer la valeur à ajouter en argument de la fonction.

    Voilà sauf que lorsque je lance le programme, celui-ci m'affiche directement les valeurs (sans que je n'ai besoin d'appuyer sur les boutons), mais après impossible d'appuyer sur les boutons. J'espère m'être fait comprendre, j'avoue avoir du mal à expliquer.

    Enfin voilà, j'imagine que c'est dû à un concept de POO que je n'ai pas compris, malheureusement, même après avoir regardé la doc et lu el cours je ne vois toujours pas (et copier/coller les exemples ça marche mais on apprend rien).

    Voilà merci d'avance :)

    -
    Edité par philippe NOEL 16 mai 2014 à 14:47:58

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2014 à 15:14:47

      Tu ne peux pas mettre de fonction/méthode avec des paramètres dans l'option command. Et si ton programme s'exécute immédiatement c'est parce que tu met des parenthèses dans cette même option. La bonne réponse est:

      self.bouton = tk.Button(self.fen1, text='plus5', command=self.plus)

      -
      Edité par Olygrim 16 mai 2014 à 15:15:23

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
      Anonyme
        16 mai 2014 à 15:28:17

        "Tu ne peux pas mettre de fonction/méthode avec des paramètres dans l'option command"

        S'il a besoin de paramètre(s) pour sa fonction, il pourra pas faire autrement ;)

        @philippe,

        Essayes ceci

        self.bouton = tk.Button(self.fen1, text='plus5', command=lambda: self.plus(5))

        Pour en savoir plus, voir la documentation

        Autre façon de faire que nohar m'avait expliqué est celle-ci

        def plus(self, b):
            def wrap():
                self.valeur = self.valeur + b
                print(self.valeur)
            return wrap




        -
        Edité par Anonyme 16 mai 2014 à 15:38:28

        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2014 à 15:38:10

          Merci beaucoup fred, cette méthode fonctionne très bien. De plus j'aurais pu penser au lambda, mais comme c'est pas courant.

          En tout cas un gros merci, je peux clore le sujet

          • Partager sur Facebook
          • Partager sur Twitter
            16 mai 2014 à 15:46:13

            Je pensais que c'était impossible...

            J'ai pas encore étudié les fonctions anonymes donc je vais mettre de côté ton exemple, mais le deuxième est intéressant. Je vais essayé de le comprendre.

            Merci pour l'info.

            • Partager sur Facebook
            • Partager sur Twitter
            Précepte: Le mieux est l'ennemi du bien
            Anonyme
              16 mai 2014 à 16:14:56

              Oups, j'avais pas vu que tu avais remarqué mon 2ème exemple...

              -
              Edité par Anonyme 16 mai 2014 à 16:15:51

              • Partager sur Facebook
              • Partager sur Twitter

              Question classe, 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