Partage
  • Partager sur Facebook
  • Partager sur Twitter

Clic ou pas clic : le bouton est exécuté

    26 novembre 2020 à 16:16:33

    Bonjour,

    Dans le script ci-dessous (épuré au maximum) je crée un bouton

    qui doit sauvegarder une donnée lorsque l'on clique dessus.

    Mon problème est que la fonction de sauvegarde qu'il appelle est systématiquement exécutée même si l'on ne clique pas dessus...!

    Qui peut me dire l'erreur que je commets ?

    Merci d'avance.

    # -*- coding: utf-8 -*-
    import tkinter

    def save():
        File_save = open("Sauvegarde.txt", "w")
        File_save.write("Essai")
        File_save.close()

    # Création de la fenêtre principale

    window_1 = tkinter.Tk()
    window_1.geometry("200x150+20+20")

    Bouton_save = tkinter.Button(window_1, text="Save", fg="black", font=("Helvetica", 12))
    Bouton_save.place(x=10, y=10)
    Bouton_save.bind('<Button-1>', save())

    window_1.mainloop()

    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2020 à 16:33:57

      Quand tu crée un bouton, tu dois passer la fonction en paramètre sans l'exécuter, donc sans les parenthèses.

      Là avec les parenthèses tu exécutes la fonction save() et le résulat de la fonction est passé en paramètre à Bouton_save.bind().

      • Partager sur Facebook
      • Partager sur Twitter

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

        27 novembre 2020 à 11:05:42

        Bonjour,

        Merci beaucoup pour cette réponse. Je vais me replonger dans un tuto sur Tkinter.

        Cdlt. JPG.

        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2020 à 21:31:36

          Salut 

          Pas le même tuto j’espère. Il y a un paramètre pour lier une fonction à un bouton sans utiliser bind. C’est le paramètre command. Il prend le nom de la fonction sans les parenthèses. Et si jamais tu as besoin d’utiliser des paramètres de la fonction, tu as la méthode partial du module functools.

          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2020 à 22:21:41

            Le Cobriste 128 a écrit:

            Et si jamais tu as besoin d’utiliser des paramètres de la fonction, tu as la méthode partial du module functools.


            Effectivement, je n'ai jamais utilisé cette «astuce» mais il se trouve que cela peut servir dans des situations pas forcément exceptionnelles. Je reprends un exemple sur mon site où lorsqu'on clique sur un bouton, le numéro du bouton cliqué est dessiné dans un canevas :

            et dont le code est :

            from tkinter import *
            
            SIZE=200
            NBUTTONS=5
            
            root = Tk()
            cnv = Canvas(root, width=SIZE, height=SIZE, background="ivory")
            cnv.grid(row=0,columnspan=NBUTTONS)
            
            def make_clic(nro):
                def clic():
                    cnv.delete(ALL)
                    cnv.create_text(SIZE/2, SIZE/2, text=nro, font="Arial 90 bold")
                return clic
            
            for i in range(NBUTTONS):
                btni=Button(root, text=i, command=make_clic(i))
                btni.grid(row=1, column=i)
            
            root.mainloop()

            On peut alors le remplacer par :

            from tkinter import *
            from functools import partial
            
            SIZE=200
            NBUTTONS=5
            
            root = Tk()
            cnv = Canvas(root, width=SIZE, height=SIZE, background="ivory")
            cnv.grid(row=0,columnspan=NBUTTONS)
            
            def clic(nro):
                cnv.delete(ALL)
                cnv.create_text(SIZE/2, SIZE/2, text=nro, font="Arial 90 bold")
            
            
            for i in range(NBUTTONS):
                btni=Button(root, text=i, command=partial(clic,i))
                btni.grid(row=1, column=i)
            
            root.mainloop() 
            


            Voir aussi How to pass arguments to a Button command in Tkinter?

            • Partager sur Facebook
            • Partager sur Twitter
              28 novembre 2020 à 0:04:01

              Le Cobriste 128 a écrit:

              La première méthode est dans la faq tkinter de dvp : https://tarball69.developpez.com/tutoriels/python/isn-passe-ton-faq/#LIII-C-10


              J'ai mis à jour ma doc sur les points suivants :

              • l'existence de cette FAQ qui contient en effet quelques bon conseils pour réaliser un GUI de manière orthodoxe
              • l'illustration de la calculatrice qui est tout à fait appropriée
              • ta suggestion sur l'usage de partial.

              -
              Edité par PascalOrtiz 28 novembre 2020 à 1:02:40

              • Partager sur Facebook
              • Partager sur Twitter

              Clic ou pas clic : le bouton est exécuté

              × 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