2013-04-14 6 views
0

Когда я нажал на кнопку в этом сценарии я получаю сообщение об ошибке говорящееИзвлечение данных из записи

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__ 
    return self.func(*args) 
File "grid_layout.py", line 41, in printout 
data = [ { l1.cget("text"): (e1.get(), e2.get()) } for e1,e2,l1 in zip(E1,E2,L1) ] 
AttributeError: 'NoneType' object has no attribute 'get' 

Что я делаю неправильно здесь?

from Tkinter import * 
import json 


root = Tk() 

E1 = [] 
E2 = [] 
E3 = [] 
L1 = [] 

Label(root, text="Way Point").grid(row=0, column=0) 
Label(root, text="x").grid(row=0, column=1) 
Label(root, text="y").grid(row=0, column=2) 
Label(root, text="z").grid(row=0, column=3) 

for r in range(1,10): 
    l1 = Label(root, text="Number%d" % (r),borderwidth=1).grid(row=r, column=0) 
    e1 = Entry(root, width=10).grid(row=r, column=1) 
    e2 = Entry(root, width=10).grid(row=r, column=2) 
    e3 = Entry(root, width=10).grid(row=r, column=3) 
    E1.append(e1) 
    E2.append(e2) 
    E3.append(e3) 
    L1.append(l1) 

Label(root, text="zone").grid(row=11, column=0) 
Label(root, text="x").grid(row=11, column=1) 
Label(root, text="y").grid(row=11, column=2) 
Label(root, text="z").grid(row=11, column=3) 

for r in range(12,22): 
    l2 = Label(root, text="Number%d" % (r-11),borderwidth=1).grid(row=r, column=0) 
    e4 = Entry(root, width=10).grid(row=r, column=1) 
    e5 = Entry(root, width=10).grid(row=r, column=2) 
    e6 = Entry(root, width=10).grid(row=r, column=3) 

def printout(): 
# Iterate over the zip of E & L (joined), building the dict using .cget('text') to get 
# the value of the Tkinter label. Add the { 'c':3.0 } to the end of the resulting list 
    data = [ { l1.cget("text"): (e1.get(), e2.get()) } for e1,e2,l1 in zip(E1,E2,L1) ] 
    print json.dumps(data, sort_keys=True, indent=2) 
    with open('data.json', 'w') as outfile: 
     json.dump(data, outfile, sort_keys=True, indent=2) 

plus = Button(root, text='Print', command=printout) 
plus.grid(row=23, column=1) 

root.mainloop() 
+0

Сообщение об ошибке сообщает вам, что именно не так - есть ли что-то в сообщении об ошибке, которое вы не понимаете? Это говорит вам, что «e1» - «Нет», поэтому все, что вам нужно сделать, это найти место, где, по вашему мнению, вы его определяете, и проверить, делает ли код то, что, по вашему мнению, он делает. –

ответ

2

Посмотрите на этой линии:

e1 = Entry(root, width=10).grid(row=r, column=1) 

В данном случае это делает то же самое, как:

e1 = Entry(root, width=10) 
e1 = e1.grid(row=r, column=1) 

e1.grid(...) возвращает None, так что вы в конечном итоге с e1 = None. Поскольку вы используете этот тип назначения везде, ваши списки заполняются только None, поэтому, когда вы позже вызываете на них ... e1.get() ..., вы получаете эту ошибку.

Попробуйте разделить создание объектов и методов вызова на них.

+0

Ваш комментарий, что два одинаковых, явно ложно. Они определенно не такие, как вы описали позже в своем ответе. Я думаю, вам нужно перефразировать утверждение «Это то же самое, что:», чтобы быть более правильным. –

+0

@BryanOakley - Попробовал перефразировать его немного. – mata

Смежные вопросы