2012-12-11 4 views
1

C'est le même problème que j'ai posé plus tôt aujourd'hui et que quelques uns d'entre vous ont essayé de m'aider, mais je n'arrive pas à le faire fonctionner. Tout ce que je veux faire est de remplir "ichose" avec les multiples sélections que je fais quand je clique sur la liste.Problèmes en Python obtenant des sélections multiples de Tkinter listbox

import Tkinter as tk 
from Tkinter import * 
global ichose 

class App(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self,master) 
     self.master=master 
     self.grid() 
     self.ichose =() 

     self.l = Listbox(self, height=10, selectmode=EXTENDED) 
     # Selectmode can be SINGLE, BROWSE, MULTIPLE or EXTENDED. Default BROWSE 
     self.l.grid(column=0, row=0, sticky=(N,W,E,S)) 
     self.l.bind("Double-Button-1", self.entered) 

     s = Scrollbar(self, orient=VERTICAL, command=self.l.yview) 
     s.grid(column=0, row=0, sticky=(N,S,E)) 
     self.l['yscrollcommand'] = s.set 

     for i in range(1,101): 
      self.l.insert('end', 'Line %d of 100' % i) 


    def entered(self, event): 
     self.ichose = self.selection_get() 
     self.ichose = ('hello') 

root=tk.Tk() 
root.title('Listbox Problem') 
root.geometry('200x200') 
app=App(root) 
root.mainloop() 

print app.ichose 

Tout ce que je fais, "ichose" apparaît comme un tuple vide(). Il est clair que la fonction "entrée" n'est jamais appelée car je ne vois jamais la chaîne de test "bonjour".

Je ne sais pas non plus quelles sont les différentes options comme dans "Double-Button-", "<>" etc. Où puis-je trouver une liste et une explication de chacune?

Si quelqu'un pouvait simplement modifier mon programme pour que "print ichose" fonctionne, je serais vraiment reconnaissant. Vous pouvez voir dans mon programme que je ne sais pas vraiment ce que je fais mais que je suis désireux d'apprendre. Je vous remercie.

Répondre

2

J'ai enfin trouvé la réponse à ma propre question. Ceci est vraiment utile si vous voulez capturer plusieurs réponses d'une liste. J'ai beaucoup commenté. J'espère que cela aide!

import Tkinter as tk 
from Tkinter import * 

class App(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self,master) 
     self.master=master 
     self.grid() 
     self.ichose = [] 

     self.l = Listbox(self, height=10, selectmode=MULTIPLE) 
     # Selectmode can be SINGLE, BROWSE, MULTIPLE or EXTENDED. Default BROWSE 
     self.l.grid(column=0, row=0, sticky=(N,W,E,S)) 

     s = Scrollbar(self, orient=VERTICAL, command=self.l.yview) 
     s.grid(column=0, row=0, sticky=(N,S,E)) 
     self.l['yscrollcommand'] = s.set 

     for i in range(1,101): 
      self.l.insert('end', 'Line %d of 100' % i) 

     # Create Textbox that will display selected items from list 
     self.selected_list = Text(self,width=20,height=10,wrap=WORD) 
     self.selected_list.grid(row=12, column=0, sticky=W)   

     # Now execute the poll() function to capture selected list items 
     self.ichose = self.poll() 

    def poll(self): 
     items =[] 
     self.ichose = [] 
     # Set up an automatically recurring event that repeats after 200 millisecs 
     self.selected_list.after(200, self.poll) 
     # curselection retrieves the selected items as a tuple of strings. These 
     # strings are the list indexes ('0' to whatever) of the items selected. 
     # map applies the function specified in the 1st parameter to every item 
     # from the 2nd parameter and returns a list of the results. So "items" 
     # is now a list of integers 
     items = map(int,self.l.curselection()) 

     # For however many values there are in "items": 
     for i in range(len(items)): 
      # Use each number as an index and get from the listbox the actual 
      # text strings corresponding to each index, and append each to 
      # the list "ichose". 
      self.ichose.append(self.l.get(items[i])) 
     # Write ichose to the textbox to display it. 
     self.update_list() 
     return self.ichose 

    def update_list(self): 
     self.selected_list.delete(0.0, END) 
     self.selected_list.insert(0.0, self.ichose) 


root=tk.Tk() 
root.title('Listbox Multi-Capture') 
root.geometry('200x340') 
app=App(root) 
root.mainloop() 

print app.ichose 
1
# ----------------[ Listbox EXAMPLE ]---------------- 

    self.sarcCountries = (
     "Bangladesh", 
     "India", 
     "Pakistan", 
     "Nepal", 
     "Bhutan", 
     "Sri Lanka", 
     "Afghanistan" 
    ) 

    self.listData = StringVar(value = self.sarcCountries) 

    self.listbox = Listbox(
     master   = self, 
     height   = 10, 
     listvariable  = self.listData, 
     selectmode  = MULTIPLE, 
     selectbackground = "#BC80CC" 
    ) 

    self.listbox.bind("<<ListboxSelect>>", self.OnListboxSelectionChanged) 

    self.listbox.pack(fill = BOTH, expand = 0, padx = 10, pady = 10) 
# ----------------[ Listbox EXAMPLE ]---------------- 


def OnListboxSelectionChanged(self, val): 
    # NOTE: If your listbox's select mode is MULTIPLE, then you may use this portion of code 
    selections = val.widget.curselection() 

    print("---------------------------") 

    if (selections !=()): 
     for index in selections: 
      print(self.sarcCountries[int(index)]) 

    print("---------------------------") 
Questions connexes