0

下面的脚本要求用户输入并打开一个窗口。然后我想从窗口中获取信息并将它们放在列表或类似列表中,以创建“参数”类的对象。一切正常,除非我尝试使用 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()

Ps 由于我是初学者,欢迎对我的脚本提出任何其他建议 :)

4

2 回答 2

2

我不太确定你打算用这个做什么,似乎你想在每个“个人类”之间建立某种交互矩阵,但我可能错了。

首先,您的函数没有任何参数( get_payoff() ),因为您希望它从 entr 中提取某些内容,所以我假设您希望将 entr 作为函数的参数!就像是 :

Button(fen1,text='Done', command=lambda : get_payoff(entr)).grid()

“lambda”将允许在 GUI 中最初创建按钮时使用该函数而不调用该函数。

其次,当我执行(修改)时,我遇到了一个错误,因为在函数中,您将尝试使用 None 类型变量执行 get()。您要提取数据的变量“entr”仅包含 None 类型,而不包含来自 Entry 小部件的文本变量。原因是您不能将小部件存储在这样的数组中。每次要创建条目时,都必须创建一个变量(文本变量),它将作为条目的链接:

# 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

我不知道这是否可以帮助您,或者我在这里是否完全不合时宜。

于 2013-07-25T11:24:23.787 回答
1

第一个也是最重要的问题是您将调用的结果附加到列表中grid(始终是None),而不是小部件:

focal_txts.append(Label(fen1,...).grid(...))
# ...

这应该是:

focal_label = Label(fen1,...)
focal_label.grid(...)
focal_txts.append(focal_label)

此外,您尝试将其用作全局变量,但在回调函数中使用它之前payoff没有全局名称。payoff因此,当您尝试将其用作构造函数的参数时Parameter,它不在同一范围内。

一般来说,如果您使用类,可以改进小部件的创建,并且代码的组织会更好。

于 2013-07-25T12:27:56.270 回答