python和Tkinter。使用Entry.get构建列表列表

时间:2013-07-25 09:34:58

标签: python python-2.7 tkinter

以下脚本会询问用户输入并打开一个窗口。然后我想从窗口获取信息并将它们放在列表或类似的列表中,以便创建类“参数”的对象。一切正常,除非我尝试使用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由于我是初学者,我的剧本上的任何其他建议都非常受欢迎:)

2 个答案:

答案 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的构造函数的参数时,它不在同一范围内。

通常,如果您使用类,可以改进动态创建窗口小部件,并且可以更好地组织代码。