簡體   English   中英

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

[英]python and Tkinter. constructing a list of list with Entry.get

下面的腳本會詢問用戶輸入並打開一個窗口。 然后我想從窗口獲取信息並將它們放在列表或類似的列表中,以便創建類“參數”的對象。 一切正常,除非我嘗試使用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因為我是一個初學者,我的腳本上的任何其他建議都非常受歡迎:)

我不太確定你打算用這個做什么,似乎你想在每個“個別班級”之間建立某種互動矩陣,但我可能錯了。

首先,你的函數沒有任何參數(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

我不知道這是否可以幫到你,或者我是否完全不合適。

第一個也是最重要的問題是,您要向列表追加調用grid的結果(始終為None ),而不是小部件:

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

這應該是:

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

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

通常,如果使用類,可以改進動態創建窗口小部件,並且組織代碼會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM