如何使用Button创建新的列表框并使用TKinter中的最终提交按钮收集所有数据?

时间:2014-07-01 16:04:58

标签: python button user-interface listbox tkinter

好的,这是我的问题。我正在尝试用Tkinter创建一个非常开放的用户友好的Gui。简而言之,我创建了一个按钮功能STAGE,它创建了一个具有可选索引的Listbox。然后我可以按下SUBMIT按钮,打印选定的按键。

但如果我按ADD STAGE制作另一个具有相同值的列表框,我就无法返回并编辑或检索旧列表框的选定值。

据我所知,这是因为列表框会有相同的名字......

from Tkinter import *
import tkMessageBox

class Insert_page(Frame):
    global i0
    global listbox  
    global Tech_option
    Tech_option=['Rolled Plate','extrude bar','as-cast','wire','Other','USER Details']
    i0=-1
    def __init__(self,parent):
        Frame.__init__(self,parent,background="white")




    self.parent=parent
    self.initUI()

    def initUI(self):
        self.parent.title("material Gui v2")
        self.grid(row=1,column=1)


        mButton=Button(self,text='Start Stages',command=self.stage).grid(row=2,column=5,sticky=W)        

        mButton3=Button(self,text='submit',command=self.submit).grid(row=9,column=1,sticky=W) 

    def stage(self): ######################HERE IS THE PROBLEM#########
        global i0
        i0+=1  

        stageFrame=Frame(self,bd=1,bg='red',relief=SUNKEN)
        stageFrame.grid(row = 1+5*i0, column = 1, rowspan = 5, columnspan = 7, sticky = W+E+N+S)


        stageVar = StringVar()
        OPTIONS = [""]+range(0,10)
        w = apply(OptionMenu, (stageFrame, stageVar) + tuple(OPTIONS))
        w.grid(row=1,column=1)


        stageLabel=Label(stageFrame,text='Stage')
        stageLabel.grid(row=1+5*i0,column=0,sticky=W)     

        mButton=Button(stageFrame,text='add Stage',command=self.stage).grid(row=9,column=1,sticky=W)

        listbox = Listbox(stageFrame,selectmode= MULTIPLE,exportselection=False) ######REPLACED CODE######
        listbox.grid(row=3+5*i0,column=2)

        for item in Tech_option :
            listbox.insert(END, item)

        mButton3=Button(self,text='submit',command=lambda: self.submit(listbox,Tech_option)).grid(row=9+5*i0,column=1,sticky=W) 
    ######REPLACED CODE######
    def submit(self,lb,option_list):
        Tech_select=[]
        for i in list(lb.curselection()):
            Tech_select.append(Tech_option[int(i)])
        print Tech_select


def main():
    mGui= Tk()
    mGui.geometry('800x600+200+200')

    menubar=Menu(mGui)
    filemenu=Menu(menubar,tearoff=0)
    filemenu.add_command(label="New")
    filemenu.add_command(label="Open")
    filemenu.add_command(label="SaveAs...")
    filemenu.add_command(label="Close")
    menubar.add_cascade(label='File',menu=filemenu)      

    mGui.config(menu=menubar)

    app=Insert_page(mGui)

    mGui.mainloop()



main()

我用它替换了它......

exec ('listbox_%s = Listbox(stageFrame,selectmode= MULTIPLE,exportselection=False)' % (i0)) in globals(), locals()
        exec ('listbox_%s.grid(row=3+5*i0,column=2)' % (i0)) in globals(), locals()

        for item in Tech_option :
            exec ('listbox_%s.insert(END, item)' % (i0)) in globals(), locals()



        mButton3=Button(self,text='submit',command=lambda: self.submit(eval('listbox_%s'%(i0)),Tech_option)).grid(row=9+5*i0,column=1,sticky=W) 

它应该做的是创建新的列表框变量,但是当我按下提交时我得到的全部是。

Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "/home/xxxxxx/pythons/xxxxxxxx.py", line 78, in <lambda>
    mButton3=Button(self,text='submit',command=lambda: self.submit(eval('listbox_%s'%(i0)),Tech_option)).grid(row=9+5*i0,column=1,sticky=W)
  File "<string>", line 1, in <module>
NameError: name 'listbox_1' is not defined

如果有人可以帮助我,那就太好了。

1 个答案:

答案 0 :(得分:2)

您需要listbox列表来保留所有阶段的所有列表 现在在listbox中,您只有上一个创建阶段的列表。

你必须使用这样的行(在不同的地方)

self.all_listboxes = []

#---

self.all_listboxes.append( listbox )

#---

for one_list in self.all_listboxes:
     for x in one_list.curselection():

BTW:使用self.listbox__init__}代替global listbox
i0Tech_option相同。

我们使用classself来不使用global