0

I am trying to create a calculator GUI but the get() and update() are not working. It throws an AttributeError: 'NoneType' object has no attribute 'get'/'update'. I didn't found the solution to this problem on youtube or Google. There is no problem with the loop. Everything works fine except the get() and update().

from tkinter  import *

def click(event):
    global entryvar
    text=event.widget.cget("text")
    if text=="=":
        if entryvar.get().isdigit():
            value=int(entryvar.get())
        else:
            value=eval(screen.get())

        entryvar.set(value)
        screen.update()
    elif text=="C":
        entryvar.set("")
        screen.update()
    else:
        entryvar.set(entryvar.get()+text)
        screen.update()


root=Tk()
root.geometry("450x600")


entryvar=StringVar()

root.title("Basic Calculator")
screen=Entry(root,textvar=entryvar,font="lucida 24 bold").pack(fill=X,ipady=25)

row1=Frame(root,bg="gray")
but=Button(row1,text="9",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)

but=Button(row1,text="8",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row1,text="7",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)

row1.pack()

row2=Frame(root,bg="gray")
but=Button(row2,text="6",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row2,text="5",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row2,text="4",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
row2.pack()

row3=Frame(root,bg="gray")
but=Button(row3,text="3",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row3,text="2",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row3,text="1",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
row3.pack()

row4=Frame(root,bg="gray")
but=Button(row4,text="+",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row4,text="0",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row4,text="-",font="lucida 24 bold")
but.pack(side=LEFT,padx=4,pady=2,ipadx=21,ipady=20)
but.bind("<Button-1>",click)
row4.pack()

row5=Frame(root,bg="gray")
but=Button(row5,text="*",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row5,text="=",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
but=Button(row5,text="/",font="lucida 24 bold")
but.pack(side=LEFT,padx=2,pady=2,ipadx=20,ipady=20)
but.bind("<Button-1>",click)
row5.pack()

root.mainloop()
martineau
  • 119,623
  • 25
  • 170
  • 301

1 Answers1

1

The problem is very simple to solve. In the assignment you made to screen you called a function pack which returns None, thereby assigning None to screen.

rewrite line 29

screen=Entry(root,textvar=entryvar,font="lucida 24 bold").pack(fill=X,ipady=25)

as

screen=Entry(root,textvar=entryvar,font="lucida 24 bold")
screen.pack(fill=X,ipady=25)
martineau
  • 119,623
  • 25
  • 170
  • 301
PRMP Smart
  • 11
  • 2