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

2024-10-01 15:43:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是,如果我按addstage来创建另一个具有相同值的列表框,我就无法返回并编辑或检索旧列表框的选定值。你知道吗

我明白,这是因为列表框将具有相同的名称,所以。。。。。你知道吗

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

如果有人能帮我,那就太好了。你知道吗


Tags: textinselfcolumnbuttontechcommandgrid
1条回答
网友
1楼 · 发布于 2024-10-01 15:43:13

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

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

self.all_listboxes = []

# -

self.all_listboxes.append( listbox )

# -

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

顺便说一句:用self.listbox(in __init__)代替global listbox
i0Tech_option相同。你知道吗

我们使用classself不使用global

相关问题 更多 >

    热门问题