2013-07-25 48 views
0

下面的腳本會要求用戶輸入並打開一個窗口。然後,我想從窗口獲取信息,並將它們放入列表或類似的列表中,以便創建類「參數」類的對象。除了當我嘗試使用Entry.get提取數據以將它們放入列表列表中時,所有東西都可以工作。python和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() 

詩作爲我是一個beginer,在我的腳本中的任何其他建議是多人歡迎:)

回答

1

我真的不知道你打算用這個做什麼,好像你要建立每個「個人課堂」之間的某種互動矩陣,但我可能是錯的。首先,你的函數沒有任何參數(get_payoff()),因爲你希望它從entr中提取某些東西,我會假設你想把entr作爲你函數的參數! 是這樣的:

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

「拉姆達」將允許在不當按鈕在GUI初始創建被稱爲要使用的功能。第二,當我執行(與修改)時,我有一個錯誤,因爲在函數中,你將嘗試使用無類型變量做get()。您想要提取數據的變量「entr」僅包含None類型,而不包含Entry小部件中的文本變量。原因是你不能像這樣在一個數組中存儲小部件。每次你想創建一個條目,你必須創建一個變量(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 

我不知道這是否可以幫助你,或者我完全關閉這裏的標記。

+0

你一點都不離譜,謝謝你。我沒有拉姆達。這將是有用的。確實,entr只包含「None」。我沒有真正理解爲什麼。由於我的Entry數取決於number_individuals_classes,我有義務使用列表,不是嗎?我怎麼能將所有用戶輸入到列表中的信息存儲在列表中?number_individuals_classes是什麼? –

+0

@ Remi.b Entry()是在tk窗口上創建Entry小部件的函數。因此,通過在您的程序中使用它,您可以成功創建Entry,但沒有鏈接到它的文本變量。沒有鏈接,沒有辦法(至少對我來說)提取你在Entry-中輸入的textvariable -string。 如果你想看到它簡單,輸入構件(像很多小部件)可以看到這樣的: 輸入(你把它,它是什麼掛)在你的代碼 而且很明顯,沒有鏈接部分。你只要提到它將在哪裏(fen1)並將其打包(grid(row = xx,col = xx)) – bserra

+0

噢好吧,我明白你的意思了。但是,那麼請問爲什麼我以前工作過的腳本(我將它添加到了帖子中)?在Entry()函數中,在您定義的第一個版本中沒有這樣的鏈接(textvariable) –

1

第一個也是最重要的問題是要附加到列表中的呼叫grid(這始終是None)的結果,而不是小工具:

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

這應該是:

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

此外,您嘗試使用payoff作爲全局變量,但在您的回調函數中使用它之前沒有全局名稱payoff。因此,當您嘗試將它用作Parameter構造函數的參數時,它不在相同的範圍內。

一般來說,如果您使用類,則可以改進小部件的創建,並且組織代碼會更好。