Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probléme commande

Sujet résolu
    22 mars 2015 à 22:32:03

    Bonsoir , je n'obtiens pas l'affichage de chaque element lorsqu'on clique sur le sous menu files:

    J'obtiens seulement le dernier element (2)..

    def Printer(name):
        print(name)
    X=["1","2"]
    XS = Tk()
    MenuX = Menu(XS)
    XS.config(menu=MenuX)
    Menu1 = Menu(MenuX)
    MenuX.add_cascade(label='User',menu=Menu1)
    Menu1.add_command(label='Dock')
    Menu2 = Menu(Menu1)
    Menu1.add_cascade(label='files',menu=Menu2)
    for element in X:
        Menu2.add_command(label=element,command=lambda:Printer(element))




    -
    Edité par raskaya 22 mars 2015 à 22:32:41

    • Partager sur Facebook
    • Partager sur Twitter
      22 mars 2015 à 22:47:08

      Essaie comme ceci

      from tkinter import *
      

      def printer(name):

      print(name)
      
      

      names = ["1", "2", "marc"] app = Tk()

      menu_x = Menu(app) app.config(menu=menu_x) menu1 = Menu(menu_x) menu_x.add_cascade(label='User', menu=menu1) menu1.add_command(label='sacha') menu2 = Menu(menu1) menu1.add_cascade(label='files', menu=menu2) for element in names:

      menu2.add_command(label=element, command=lambda e=element:printer(e))
      

      app.mainloop()

      </pre>

      Le problème était que lors de la création de la fonction lambda, la variable element n'est pas fixée. element est juste une étiquette vers une valeur qui change à chaque tour de boucle. Donc au final, tu as trois fonctions lambda avec la variable element qui vaut la dernière valeur.

      Un truc pour fixer la valeur de element dans la fonction lambda au moment de la création est de le passer comme argument par défaut d'une fonction avec un argument. Alors là Python va faire une copie de element au moment de la création de la lambda.

      • Partager sur Facebook
      • Partager sur Twitter

      Probléme commande

      × 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