2017-09-09 1 views
-1

Je veux utiliser la valeur sélectionnée dans ma liste dans la commande d'un bouton, de sorte qu'aucun code ne s'exécute tant que le bouton "Go" n'est pas enfoncé. Jusqu'ici, j'ai seulement vu qu'une liste déroulante exécute du code sur la sélection d'un élément en se liant à <>. Cela me semble stupide, un programme devrait certainement avoir une sorte de sélection en deux étapes pour s'assurer que l'utilisateur sélectionne exactement ce qu'il veut (tangente, désolé).Appeler une fonction sur un bouton en utilisant la valeur de la boîte de liste Tkinter

J'ai essayé jusqu'à présent de créer une variable pour la sélection en cours en utilisant .curselection() [0] et .get mais j'obtiens une erreur d'index (probablement parce qu'il n'y a pas de sélection au départ). Ensuite, si je définis une sélection initiale, je ne peux pas la changer et elle sera toujours exécutée en fonction de cette sélection.

Sûrement cela devrait être facile et il me manque quelque chose.

[EDIT] Ajout de code dump comme suggéré:

class DataVisualiser: 
    def __init__(self, master): 
     master.minsize(width=600, height=400) 
     frame = Frame(master) 
     frame.grid() 

     # Histogram Generator 
     hist_options = ["Cat vs. Dog", "Cat Breed", "Dog Breed", "Cat Name", "Dog Name", "Cat Location", 
         "Dog Location", "Cat Registration", "Dog Registration"] 
     hist_dd = Listbox(master, bg="#cfcfcf", fg="black", font="Helvetica", height=5, selectmode=SINGLE) 
     for o in hist_options: 
      hist_dd.insert(0, o) 
     hist_dd.grid(row=0, column=0) 
     hist_dd.selection_set(first=0) 
     hist_scroll = Scrollbar(master, orient=VERTICAL) 
     hist_dd["yscrollcommand"] = hist_scroll.set 
     hist_scroll["command"] = hist_dd.yview 
     hist_scroll.grid(row=0, column=1, rowspan=7, sticky=N+S) 
     # scrollbar from: https://www.youtube.com/watch?v=xNLdB0jY1Rg 
     # HERE: I want to pass the value from the listbox to another function via this button 
     hist_gen = Button(master, text="Go!", 
          command=lambda group=hist_dd.get(hist_dd.curselection()[0]): generate_histogram(group)) 
     # still need to fully implement this 
     hist_gen.grid(row=6, column=0, sticky=W+E)  

def generate_histogram(group): 
    print(group) 
    return None 

root = Tk() 
dv = DataVisualiser(root) 
root.mainloop() 
+2

Votre code nous aiderait tous. S'il vous plaît lire [MCVE]. – Lafexlos

+0

Dans la fonction de rappel du bouton ** GO **, pouvez-vous simplement obtenir l'élément de la liste? – wwii

+0

Avec quoi? Comme je l'ai dit 'command = lambda groupe = w.get (w.curselection() [0]): go (groupe))' entraîne une erreur d'index. – 420fedoras

Répondre

0

Depuis votre DataVisualiser est une classe, il sera préférable de faire d'autres fonctions méthodes de la classe à la place. Vos variables (ou certaines d'entre elles) doivent également être transformées en variables d'instance de classe pour éviter d'utiliser le mot-clé global.

J'ai fait la variable de variable group une instance en utilisant le mot-clé self (self.group), et a créé une méthode, select, qui met à jour la que chaque fois les variables de changement de sélection listbox. A également fait la fonction generate_histogram une méthode de classe. Vous devrez peut-être faire certaines variables d'instance d'autres variables en fonction de l'objectif global du programme.

Le code mis à jour ci-dessous contient des commentaires pour expliquer certains des autres changements/ajouts. Vous devrez peut-être modifier l'instruction d'importation en fonction de la version de Python que vous utilisez.

from Tkinter import * 

class DataVisualiser: 
    def __init__(self, master): 
     master.minsize(width=600, height=400) 
     frame = Frame(master) 
     frame.grid() 

     # Histogram Generator 
     hist_options = ["Cat vs. Dog", "Cat Breed", "Dog Breed", "Cat Name", "Dog Name", "Cat Location", 
         "Dog Location", "Cat Registration", "Dog Registration"] 
     hist_dd = Listbox(master, bg="#cfcfcf", fg="black", font="Helvetica", height=5, selectmode=SINGLE) 
     for o in hist_options: 
      hist_dd.insert(0, o) 
     hist_dd.grid(row=0, column=0) 
     hist_dd.selection_set(first=0) 
     hist_scroll = Scrollbar(master, orient=VERTICAL) 
     hist_dd["yscrollcommand"] = hist_scroll.set 
     hist_scroll["command"] = hist_dd.yview 
     hist_scroll.grid(row=0, column=1, rowspan=7, sticky=N+S) 

     # scrollbar from: https://www.youtube.com/watch?v=xNLdB0jY1Rg 
     # HERE: I want to pass the value from the listbox to another function via this button 
     self.group = hist_dd.get(hist_dd.curselection()[0]) #make group a class variable 

     # don't use default keyword parameters i.e, group= ..... 
     hist_gen = Button(master, text="Go!", 
          command=lambda: self.generate_histogram(self.group)) 
     # still need to fully implement this 
     hist_gen.grid(row=6, column=0, sticky=W+E) 
     hist_dd.bind('<<ListboxSelect>>', self.select) # bind selecction event to listbox 


    #method to change the 'group' variable anytime a listbox selection changes 
    def select(self, event): 
     widget = event.widget 
     selection=widget.curselection() 
     self.group = widget.get(selection[0]) 


    #class method 
    def generate_histogram(self, group): 
     print(group) 
     return None 

root = Tk() 
dv = DataVisualiser(root) 
root.mainloop()