Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer plusieurs Checkbutton avecTkinter

Sujet résolu
    30 janvier 2015 à 13:49:40

    Bonjour !

    Je me suis récemment mis à Tkinter, et j'aimerais afficher plusieurs CheckButton, et enregistrer leur état (1 ou 0) dans une liste.

    Le problème est que seul l'état du dernier bouton est pris en compte, les autres ne modifient pas la valeur de la variable associée.

    Voici le code :

    from tkinter import *
    
    def recup(indice):
        print(variables[indice].get())
    
    fenetre = Tk()
    
    variables = [IntVar(), IntVar()]
    boutons = [0, 0]
    for i in range(2):
        boutons[i] = Checkbutton(fenetre, text="Bouton "+str(i), variable=variables[i], command=lambda: recup(i))
        boutons[i].pack()
    
    fenetre.mainloop()

    Ici j'essaie d'afficher l'état du bouton que je coche ou décoche, en temps réel.

    Le résultat attendu :

    Si je coche le bouton 0, il affiche 1. Si je le décoche, il affiche 0. Idem avec le bouton 1

    Le résultat actuel :

    Si je coche le bouton 0, il affiche 0, et si je le décoche aussi. Le bouton 1 quant à lui fonctionne bien.

    Avec plus de deux boutons crées ainsi, seul le dernier fonctionne et tous les autres ne réagissent pas comme prévu.

    Avez-vous une idée ?

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2015 à 14:12:50

      Essaie avec partial plutôt

      #!/usr/bin/env python3
      # -*- coding: utf-8 -*-
      
      from tkinter import *
      from functools import partial
      
      def recup(indice):
          print(variables[indice].get())
       
      fenetre = Tk()
       
      variables = []
      boutons = []
      for i in range(2):
          var = IntVar()
          variables.append(var)
          check_button = Checkbutton(fenetre, text="Bouton "+str(i), variable=var, command=partial(recup, i))
          boutons.append(check_button)
          check_button.pack()
       
      fenetre.mainloop()
      

      Remarque aussi l'initialisations des listes. Elles sont vides. On les remplit au fur et à mesure avec la méthode append.

      EDIT: Il existe aussi un autre moyen en gardant une lambda.

      !/usr/bin/env python3

      -- coding: utf-8 --

      from tkinter import *

      def recup(indice):

      print(variables[indice].get())
      

      fenetre = Tk()

      variables = [] boutons = [] for i in range(3):

      var = IntVar()
      variables.append(var)
      
      check_button = Checkbutton(fenetre, text="Bouton "+str(i), variable=var, command=lambda arg=i: recup(arg) )
      boutons.append(check_button)
      check_button.pack()
      

      fenetre.mainloop()

      </pre>

      L'explication est qu'il n'existe qu'une seule variable i. Donc dans ton premier cas, la lambda vaudra recup avec comme argument la valeur de i mais qui change durant la boucle for. Afin d'en créer une copie, on crée une lambda qui prend un argument avec une valeur par défaut égale à la valeur de i.

      A mon sens c'est plus compréhensible d'utiliser partial.

      -
      Edité par Dan737 30 janvier 2015 à 15:22:43

      • Partager sur Facebook
      • Partager sur Twitter
        30 janvier 2015 à 20:14:40

        Je préfère la deuxième méthode parce que je n'avais encore jamais utilisé partial, mais je compte me renseigner sur son utilisation !

        Merci beaucoup de m'avoir aidé !

        • Partager sur Facebook
        • Partager sur Twitter

        Gérer plusieurs Checkbutton avecTkinter

        × 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