以下脚本会询问用户输入并打开一个窗口。然后我想从窗口获取信息并将它们放在列表或类似的列表中,以便创建类“参数”的对象。一切正常,除非我尝试使用Entry.get提取数据以将它们放入列表列表中。
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()
P.s由于我是初学者,我的剧本上的任何其他建议都非常受欢迎:)
答案 0 :(得分:1)
我不确定你打算怎么做,看起来你想在每个“个别班级”之间建立某种互动矩阵,但我可能错了。
首先,你的函数没有任何参数(get_payoff()),因为你希望它从entr中提取一些东西,我会假设你想把entr作为你函数的参数! 类似的东西:
Button(fen1,text='Done', command=lambda : get_payoff(entr)).grid()
“lambda”将允许在GUI中最初创建按钮时不使用该函数来使用该函数。
其次,当我执行(通过修改)时,我遇到了一个错误,因为在函数中你将尝试使用None类型变量来执行get()。要提取数据的变量“entr”仅包含None类型,而不包含Entry小部件中的textvariables。原因是您无法将窗口小部件存储在这样的数组中。每次要创建条目时,都必须创建一个变量(文本变量),该变量将成为条目的链接:
# 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
我不知道这是否可以帮助你,或者我是否完全不在这里。
答案 1 :(得分:1)
第一个也是最重要的问题是,您要向列表中附加调用grid
(始终为None
)的结果,而不是小部件:
focal_txts.append(Label(fen1,...).grid(...))
# ...
这应该是:
focal_label = Label(fen1,...)
focal_label.grid(...)
focal_txts.append(focal_label)
此外,您尝试使用payoff
作为全局变量,但在回调函数中使用它之前没有全局名称payoff
。因此,当您尝试将其用作Parameter
的构造函数的参数时,它不在同一范围内。
通常,如果您使用类,可以改进动态创建窗口小部件,并且可以更好地组织代码。