IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Créer de boutons dans une boucle avec appel fonction [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Retraité de l'Informatique
    Inscrit en
    Août 2019
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité de l'Informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2019
    Messages : 37
    Par défaut Créer de boutons dans une boucle avec appel fonction
    Bonjour,
    En deux mots, je suis dans une boucle qui crée des boutons, chaque bouton ayant une action différence par le paramètre qu'elle passe à la fonction "Action".
    Le problème est que j'arrive bien à avoir un intitulé de bouton qui évolue, mais à chaque fois que j'appelle le fonction elle me renvoie la valeur max de la variable. C'est comme si (et c'est sûrement ça) la fonction n'était pas codée avec le paramètre qu'on lui a donné à la création mais évalue la variable à la seule exécution.
    Si j'ai mis f"{i}" c'est pour essayer de forcer les choses, j'ai même testé avec la commande eval...
    Une idée ? Merci
    PS: mon code est résumé ici à sa plus simple expression ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from tkinter import *
    def Action(P1):
    	print(P1)
    R = Tk()
    for i in range(10):
    	Button(R,text=f"Bouton {i}", command=lambda: Action(f"{i}")).pack()
    R.mainloop()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    C'est parce que lambda n'est pas une closure.
    Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def action(z):
         def doit():
               print(z)
         return doit
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in ...
         Button(..., command=action(i),...)
    Dans ce cas, action retourne une fonction qui accède à la valeur de i dans le contexte.

    Avec lambda, c'est encore plus bizarre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def action(z):
           print(z)
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in ...
         Button(..., command=lambda i=i: action(i),...)
    car on gèle le i dans les paramètres par défaut de la fonction sans nom.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Retraité de l'Informatique
    Inscrit en
    Août 2019
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité de l'Informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2019
    Messages : 37
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Button(..., command=lambda i=i: action(i),...)
    Ouf, ça fonctionne.
    Mais il va falloir maintenant que je comprenne; là c'est pas gagné.

    En tous les cas merci et bravo (ou l'inverse).
    je mets à Résolu.

    Modification du 26/9.
    En creusant le sujet, je me suis focalisé sur la compréhension de la solution. J'ai donc fait des recherches sur la commande lambda.
    Et bien sûr j'ai trouvé une belle explication sur developpez.nte: la voici.
    En deux mots:
    - l'expression lambda permet de créer des fonctions à la volée.
    - elle a surtout l'avantage de pouvoir passer des paramètres, chose que la command simple ne fait pas quand elle est intégrée dans une fonction tkinter.
    - maintenant, on voit bien dans l'exemple qui suit la génération dynamique d'une pseudo fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>>g= lambda x: x*2
    >>>g(3)
    6
    - il est bien dit que la fonction lambda n'est construite qu'une seule fois lors de la création, et aussi que dans la syntaxe x=x:ajout(x) la fonction est crée avec la valeur de x au moment de la création alors qu'avec ajout(x) seul, on prend la valeur de x au moment de l’exécution

    Voilà, c'est bien ce que disais @wiztricks, je me le suis mis au clair pour m'en rappeler avec mes mots et les références que j'ai trouvées et comprises.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. créer des boutons dans une boucle for
    Par jaky33 dans le forum Tkinter
    Réponses: 8
    Dernier message: 11/03/2018, 13h35
  2. Réponses: 2
    Dernier message: 10/11/2011, 12h01
  3. Problème avec boutons dans une boucle
    Par CHAP26 dans le forum Flash
    Réponses: 2
    Dernier message: 03/06/2008, 14h28
  4. appel de boutons dans une boucle
    Par Ludo_360 dans le forum Delphi
    Réponses: 3
    Dernier message: 02/05/2007, 16h41
  5. Réponses: 4
    Dernier message: 15/06/2006, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo