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