Search code examples
pythontkintercalculator

Cannot get the clear button to work within my calculator


I've just gotten into programming and I tried to figure out how to create a calculator using tkinter and I couldn't for the life of me get the clear button to work. Every other button works, but the clear button just does nothing. Only throws up an error within my IDE because of an "unresolved reference 'clear'"

I'm really stuck here and since I'm new I have no clue how to solve this issue.

Here's the entire code, which is ultimately copied, but even so it doesn't work and I can't solve it myself.

from tkinter import *
import tkinter as tk

expression = ""

def press(num):
    global expression

    expression = expression + str(num)

    equation.set(expression)

def equalpress():

    try:
        global expression
        total = str(eval(expression))

        equation.set(total)


        expression = ""

    except:

        equation.set("error")
        expression = ""

    def clearentry():
        global expression
        expression = ""
        equation.set("")

if __name__ == "__main__": 
    gui = Tk()
    gui.configure(background="sky blue")
    gui.title("Calc is short for calculator chat")
    gui.geometry("270x150")

    equation = StringVar() 
    expression_field = Entry(gui, textvariable=equation)

    expression_field.grid(columnspan=4,ipadx=80)

    button1 = Button(gui, text = '1', fg='black', bg='white',
        command=lambda: press(1), height=1, width=7)
    button1.grid(row=2,column=0)

    button2 = Button(gui, text = '2', fg='black', bg='white',
                     command=lambda: press(2), height=1, width=7)
    button2.grid(row=2,column=1)

    button3 = Button(gui, text=' 3 ', fg='black', bg='white',
                     command=lambda: press(3), height=1, width=7)
    button3.grid(row=2, column=2)

    button4 = Button(gui, text=' 4 ', fg='black', bg='white',
                     command=lambda: press(4), height=1, width=7)
    button4.grid(row=3, column=0)

    button5 = Button(gui, text=' 5 ', fg='black', bg='white',
                     command=lambda: press(5), height=1, width=7)
    button5.grid(row=3, column=1)

    button6 = Button(gui, text=' 6 ', fg='black', bg='white',
                     command=lambda: press(6), height=1, width=7)
    button6.grid(row=3, column=2)

    button7 = Button(gui, text=' 7 ', fg='black', bg='white',
                     command=lambda: press(7), height=1, width=7)
    button7.grid(row=4, column=0)

    button8 = Button(gui, text=' 8 ', fg='black', bg='white',
                     command=lambda: press(8), height=1, width=7)
    button8.grid(row=4, column=1)

    button9 = Button(gui, text=' 9 ', fg='black', bg='white',
                     command=lambda: press(9), height=1, width=7)
    button9.grid(row=4, column=2)

    button0 = Button(gui, text=' 0 ', fg='black', bg='white',
                     command=lambda: press(0), height=1, width=7)
    button0.grid(row=5, column=0)

    plus = Button(gui, text='+', fg='black', bg='white',
                  command=lambda: press("+"), height=1, width=7)
    plus.grid(row=2, column=3)

    minus = Button(gui, text='-', fg='black', bg='white',
                  command=lambda: press("-"), height=1, width=7)
    minus.grid(row=3, column=3)

    multiply = Button(gui, text=' * ', fg='black', bg='white',
                      command=lambda: press("*"), height=1, width=7)
    multiply.grid(row=4, column=3)

    divide = Button(gui, text=' / ', fg='black', bg='white',
                    command=lambda: press("/"), height=1, width=7)
    divide.grid(row=5, column=3)

    equal = Button(gui, text=' = ', fg='black', bg='white',
                   command=equalpress, height=1, width=7)
    equal.grid(row=5, column=2)

    clear = Button(gui, text='Clear', fg='black', bg='white',
                   command= clear, height=1, width=7) **#this is where it doesnt work for me**
    clear.grid(row=5,column=1) 

    Decimal = Button(gui, text='.', fg='black', bg='white',
                     command=lambda: press('.'), height=1, width=7)
    Decimal.grid(row=6, column=0)

gui.mainloop()

I've tried defining the clear using some other techniques, tried using delete, and other things I found online, none of which worked for me.


Solution

  • It seems you defined your "clearentry" function inside another scope (inside equalpress scope to be more precise). By removing that from equalpress scope (in VS Code select the lines and hit Shift + Tab), and changing the command in the Button statement from "clear" to "clearentry" (which is the function you defined), it should work.

    def equalpress():
    
        try:
            global expression
            total = str(eval(expression))
    
            equation.set(total)
    
    
            expression = ""
    
        except:
    
            equation.set("error")
            expression = ""
    
    def clearentry():
        global expression
        expression = ""
        equation.set("")
    

    and:

    clear = Button(gui, text='Clear', fg='black', bg='white',
                   command= clearentry, height=1, width=7)
    clear.grid(row=5,column=1)