Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de portée de variables avec Tkinter

Sujet résolu
    24 mai 2013 à 12:40:41

    Bonjour à tous !

    Je débute en python, et j'ai des soucis de portée de variables...

    Mon problème en version simplifiée est le suivant : je cherche à créer une fenêtre avec un bouton qui disparait quand on clique dessus.

    Voici mon code (python 2.7)  :

    from Tkinter import *
    
    fen = Tk()
    fen.title("Test")
    fen.geometry("200x100")
    fen.resizable(width = False, height = False)
    
    btn1 = Button(fen, text = "OK", width = 10, command = maFonction())
    btn1.place(x = 20, y = 30)
    
    fen.mainloop()
    
    def maFonction():
        btn1.place_forget()


    A l'execution, une exception est déclenchée car maFonction() n'est pas reconnue, étant déclarée après. Si je déclare ma fonction avant de créer ma fenêtre, c'est btn1 qui n'est pas reconnu... Suis-je obligé de déclarer la fonction en plein milieu du code comme ci-dessous ?

    btn1 = Button(fen, text = "OK", width = 10)
    btn1.place(x = 20, y = 30)
    
    def maFonction():
        btn1.place_forget()
    
    btn1.config(command = maFonction())
    
    fen.mainloop()
    


    Autre souci, maFonction() est appelée dès l'ouverture de la fenêtre, ce qui fait que le bouton n'apparait même pas... y'a-t-il un moyen d'éviter ça ?

    Merci d'avance de votre aide :)


    • Partager sur Facebook
    • Partager sur Twitter
      24 mai 2013 à 12:51:33

      En ecrivant command=maFonction(), les () forcent l'appel de maFonction alors que la variable btn1 n'a pas encore ete cree.

      Supprimez les ca ira mieux.

      -
      Edité par mps 24 mai 2013 à 12:52:04

      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2013 à 12:56:12

        Merci pour cette réponse ! Ca règle mon problème d'appel indésirable, mais j'ai toujours "NameError: name 'maFonction' is not defined"...
        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2013 à 13:12:38

          Même en mettant la fonction avant ?
          • Partager sur Facebook
          • Partager sur Twitter
          OCaml, un langage expressif et performant qui vous ferait du bien.
            24 mai 2013 à 13:18:25

            En mettant la fonction avant ça passe effectivement, merci!

            Par contre je ne comprends pas pourquoi ça marche, pourquoi n'a-t-il plus besoin de connaitre le btn1 ?

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 mai 2013 à 13:44:27

              On utilise objet.place_forget() pour supprimer un objet, je trouve donc plus cohérent de placer en paramètre l'objet à effacer, ça généralise la suppression à différents objets.

              def drop(obj):
                  obj.place_forget()

              Ensuite, l'appel se faisant à l'aide d'une fonction sans argument, on va utiliser lambda, fonction anonyme pour imposer cet argument.

              from Tkinter import *
              
              def drop(obj):
                  obj.place_forget()
              
              fen = Tk()
              fen.title("Test")
              fen.geometry("200x100")
              fen.resizable(width = False, height = False)
               
              btn1 = Button(fen, text = "OK", width = 10, command = lambda:drop(btn1))
              btn1.place(x = 20, y = 30)
               
              fen.mainloop()

              Il est normal de placer les fonctions avant, elles ne sont utilisées que lors de leur appel, elles ne sont donc pas lu et interprétées au début, elles ne le sont que lors de leur appel.

              Bonne continuation...

              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2013 à 13:55:03

                Je vois, ça évitera effectivement de créer une fonction pour chaque objet qu'on voudra masquer... excellent, merci beaucoup Fred ! C'est le genre de pattern que je cherchais.

                • Partager sur Facebook
                • Partager sur Twitter

                Problème de portée de variables 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