【问题标题】:Getting selected items from a Tkinter listbox without using a listbox bind在不使用列表框绑定的情况下从 Tkinter 列表框中获取所选项目
【发布时间】:2015-10-01 20:20:00
【问题描述】:

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

代码:

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)

我曾尝试在close函数中使用如下小sn-p:

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

但是,for 段不返回任何内容。我预计这是因为实际上没有选择任何内容,但我需要一些相反的东西,沿着 master.selected.allitems() 的路线(如果它存在并且我理解正确的话)。

总结

如何获得 1 个特定列表框中的所有项目?

【问题讨论】:

    标签: python-2.7 tkinter listbox


    【解决方案1】:

    Listbox 小部件的.get() 函数允许您指定一系列项目,可以将其指定为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()
    

    我希望这会有所帮助,如果这不是您想要的,请在评论中告诉我,我可以尝试扩展我的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多