Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème tkinter liste déroulante cliquable

Sujet résolu
    11 décembre 2023 à 13:01:38

    Bonjour à tous,

    je débute en Python et en Tkinter. Je dois créé une liste déroulante scrollante avec qui prend en entrée une liste de string et renvoie la selection de l'utilisateur. J'ai ce code: 

    import tkinter as tk
    
    
    class DistCentreImagerie(tk.Frame):
        """Notre fenêtre principale.
        Tous les widgets sont stockés comme attributs de cette fenêtre."""
    
        def __init__(self, root, item_list):
            tk.Frame.__init__(self, root)
    
            root.geometry('350x450')
            root.title('Veuillez sélectionner les repères')
    
            self.selection = []
            self.check_btn_vars = []
    
            # widgets creation
            self.scroll_bar = tk.Scrollbar(tk.Frame(root))
            self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
    
            self.text_area = tk.Text(tk.Frame(root), bg='SystemButtonFace')
            self.text_area.pack()
            self.text_area.configure(yscrollcommand=self.scroll_bar.set)
            self.scroll_bar.configure(command=self.text_area.yview)
    
            tk.Frame(root).pack()
    
            #
            self.output_lb = tk.Label(root, font=('Bold', 12))
            self.output_lb.pack(pady=10, anchor=tk.W)
    
            #
            self.insert_check_btn(item_list)
            # self.selection_get(item_list)
    
            ###########################################################################
            # self.quit_button = tk.Button(self, text="OK", command=self.quit)
            # self.quit_button.pack(side="bottom")
    
        def insert_check_btn(self, item_list):
            for r in item_list:
                var = tk.IntVar()
    
                self.check_btn_vars.append(var)
                check_btn = tk.Checkbutton(self.text_area, text=f'{r}',
                                           variable=var,
                                           command=self.selection_get(item_list))
                self.text_area.window_create('end', window=check_btn)
                self.text_area.insert('end', '\n')
    
            self.text_area.configure(state=tk.DISABLED, cursor='')
    
        def selection_get(self, item_list):
            # global selection
    
            self.selection = []
    
            for s in self.check_btn_vars:
                if s.get() == 1:
                    item_ind = self.check_btn_vars.index(s)
                    self.selection.append(item_list[item_ind])
    
            self.output_lb.config(text=self.selection)
    
        def get_selected_roi(self):
            return self.selection
    
    
    Item_list = ['Orly', 'Dora', 'Sandra', 'Passy', 'Line', 'Anna', 'Kolor', 'Papson', 'Thierson']
    
    root = tk.Tk()
    interface = DistCentreImagerie(root, Item_list)
    
    interface.mainloop()
    

    Je suis censé obtenir quelque chose comme ça, mais en retour j'ai juste une fenêtre vide. 

    Quelqu'un pourrait-il m'aider à comprendre ou je me gourre ?

    Je vous remercie par avance

    • Partager sur Facebook
    • Partager sur Twitter
      11 décembre 2023 à 13:50:51

      Il y a pas mal d'erreurs, je l'ai corrigé et te laisse observer

      import tkinter as tk
      
      class DistCentreImagerie(tk.Frame):
          def __init__(self, root, item_list):
              super().__init__(root)
              self.pack()
      
              root.geometry('350x450')
              root.title('Veuillez sélectionner les repères')
      
              self.selection = []
              self.check_btn_vars = []
      
              # Création des widgets
              self.scroll_bar = tk.Scrollbar(self)
              self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
      
              self.text_area = tk.Text(self, yscrollcommand=self.scroll_bar.set)
              self.text_area.pack()
              self.scroll_bar.config(command=self.text_area.yview)
      
              self.output_lb = tk.Label(self, font=('Bold', 12))
              self.output_lb.pack(pady=10, anchor=tk.W)
      
              self.insert_check_btn(item_list)
      
          def insert_check_btn(self, item_list):
              for r in item_list:
                  var = tk.IntVar()
                  self.check_btn_vars.append(var)
                  check_btn = tk.Checkbutton(self.text_area, text=f'{r}', variable=var, command=lambda: self.selection_get(item_list))
                  self.text_area.window_create('end', window=check_btn)
                  self.text_area.insert('end', '\n')
      
              self.text_area.configure(state=tk.DISABLED, cursor='')
      
          def selection_get(self, item_list):
              self.selection = [item_list[i] for i, var in enumerate(self.check_btn_vars) if var.get() == 1]
              self.output_lb.config(text=self.selection)
      
          def get_selected_roi(self):
              return self.selection
      
      Item_list = ['Orly', 'Dora', 'Sandra', 'Passy', 'Line', 'Anna', 'Kolor', 'Papson', 'Thierson']
      
      root = tk.Tk()
      interface = DistCentreImagerie(root, Item_list)
      interface.mainloop()
      

      Une de tes problématiques est la POO et la confusion dans la création des widgets en fonction de leur parent.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        11 décembre 2023 à 15:24:23

        Je te remercie beaucoup pour ta réponse. 

        Effectivement, il n' y a pas mal de chose de modifier. Le code fonctionne très bien. je n'arrive néamoins pas toujours à trouver ou était la principale erreur dans mon code (a l'exécution, une fenêtre vide s'ouvre). 

        Encore merci

        • Partager sur Facebook
        • Partager sur Twitter
          11 décembre 2023 à 15:35:40

          Dans mon post précédent je te l'ai expliqué après avoir donné le code.

          Regarde la manière dont on créé les widgets, les callback pour check_btn (utilisation de lambda), ...

           Bref observe, compare et fait des petits tests sur ton interpréteur python.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          Problème tkinter liste déroulante cliquable

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown