[英]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.