2015-07-13 68 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

這比我預想的要容易得多,歡呼聲。 –