2013-06-27 6 views
0

Я работаю с модулем tkinter в python 3.3 Я относительно новичок в этом и работаю с полями ввода. по какой-то причине, когда я запускаю следующий код, я получаю сообщение об ошибке: AttributeError: объект «NoneType» не имеет атрибута «get». Может ли кто-нибудь объяснить мне, почему? Я сделал аналогичную программу с единственной записью, которая отлично работала.объект не имеет атрибута get

from tkinter import * 
master =Tk() 
class quad(object): 
def __init__(self, ae, be, ce): 
    self.ae = ae 
    self.be = be 
    self.ce = ce 

def calculate(self): 
    a = self.ae.get() 
    b = self.be.get() 
    c = self.ce.get() 
    A = float(a) 
    B = float(b) 
    C = float(c) 
    D = (-B)/(2*A) 
    E = ((B**2 -4*A*C)**(.5))/(2*A) 
    first = D + E 
    second = D - E 
    print(first, "\n", second) 
Label(master, text='A=').grid(row=0, column=0) 
Label(master, text='B=').grid(row=1, column=0) 
Label(master, text='C=').grid(row=2, column=0)  
ae = Entry(master).grid(row=0, column=1) 
be = Entry(master).grid(row=1, column=1) 
ce = Entry(master).grid(row=2, column=1) 
model =quad(ae, be, ce) 
Button(master, text='submit', width=10, command=model.calculate).grid(row=3, column=1, sticky=W) 
mainloop() 
+0

Вариации этого вопроса было предложено несколько раз на этом сайте. Например, [Python TkInter - AttributeError: объект «NoneType» не имеет атрибута «get»] (http://stackoverflow.com/questions/1101750/python-tkinter-attributeerror-nonetype-object-has-no-attribute-get) , –

ответ

4

Посмотрите на сообщение об ошибке: что он говорит? Он точно говорит вам, в чем проблема. Это даже говорит вам номер строки.

AttributeError: 'NoneType' object has no attribute 'get'

Уведомление: где говорится: 'NoneType'? Это означает, что какая-то переменная равна None, хотя вы думаете, что это что-то еще. И, очевидно, None не имеет метода с именем get. Итак, вы должны спросить себя, почему это None?

Вы не можете указать это в своем вопросе, но, вероятно, ошибка происходит на переменной ae (а также на переменных be и ce). Так что вопрос в том, почему они None?

Причина они None в том, что вы устанавливаете их как это:

ae = Entry(master).grid(row=0, column=1)

В питона, когда вы x=a().b(), х получает значение b(). Таким образом, вы устанавливаете ae в значение оператора grid(...), и оператор сетки всегда возвращает None.

Решение отделить создание виджета от макета, который обычно является хорошей практикой, даже если вам не нужно сохранять ссылки на GUI виджетов:

ae = Entry(...) 
be = Entry(...) 
ce = Entry(...) 
... 
ae.grid(...) 
be.grid(...) 
ce.grid(...) 
Смежные вопросы