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

Python 如何使用按钮创建新的列表框,并使用TKinter中的最终提交按钮收集所有数据?,python,button,user-interface,listbox,tkinter,Python,Button,User Interface,Listbox,Tkinter,好吧,这是我的问题。我试图用Tkinter创建一个非常开放的用户友好Gui。简而言之,我把一个按钮作为一个函数阶段,它创建了一个具有可选择索引的列表框。然后,我可以按下按钮提交,将打印选定的关键点 但是,如果我按ADD STAGE创建另一个具有相同值的列表框,我将无法返回并编辑或检索旧列表框的选定值 我知道这是因为列表框将具有相同的名称,所以 from Tkinter import * import tkMessageBox class Insert_page(Frame): glob

好吧,这是我的问题。我试图用Tkinter创建一个非常开放的用户友好Gui。简而言之,我把一个按钮作为一个函数阶段,它创建了一个具有可选择索引的列表框。然后,我可以按下按钮提交,将打印选定的关键点

但是,如果我按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) 
它应该做的是创建新的listbox变量,但当按下submit时,我得到的是

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
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.7/lib-tk/Tkinter.py”,第1413行,在调用中__
返回self.func(*args)
文件“/home/xxxxxx/pythons/xxxxxxx.py”,第78行,在
mButton3=按钮(self,text='submit',command=lambda:self.submit(eval('listbox\%s'(i0)),Tech_option)).grid(行=9+5*i0,列=1,粘性=W)
文件“”,第1行,在
名称错误:未定义名称“listbox_1”

如果有人能帮我,那就太好了。

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

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


顺便说一句:使用
self.listbox
(在
\uuuu init\uuuu
中)代替
全局列表框

i0
Tech\u选项
相同


我们使用
class
self
来避免使用真正有助于THX的
global

self.all_listboxes = []

#---

self.all_listboxes.append( listbox )

#---

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