AttributeError: obiectul ‘NoneType’ nu are atributul ‘_root’ (Programare, Python, Python 3.X, Tkinter)

Serdia a intrebat.

Sunt complet nou în Python 3, urmărind doar exerciții simple de pe YouTube.

https://www.youtube.com/watch?v=nefopNkZmB4&index=3&list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_

Acesta este codul meu:

    from tkinter import *


def iCalc(source, side):
    storeObj = Frame(source, borderwidth=4, bd=4, bg="powder blue")
    storeObj.pack(side=side, expand=YES, fill=BOTH)
    return storeObj


def button(source, side, text, command=None):
    storeObj = Button(source, text=text, command=command)
    storeObj.pack(side=side, expand=YES, fill=BOTH)
    return storeObj


class app(Frame):

    def __init__(self):
        Frame.__init__(self)
        self.option_add('*Font', 'arial 20 bold')
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Calculator')

    display = StringVar()
    Entry(self, relief=RIDGE, textvariable=display, justify='right', bd=30, bg="powder blue").pack(side=TOP, expand=YES,
                                                                                                   fill=BOTH)
for clearBut in (["CE"], ["C"]):
    erase = iCalc(self, TOP)
for ichar in clearBut:
    button(erase, LEFT, ichar,
           lambda storeObj=display, q=ichar: storeObj.set(''))

for NumBut in ("789/", "456*", "123-", "0.+"):
    FunctionNum = iCalc(self, TOP)
for iEquals in NumBut:
    button(FunctionNum, LEFT, iEquals,
           lambda storeObj=display, q=iEquals: storeObj.set(storeObj.get() + q))
EqualsButton = iCalc(self, TOP)
for iEquals in '=':
    if iEquals in "=":
        btniEquals = button(EqualsButton, LEFT, iEquals)
        btniEquals.bind('<ButtonRelease-1>',
                        lambda e, s=self, storeObj=display: s.calc(storeObj), '+')
else:
    btniEquals = button(EqualsButton, LEFT, iEquals,
                        lambda storeObj=display, s=' %s ' % iEquals: storeObj.set(storeObj.get() + s))


def calc(self, display):
    try:
        display.set(eval(display.get()))
    except:
        display.set("ERROR")

if __name__ == '__main__':
    app().mainloop()

Primesc o eroare:

Ce fac greșit?

Comentarii

  • Nu mai puteți crea alte widgeturi după ce ați ieșit din bucla principală. Eliminați ultimele două declarații din programul dvs. –  > Por DYZ.
  • Îmi pare rău, dar care sunt ultimele două declarații? #Entry(self,relief = RIDGE, #textvariable = display,justify = 'right', bd = 30, bg = "powder blue").pack(side = TOP, expand = YES, fill = BOTH) –  > Por Serdia.
  • display=... și Entry(self,... Acestea sunt ultimele două. –  > Por DYZ.
  • #DYZ am scos aceste linii, dar eroarea rămâne în continuare. mi-am actualizat și codul complet. Mulțumesc.  > Por Serdia.
  • Vă rugăm să vă reparați formatarea codului. După modificare, nu este deloc clar ce face codul tău acum. –  > Por DYZ.
1 răspunsuri
Bryan Oakley

Din cauza indentației, display = StringVar() nu se află într-o metodă. Asta înseamnă că se execută atunci când clasa este definită pentru prima dată. Nu puteți crea o instanță a clasei StringVar decât după ce a fost creată fereastra rădăcină.

Trebuie să adăugați încă un nivel de indentare pentru această linie și pentru linia de sub ea.

Comentarii

  • Lucrez în SQL și nu contează cum vă puneți codul, decât dacă doriți să îl faceți să arate frumos. Deci, în Python trebuie să măsor întotdeauna distanța dintre linii? Sau cum ar trebui să o numesc? –  > Por Serdia.