python和Tkinter。使用Entry.get构建列表的列表
下面的脚本要求用户输入并打开一个窗口。然后我想从窗口获取信息,并将它们放入列表或类似的列表中,以便创建类“Parameter”的对象。除了我尝试用Entry提取数据外,其他一切都正常。开始将它们放入列表中python和Tkinter。使用Entry.get构建列表的列表,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,下面的脚本要求用户输入并打开一个窗口。然后我想从窗口获取信息,并将它们放入列表或类似的列表中,以便创建类“Parameter”的对象。除了我尝试用Entry提取数据外,其他一切都正常。开始将它们放入列表中 class Parameter (object): def __init__(self,number_individuals_classes,payoff): self.nb_classes = number_individuals_classes se
class Parameter (object):
def __init__(self,number_individuals_classes,payoff):
self.nb_classes = number_individuals_classes
self.payoff = payoff
def __repr__(self):
print('nc.classes: {} | payoff: {}'.format(self.nb_classes,self.payoff))
def get_parameters ():
def get_payoff():
global payoff
payoff = []
for i in xrange(len(entr)):
payoff.append(map(Entry.get, entr[i]))
fen1.destroy()
number_individual_classes = input('Number of individual classes: ')
fen1 = Tk()
fen1.title('Enter payoff matrices')
header1 = Label(fen1,text='Cooperation').grid(row=0,column=2)
header2 = Label(fen1,text='Defection').grid(row=0,column=3)
other_txts = []
focal_txts = []
vert_cop_def_txts = []
entr = []
iteration = 0
for focal in range(1,number_individual_classes):
for other in range(focal+1,number_individual_classes+1):
focal_txts.append(Label(fen1,text='Effect on: {}'.format(focal)).grid(column=0,row=3*iteration+2))
vert_cop_def_txts.append((Label(fen1,text='Cooperation').grid(column=1,row=3*iteration+2),Label(fen1,text='Defection').grid(column=1,row=3*iteration+3)))
other_txts.append(Label(fen1,text=' '*65 +'Co-player: {}'.format(other)).grid(row=3*iteration+1,column=2))
entr.append((Entry(fen1).grid(row=iteration*3+2,column=2),Entry(fen1).grid(row=iteration*3+2,column=3),Entry(fen1).grid(row=iteration*3+3,column=2),Entry(fen1).grid(row=iteration*3+3,column=3)))
iteration+=1
Button(fen1,text='Done',command=get_payoff).grid()
fen1.mainloop()
to_return = Parameter(number_individual_classes,payoff)
return to_return
a=get_parameters()
我做错了什么
更新:
这项工作。有什么区别
from Tkinter import *
def super_function():
out = map(Entry.get, entr)
fen1.destroy()
print out
fen1 = Tk()
entr = []
for i in xrange(10):
entr.append(Entry(fen1))
entr[i].grid(row=i+1)
Button(fen1, text = 'store everything in a list', command = super_function).grid()
fen1.mainloop()
由于我是一个新手,任何关于我剧本的建议都是非常受欢迎的:)我不确定你打算怎么做,看起来你想在每个“单独的类”之间建立某种交互矩阵,但我可能错了 首先,您的函数没有任何参数(get_payoff()),因为您希望它从entr中提取一些内容,我假设您希望将entr作为函数的参数! 比如:
Button(fen1,text='Done', command=lambda : get_payoff(entr)).grid()
当按钮最初在GUI中创建时,“lambda”将允许在不调用的情况下使用该函数
第二,当我执行(修改后)时,我得到了一个错误,因为在函数中,您将尝试使用无类型变量执行get()。您要提取数据的变量“entr”只包含无类型,而不包含Entry小部件中的textvariables。原因是您不能在这样的数组中存储小部件。每次要创建条目时,必须创建一个变量(textvariable),该变量将作为指向该条目的链接:
# a is a string variable
a = StrVar()
# which is linked to the Entry "test"
test = Entry(window, textvariable = a)
# get the variable in Entry "test"
b = test.get()
# print on screen the result
print b
我不知道这对你是否有帮助,或者我是否完全偏离了主题。我不确定你打算怎么做,似乎你想在每个“个体类”之间建立某种互动矩阵,但我可能错了 首先,您的函数没有任何参数(get_payoff()),因为您希望它从entr中提取一些内容,我假设您希望将entr作为函数的参数! 比如:
Button(fen1,text='Done', command=lambda : get_payoff(entr)).grid()
当按钮最初在GUI中创建时,“lambda”将允许在不调用的情况下使用该函数
第二,当我执行(修改后)时,我得到了一个错误,因为在函数中,您将尝试使用无类型变量执行get()。您要提取数据的变量“entr”只包含无类型,而不包含Entry小部件中的textvariables。原因是您不能在这样的数组中存储小部件。每次要创建条目时,必须创建一个变量(textvariable),该变量将作为指向该条目的链接:
# a is a string variable
a = StrVar()
# which is linked to the Entry "test"
test = Entry(window, textvariable = a)
# get the variable in Entry "test"
b = test.get()
# print on screen the result
print b
我不知道这是否对您有帮助,或者我是否完全偏离了主题。第一个也是最重要的问题是,您将调用
网格的结果(始终为无
)附加到列表中,而不是小部件:
focal_txts.append(Label(fen1,...).grid(...))
# ...
这应该是:
focal_label = Label(fen1,...)
focal_label.grid(...)
focal_txts.append(focal_label)
此外,您正试图将payoff
用作全局变量,但在回调函数中使用它之前,没有全局名称payoff
。因此,当您尝试将其用作参数的构造函数的参数时,它不在同一范围内
一般来说,如果使用类,可以改进小部件的创建,并且代码的组织也会更好 第一个也是最重要的问题是,您将调用网格
(始终为无
)的结果附加到列表中,而不是小部件:
focal_txts.append(Label(fen1,...).grid(...))
# ...
这应该是:
focal_label = Label(fen1,...)
focal_label.grid(...)
focal_txts.append(focal_label)
此外,您正试图将payoff
用作全局变量,但在回调函数中使用它之前,没有全局名称payoff
。因此,当您尝试将其用作参数的构造函数的参数时,它不在同一范围内
一般来说,如果使用类,可以改进小部件的创建,并且代码的组织也会更好 你一点也不过分,斯贝塞拉。我不喜欢lambda。这将是有用的。事实上,entr只包含“None”。我真的不明白为什么。由于我的参赛人数取决于个人和班级的数量,我不得不使用一个列表,不是吗?我如何存储用户将在列表中的条目中输入的所有信息?无论数量是多少?个人数是多少?类数是多少?@Remi.b Entry()是用于在tk窗口上创建条目小部件的函数。因此,通过在程序中使用它,您成功地创建了条目,但没有与之链接的textvariable。如果没有链接,就无法(至少对我来说)提取您在条目中键入的textvariable字符串。如果您想简单地看到它,条目小部件(像许多小部件一样)可以这样看:条目(您把它放在哪里,它链接到了什么)显然在您的代码中没有链接部分。你只要提到它的位置(fen1)并打包(grid(row=xx,col=xx))哦,好的,我明白你的意思了。但是,我可以问一下,为什么我之前的脚本有效(我把它添加到了帖子中)?在Entry()函数中没有这样的链接(textvariable),在第一个版本中,您将entr定义为:entr.append((Entry(fen1).grid(row=xx,col=xx)),而在第二个版本中:entr.append((Entry(fen1)),区别在于在第一个版本中您创建了小部件,因此网格()的结果方法是None。第二个方法是将小部件本身存储到一个表中,然后创建它(因此可以在不定义textvariable的情况下获取()值)好的,我现在明白了所有的事情!非常感谢你的帮助和解释。你一点也不离谱,thks bserra。我没有lambda。thks会有用的。事实上,entr只包含“None”.我真的不明白为什么。由于我的条目数量取决于个人和班级的数量,我不得不使用一个列表,不是吗?我如何将用户将在条目中输入的所有信息存储在一个列表中