Partage
  • Partager sur Facebook
  • Partager sur Twitter

[tkinter]Mise à jour OptionMenu

Sujet résolu
    4 avril 2020 à 8:42:08

    Bonjour,

    Mon souci est la mise à jour d'un OptionMenu. Il est lié à une StringVar et une liste. J'ai un Entry et un Button pour enregistrer un nouveau nom qui devait s'ajouter à l'OptionMenu.

    Quand j'enregistre un nouveau nom, la liste se met bien à jour mais l'OptionMenu n'affiche pas toute la liste. Il y a surement quelque chose que j'oublie ?

    from tkinter import *
    
    fenetre=Tk()
    
    liste=['toto', 'titi']
    liste1=liste[:]
    
    def Change(evt):
        print(liste1)
    
    def Enregistre():
        liste1.append(varb.get())
        vara.set(liste1[-1])
        print(liste1)
    
    vara=StringVar()
    vara.set(liste1[0])
    menu = OptionMenu(fenetre, vara, *liste1, command=Change)
    menu.pack()
    
    varb=StringVar()
    varb.set('')
    ent =Entry(fenetre, textvariable=varb)
    ent.pack()
    ent.bind('<KeyRelease>')
    
    b = Button(text='enregistre', command=Enregistre)
    b.pack()
    
    fenetre.mainloop()



    • Partager sur Facebook
    • Partager sur Twitter
      5 avril 2020 à 2:45:14

      Salut,

      J'admets que la méthode n'est pas facile à trouver, mais, en fait, tu n'utilises pas la bonne méthode.

      Le widget OptionMenu possède des options dont l'option menu est un objet. Taper menu["menu"] créer cet objet qui possède donc des méthodes, dont la méthode add_command va te permettre de faire ce que tu veux. Il faut juste penser à bien remplir les arguments de cette méthode :

      • l'argument de label sera ce que tu verras dans la liste de choix de la fenêtre

      • l'argument de command doit contenir la méthode tk._setit(vara, choix_ajouté)

      où choix_ajouté est le texte que tu verras dans le choix sélectionné du widget OptionMenu, logiquement la même valeur que l'argument de label.

      Exemple :

      import tkinter as tk
      
      def ajouter():
          optionmenu["menu"].add_command(label=entry.get(), command=tk._setit(selection, entry.get()))
          entry.delete(0, 'end')
      
      root = tk.Tk()
      
      choix = ["toto", "titi"]
      selection = tk.StringVar()
      selection.set('')
      
      optionmenu = tk.OptionMenu(root, selection, *choix)
      entry = tk.Entry(root)
      button = tk.Button(root, text="ajouter", command=ajouter)
      
      optionmenu.grid()
      entry.grid(column=0, row=1)
      button.grid(column=0, row=2)
      
      root.mainloop()



      -
      Edité par Le Cobriste 128 5 avril 2020 à 2:46:47

      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2020 à 7:25:02

        Merci beaucoup, jamais je n'aurai trouver seul cette manip et fait la relation entre OptionMenu et Menu. Pourtant si évidente quand on regarde leur nom.:colere2:

        Sinon deux questions de candide :

        - Où as-tu trouvé cette méthode _setit ?

        - Comment faire dans les messages pour avoir les mots en rouge dans un cadre gris ?

        -
        Edité par nirannor 5 avril 2020 à 7:25:37

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2020 à 13:11:14

          Salut,

          Attention, ce n'est pas le widget Menu, c'est l'option qui appartient au widget OptionMenu qui porte le même nom. C'est comme Pierre Durand de Marseille et Pierre Durand de Paris, même patronyme mais pas les mêmes personnes.

          - je ne savais pas comment on utilisait OptionMenu car je ne m'en suis jamais servi. J'ai donc fait une simple recherche en anglais pour augmenter mes chances de trouver une réponse. C'est dans ce lien que j'ai trouvé et ai dû adapter à ta demande parce que là, on modifie TOUTE la liste de choix.

          - tu cliques sur HTML en bas à gauche de la zone d'écriture du message, la fenêtre HTML s'ouvre et tu encadres la partie par la balise code :

          exemple : <code>partie bla bla</code> donne : partie bla bla

          Dans mon code, j'ai oublié qu'il faut vérifier le contenu de la liste pour éviter les doublons. Si tu tapes "tata" que tu l'ajoutes, et que tu le retapes, tu auras 2 fois tata dans l'optionmenu.

          Tu peux faire :

          import tkinter as tk
          
          def ajouter(liste):
              def fermeture_ajouter():
                  choix = entry.get()
                  if choix not in liste:
                      liste.append(choix)
                      optionmenu["menu"].add_command(label=choix, command=tk._setit(selection, choix))
                  entry.delete(0, 'end')
              return fermeture_ajouter
          
          root = tk.Tk()
          
          choix = ["toto", "titi"]
          selection = tk.StringVar()
          
          optionmenu = tk.OptionMenu(root, selection, *choix)
          entry= tk.Entry(root)
          button = tk.Button(root, text="ajouter", command=ajouter(choix))
          
          optionmenu.grid()
          entry.grid(column=0, row=1)
          button.grid(column=0, row=2)
          
          root.mainloop()
          
          
          



          • Partager sur Facebook
          • Partager sur Twitter
            6 avril 2020 à 6:47:05

            Merci pour toutes ces précisions.

            De quel lien parles-tu ?(j'ai l'impression que tu ne l'as pas mis)

            Pour la vérification des doublons, je l'avais prévu.

            • Partager sur Facebook
            • Partager sur Twitter
              6 avril 2020 à 8:23:25

              Salut,

              D’accord pour la gestion des doublons mais, ton code initial est pas terrible : la fonction Change() ne sert à rien, en tout cas pour le moment. 

              Pardon, j’ai effectivement oublié le lien : le voici.  

              • Partager sur Facebook
              • Partager sur Twitter

              [tkinter]Mise à jour OptionMenu

              × 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