Partage
  • Partager sur Facebook
  • Partager sur Twitter

La méthode curselection()

Sujet résolu
    21 septembre 2018 à 12:45:09

    Bonjour,

    J'étudie en ce moment le widget des listes déroulantes, et la fonction curselection() ne fonctionne pas, je vous donne l'explication du cour :

    Dans un premier temps on crée la fenêtre :

    fenetre = Tk()

    On crée ensuite le widget et on l'insère dans la fenêtre :

    liste = Listbox(fenetre)
    liste.pack()

    J'insère des éléments à l'intérieur de la liste :

    liste.insert(END, "Pierre")
    liste.insert(END, "Feuille")
    liste.insert(END, "Ciseau")

    et ensuite le cour me dit ça :

    "Pour accéder à la sélection, utilisez la méthodecurselectionde la liste. Elle renvoie un tuple de chaînes de caractères, chacune étant la position de l'élément sélectionné.

    Par exemple, siliste.curselection()renvoie('2',), c'est le troisième élément de la liste qui est sélectionné (Ciseauen l'occurrence)."

    Le problème c'est que la méthode ne fonctionne pas une fois que j'ai choisi un élément dans la fenêtre, j'appelle la méthode et ça me met une erreur sans aucune exception :

    liste.curselection()
    Traceback (most recent call last):
      File "(stdin)", line 1, in (module)
      File "C:\Users\admin\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__i
    nit__.py", line 2782, in curselection
        return self._getints(self.tk.call(self._w, 'curselection')) or ()
    _tkinter.TclError: invalid command name ".!listbox"

    La méthode ne fonctionne plus uniquement après que j'ai ouvert la fenêtre, mais avant que celle ci ne soit ouverte elle fonctionne très bien, d'où peut venir le problème sachant que j'ai suivi à la lettre le cour, merci d'avance pour vos réponses





    -
    Edité par BastienPortigo 21 septembre 2018 à 12:46:30

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2018 à 10:38:31

      Personne ne sait pourquoi la fonction ne fonctionne pas ???

      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2018 à 10:55:01

        On peut voir un code test minimal où ça reproduit la même erreur ?
        • Partager sur Facebook
        • Partager sur Twitter

        Bonne journée...

          24 septembre 2018 à 11:03:13

          Fredo54 a écrit:

          On peut voir un code test minimal où ça reproduit la même erreur ?

          Je vais poster l'intégralité du code en une seule fois :

          from tkinter import *
          
          fenetre = Tk()
          
          liste = Listbox(fenetre)
          liste.pack()
          
          liste.insert(END, "Pierre")
          liste.insert(END, "Feuille")
          liste.insert(END, "Ciseau")
          
          fenetre.mainloop()
          
          liste.curselection()

          C'est la dernière ligne qui pose problème et qui lève l'exception, je ne peux donc pas récupérer la sélection

          -
          Edité par BastienPortigo 24 septembre 2018 à 11:06:34

          • Partager sur Facebook
          • Partager sur Twitter
            24 septembre 2018 à 11:08:06

            Tu ne peux pas exécuter curselection avant d'avoir sélectionné quoi que se soit...

            EDIT: Qui puis est, tu places cette ligne après mainloop, ce qui n'est pas cohérent, ça indique la fin de boucle événementielle.

            -
            Edité par Fredo54 24 septembre 2018 à 11:09:24

            • Partager sur Facebook
            • Partager sur Twitter

            Bonne journée...

              24 septembre 2018 à 11:16:24

              Fredo54 a écrit:

              Tu ne peux pas exécuter curselection avant d'avoir sélectionné quoi que se soit...

              EDIT: Qui puis est, tu places cette ligne après mainloop, ce qui n'est pas cohérent, ça indique la fin de boucle événementielle.

              -
              Edité par Fredo54 il y a 4 minutes


              La sélection c'est bien quand on ouvre la fenêtre et qu'on choisi entre "Pierre", "Feuille", "Ciseau" en cliquant dessus ?

              Car avant que j'ouvre la fenêtre pour sélectionner la fonction fonctionne et renvoie un tuple vide (normal puisque je n'ai rien sélectionné)

              Je place la fonction après mainloop puisque mainloop sert justement à faire sélectionner quelque chose.

              Après peut être que c'est moi qui ne comprend pas le principe de la sélection, c'est possible aussi.

              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2018 à 11:21:35

                mainloop indique la fin de la boucle événementielle, si tu souhaites réagir à un événement, il faut que se soit à l'intérieur de cette boucle.

                Voici une solution

                from tkinter import *
                
                def test(event):
                    print(liste.curselection())
                
                fenetre = Tk()
                
                liste = Listbox(fenetre)
                liste.pack()
                
                liste.insert(END, "Pierre")
                liste.insert(END, "Feuille")
                liste.insert(END, "Ciseau")
                
                liste.bind("<<ListboxSelect>>", test)
                
                fenetre.mainloop()



                • Partager sur Facebook
                • Partager sur Twitter

                Bonne journée...

                  24 septembre 2018 à 12:40:17

                  Fredo54 a écrit:

                  mainloop indique la fin de la boucle événementielle, si tu souhaites réagir à un événement, il faut que se soit à l'intérieur de cette boucle.

                  Voici une solution

                  from tkinter import *
                  
                  def test(event):
                      print(liste.curselection())
                  
                  fenetre = Tk()
                  
                  liste = Listbox(fenetre)
                  liste.pack()
                  
                  liste.insert(END, "Pierre")
                  liste.insert(END, "Feuille")
                  liste.insert(END, "Ciseau")
                  
                  liste.bind("<<ListboxSelect>>", test)
                  
                  fenetre.mainloop()



                  Merci pour l'explication, je comprends maintenant le message d'erreur, et ça fonctionne.

                  Par contre j'ai l'impression que la ligne est complexe, pourquoi un << >> avant et après ListboxSelect, et la méthode bind sert à exécuter du code quand on est à l'intérieur de la boucle mainloop() ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 septembre 2018 à 15:01:54

                    BastienPortigo a écrit:

                    Par contre j'ai l'impression que la ligne est complexe, pourquoi un << >> avant et après ListboxSelect, et la méthode bind sert à exécuter du code quand on est à l'intérieur de la boucle mainloop() ?


                    J'ai trouvé cela dans la documentation Tk, tkinter étant un binding de la bibliothèque Tk.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonne journée...

                      25 septembre 2018 à 10:01:46

                      Fredo54 a écrit:

                      BastienPortigo a écrit:

                      Par contre j'ai l'impression que la ligne est complexe, pourquoi un << >> avant et après ListboxSelect, et la méthode bind sert à exécuter du code quand on est à l'intérieur de la boucle mainloop() ?


                      J'ai trouvé cela dans la documentation Tk, tkinter étant un binding de la bibliothèque Tk.


                      Je me suis renseigné sur la ligne, il s'agît en fait d'un descripteur de séquence qui indique à python que lorsque je choisi une option dans la fenêtre il faut appeler la fonction test (qui est ici un gestionnaire d'événement)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      La méthode curselection()

                      × 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