2015-07-13 71 views
0

我有2个列表框(这是连接,使项目可以从一个移动到另一个),并在最后我想获得第二个列表框中的所有条目通过使用“确定”按钮(或简单地关闭框架)。每次选择一个项目时,我都可以在列表中添加/删除值(如下面代码的注释部分所示),但我宁愿在close函数中沿着[master.selected.get(idx) for idx in master.selected.curselection()]的行添加一行代码,但我无法让它工作。从Tkinter列表框中获取选定的项目,而不使用列表框绑定

代码:

def measurementPopup(self,master): 
    self.chargeCarrier = StringVar() 
    self.massModifiers = StringVar() 
    self.chargeCarrier.set("[M+xH]") 

    def onselect1(evt): 
     w = evt.widget 
     index = int(w.curselection()[0]) 
     value = w.get(index) 
     # My Dirty fix -> Here I could enter the selected value to a buffer list (to be returned in the ok function). 
     master.selected.insert(END,value) 
     master.avail.delete(index) 

    def onselect2(evt): 
     w = evt.widget 
     index = int(w.curselection()[0]) 
     value = w.get(index) 
     # My Dirty fix -> Here I could remove the selected value from a buffer list (to be returned in the ok function). 
     master.selected.delete(index) 
     master.avail.insert(END,value) 

    def close(self): 
     # Here I would return the buffer list and close the window 
     master.measurementWindow = 0 
     top.destroy() 

    if master.measurementWindow == 1: 
     return 

    master.measurementWindow = 1 
    top = self.top = Toplevel() 
    top.protocol("WM_DELETE_WINDOW", lambda: close(self)) 
    self.charge = Label(top, text = "Charge", width = 10) 
    self.charge.grid(row = 0, column = 0, sticky = W) 
    self.min = Label(top, text = "Min", width = 5) 
    self.min.grid(row=0, column = 1, sticky = W) 
    self.minCharge = Spinbox(top, from_= 1, to = 3, width = 5) 
    self.minCharge.grid(row = 0, column = 2, sticky = W) 
    self.max = Label(top, text = "Max", width = 5) 
    self.max.grid(row = 0, column = 3, sticky = W)     
    self.maxCharge = Spinbox(top, from_ = 1, to=3, width=5) 
    self.maxCharge.grid(row = 0, column = 4, sticky = W) 
    self.chargeCarrier = OptionMenu(top, self.chargeCarrier, "[M+xH]", "[M+xNa]") 
    self.chargeCarrier.grid(row = 0, column = 5, sticky = W) 
    self.availMass = Label(top, text = "Available") 
    self.availMass.grid(row = 1, column = 1, sticky = W) 
    self.selectMass = Label(top, text = "Selected") 
    self.selectMass.grid(row = 1, column = 3, sticky = W) 
    self.massMod = Label(top, text = "Mass Mods") 
    self.massMod.grid(row = 2, column = 0, sticky = W) 
    self.avail = Listbox(top) 
    for i in UNITS: 
     if BLOCKS[i]['available'] == 1: 
      self.avail.insert(END,BLOCKS[i]['human_readable_name']) 
    self.avail.grid(row = 2, column = 1, columnspan = 2, sticky = W) 
    self.avail.bind('<<ListboxSelect>>',onselect1) 
    self.selected = Listbox(top) 
    self.selected.grid(row = 2, column = 3, columnspan = 2, sticky = W) 
    self.selected.bind('<<ListboxSelect>>',onselect2) 
    self.ok = Button(top,text = 'Ok',command = lambda: close(self)) 
    self.ok.grid(row = 3, column = 0, sticky = W) 

我曾尝试使用以下的小片段在关闭功能:

 values = [master.selected.get(idx) for idx in master.selected.curselection()] 
     print ', '.join(values) 

然而,for段不返回任何东西。我认为这是由于事实上没有选择任何东西,但我需要一些相反的东西,沿着master.selected.allitems()(如果它存在并且如果我理解正确的话)的话。

摘要

一个人怎么会得到1名特定列表框中的所有项目?

回答

3

.get()功能为Listbox widget允许你指定一个范围内的项目,它可以被指定为0END返回所有项目的元组。

例子:

from Tkinter import * 
root = Tk() 
l = Listbox(root, width = 15) 
l.pack() 
l.insert(END, "Hello") 
l.insert(END, "world") 
l.insert(END, "here") 
l.insert(END, "is") 
l.insert(END, "an") 
l.insert(END, "example") 

def close(): 
    global l, root 
    items = l.get(0, END) 
    print(items) 
    root.destroy() 

b = Button(root, text = "OK", command = close).pack() 
root.mainloop() 

我希望这可以帮助,如果它不是你要找的人让我知道在评论,我可以尝试扩大我的回答。

+0

这比我预想的要容易得多,欢呼声。 –