Probleme d'argument fonction

Bonjour. Voila, je voudrais, dans une boucle, crre un bouton avec un fonction et un argument

from tkinter import *

F = Tk()

def Fonction(num):

    print(num)



x=0
y=5
while x != y:

    globals()["Button"+str(x)]=Button(F, command=lambda:Fonction(x))
    globals()["Button" + str(x)].pack()
    x = x+1

F.mainloop()

Logique, les boutons affichent tous 5. Pouvez vous m'aider au revoir bonne soirée merci

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour,

    Pas terrible l'utilisation de global de cette façon ...

    1. Contributeur

      C'est certainement non conformiste.  Dans le cadre d'un prototype personnel, je pense que cela peut fonctionner sans souci.

  2. Contributeur

    bonjour,

    globals()["Button"+str(x)]=tkinter.Button(F, command=lambda y=x :Fonction(y))
    1. Contributeur
      import tkinter
      F = tkinter.Tk()
      
      def Fonction(num):
      
          print(num)
      
      MyButtons={}
      x=0
      y=5
      while x != y:
          MyButtons[x]=tkinter.Button(F, command=lambda y=x :Fonction(y))
          MyButtons[x].pack()
          x = x+1
      F.mainloop()
      
      1. Bonjour,

        D'autant que les widgets créés dans le programme principal sont visibles dans les fonctions eventuelles,

        donc pas besoin de les globaliser ...

        def show_entry():
        
            txt = e1.get()
            ...................
        
        
        
        
        ................
        e1 = Entry(f1, show = '*', width = 10)
        e1.place(x = 110,y = 10)
        e1.focus()
        .................
        1. Contributeur

          La variable e1 dans ton exemple est globale, en effet.

          L'utilisation de globals() permet de créer une variable globale avec un nom dynamique:

          x=1
          globals()["e"+str(x)]=123
          print(globals()["e"+str(x)])
      2. Salut.

        Pr.Witherfire, as-tu pour ambition d'être une référence pour tout ce qu'il ne faut pas faire ? Tu tentes d'établir un record du code le plus crade ?

        - import * ✓

         - Obstination à vouloir utiliser des variables dynamiques. ✓

        - Se servir d'une boucle while au lieu d'un simple for, de plus avec une condition de différence ✓

        - Sauts de lignes inutiles nuisant à la lecture du code ✓

        - Espaces manquants nuisant à la lecture du code ✓

        - Identifiants non conformes et non représentatifs ✓

        En 11 lignes de code, c'est pas mal, je pense tout de même que tu peux faire mieux (enfin pire pour nous).

        Il existe des outils, lesquels sont utilisables en lignes de commandes dans ta console dos, et même utilisables dans les commandes d'exécutions de ton EDI,  comme :

          
        - black pour améliorer la mise en forme du code.

        https://pypi.org/project/black/

        - pyflakes (ou encore pep8) : analyseur des erreurs de code (bien moins strict que pylint)

        https://pypi.org/project/pyflakes/

        - pylint : même dessein que pyflakes, mais très très strict, cela peut être une assistance à améliorer sa façon de coder, il peut être configuré à souhaits.

        https://pypi.org/project/pylint/

        - vulture : pour la détection de code (variables, attributs, fonctions, etc) déclarés mais inusités, très pratique pour nettoyer du code.

        https://pypi.org/project/vulture/
         
          
        Ces outils indispensables doivent être dans la panoplie de tout bon codeur python.

        1. Contributeur

          Je suis impressionné par tant d'intégrisme et d'intolérence!  Un peu de non conformisme, cela n'a rien de crade.

      3. Bonjour Goupil,

        Peut-être le sais-tu déjà, mais bon ... :-)

        on peut insérer des liens directement cliquables avec l'une des icones présentes au dessus de la fenêtre de réponse:

        https://pypi.org/project/black/

        1. Salut Phil,

          bah non, il n'y a pas pour les visiteurs une façon d'insérer des liens dans les messages, il y a les boutons Bold, Italic, Underline, les 2 types de listes, les boutons d'insertions (image externe et code), et c'est tout  =)

          Après ça peut rester compréhensible qu'un visiteur ne puisse insérer des liens afin d'éviter le spam et la pub, mais il pourrait quand même y avoir des domaines « sûrs » qui seraient établis dans une liste blanche. Ça serait obligatoirement beaucoup plus de choses à gérér de la part des modos, contributeurs du forum. Rien n'est aisé dès l'instant où des « anonymes » peuvent écrire dans un forum.

          Ce qui me gonfle le plus ici, ce sont les sauts de lignes qui ne sont pas respectés dans mes messages et cet insupportable système d'insertion de code, l'ancien était très bien.

        2. @goupil

          ah ok, tu ne vois donc pas ceci si je comprends bien:

      4. Ok merci à tous pour votre aide. Je jette un coup d'oeil sur les liens merci.