2012-12-11 29 views
1

这是我今天早些时候提出的同样的问题,以及您尝试帮助我的几个问题,但是我无法使其工作。我想要做的就是用我在单击列表框时选择的多个选项填充“ichose”。Python中的问题从Tkinter列表框中获取多个选择

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 

不管我做什么,“ichose”作为一个空元组()出现。 很明显,“进入”功能从来没有被调用,因为我从来没有看到测试字符串'你好'。

我也不知道“双按钮”,“<>”等各种选项是什么,我在哪里可以找到每一个列表和解释?

如果有人可以请只修改我的程序,使“打印毛榉糖”的作品,我会很感激。你可以从我的程序中看到,我并不真正知道自己在做什么,但热衷于学习。谢谢。

回答

2

我终于找到了自己问题的答案。如果要从列表框中捕获多个响应,这非常有用。我已经评论了很多。希望能帮助到你!

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("---------------------------")