简体   繁体   中英

In Python, it shows: "NameError: name 'math' is not defined" and I can't seem to figure out what the problem is

I am trying to build a calculator with Tkinter and I set a variable "math" which helps the program to know which operation it needs to do (Addition, Subtraction, etc) but when I try to run it, it says "NameError: name 'math' is not defined" and I can't figure out what I'm doing wrong

Any help would be appreciated. I'm just a beginner. Here is the code in question:

from tkinter import *


root = Tk()
root.title("Simple Calculator")

e = Entry(root, width=35)
e.insert(0, "")
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

def button_click(number):
    current = e.get()
    e.delete(0, END) 
    e.insert(0, str(current) + str(number)) 



def clear_button():
    e.delete(0, END)


def button_add():
    math = "addition"
    first_number = e.get()
    global f_num 
    f_num = int(first_number)
    e.delete(0,END)
    

def button_equal():
    second_number = e.get()
    e.delete(0, END)
    if (math == "addition"):
        e.insert(0, f_num + int(second_number))
    elif (math == "subtraction"):
        e.insert(0, f_num - int(second_number))
    elif (math == "multiplication"):
        e.insert(0, f_num * int(second_number))
    elif math == "division":
        e.insert(0, f_num / int(second_number))

def button_subtraction():
    first_number = e.get()
    global f_num 
    math = "subtraction"
    f_num = int(first_number)
    e.delete(0,END)

def button_multiplication():
    first_number = e.get()
    global f_num 
    math = "multiplication"
    f_num = int(first_number)
    e.delete(0,END)

def button_division():
    first_number = e.get()
    global f_num 
    math = "division"
    f_num = int(first_number)
    e.delete(0,END)

# Creates the buttosn for the numbers
button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1))
button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2))
button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3))
button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4))
button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5))
button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6))
button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7))
button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8))
button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9))
button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0))

# Position for the numbers
button_1.grid(row=1, column=0)
button_2.grid(row=1, column=1)
button_3.grid(row=1, column=2)
button_4.grid(row=2, column=0)
button_5.grid(row=2, column=1)
button_6.grid(row=2, column=2)
button_7.grid(row=3, column=0)
button_8.grid(row=3, column=1)
button_9.grid(row=3, column=2)
button_0.grid(row=4, column=0)

# Creates the clear button and assigns its position
button_clear = Button(root, text="Clear", padx=77, pady = 20, command=clear_button)
button_clear.grid(row=4, column=1, columnspan=2)

# Creates the + button and assigns its position
button_plus= Button(root, text="+", padx=39, pady=20, command=button_add)
button_plus.grid(row=5, column=0)

# Creates the - button and assigns its position
button_plus= Button(root, text="-", padx=41, pady=20, command=button_subtraction)
button_plus.grid(row=6, column=0)

# Creates the * button and assigns its position
button_plus= Button(root, text="*", padx=39, pady=20, command=button_multiplication)
button_plus.grid(row=6, column=1)

# Creates the / button adn assigns its position
button_plus= Button(root, text="/", padx=39, pady=20, command=button_division)
button_plus.grid(row=6, column=2)


# Creates the = Button and assigns its position
button_equal = Button(root, text="=", padx=87, pady = 20, command=button_equal)
button_equal.grid(row=5, column=1, columnspan=2)


root.mainloop()

As @John Coleman said, math variables are not accessible for other functions.

You can add global math for each function except the button equal.

So, your full code will be like this;

from tkinter import *


root = Tk()
root.title("Simple Calculator")

e = Entry(root, width=35)
e.insert(0, "")
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

def button_click(number):
    current = e.get()
    e.delete(0, END) 
    e.insert(0, str(current) + str(number)) 
    a = int(str(current) + str(number))



def clear_button():
    e.delete(0, END)


def button_add():
    global math,f_num
    math = "addition"
    first_number = e.get()
    f_num = int(first_number)
    e.delete(0,END)
    

def button_equal():
    second_number = e.get()
    e.delete(0, END)
    if (math == "addition"):
        e.insert(0, f_num + int(second_number))
    elif (math == "subtraction"):
        e.insert(0, f_num - int(second_number))
    elif (math == "multiplication"):
        e.insert(0, f_num * int(second_number))
    elif math == "division":
        e.insert(0, f_num / int(second_number))

def button_subtraction():
    global math,f_num
    first_number = e.get()
    math = "subtraction"
    f_num = int(first_number)
    e.delete(0,END)

def button_multiplication():
    global math,f_num
    first_number = e.get()
    math = "multiplication"
    f_num = int(first_number)
    e.delete(0,END)

def button_division():
    global math,f_num
    first_number = e.get()
    math = "division"
    f_num = int(first_number)
    e.delete(0,END)

# Creates the buttosn for the numbers
button_1 = Button(root, text="1", padx=40, pady=20, command=lambda: button_click(1))
button_2 = Button(root, text="2", padx=40, pady=20, command=lambda: button_click(2))
button_3 = Button(root, text="3", padx=40, pady=20, command=lambda: button_click(3))
button_4 = Button(root, text="4", padx=40, pady=20, command=lambda: button_click(4))
button_5 = Button(root, text="5", padx=40, pady=20, command=lambda: button_click(5))
button_6 = Button(root, text="6", padx=40, pady=20, command=lambda: button_click(6))
button_7 = Button(root, text="7", padx=40, pady=20, command=lambda: button_click(7))
button_8 = Button(root, text="8", padx=40, pady=20, command=lambda: button_click(8))
button_9 = Button(root, text="9", padx=40, pady=20, command=lambda: button_click(9))
button_0 = Button(root, text="0", padx=40, pady=20, command=lambda: button_click(0))

# Position for the numbers
button_1.grid(row=1, column=0)
button_2.grid(row=1, column=1)
button_3.grid(row=1, column=2)
button_4.grid(row=2, column=0)
button_5.grid(row=2, column=1)
button_6.grid(row=2, column=2)
button_7.grid(row=3, column=0)
button_8.grid(row=3, column=1)
button_9.grid(row=3, column=2)
button_0.grid(row=4, column=0)

# Creates the clear button and assigns its position
button_clear = Button(root, text="Clear", padx=77, pady = 20, command=clear_button)
button_clear.grid(row=4, column=1, columnspan=2)

# Creates the + button and assigns its position
button_plus= Button(root, text="+", padx=39, pady=20, command=button_add)
button_plus.grid(row=5, column=0)

# Creates the - button and assigns its position
button_plus= Button(root, text="-", padx=41, pady=20, command=button_subtraction)
button_plus.grid(row=6, column=0)

# Creates the * button and assigns its position
button_plus= Button(root, text="*", padx=39, pady=20, command=button_multiplication)
button_plus.grid(row=6, column=1)

# Creates the / button adn assigns its position
button_plus= Button(root, text="/", padx=39, pady=20, command=button_division)
button_plus.grid(row=6, column=2)


# Creates the = Button and assigns its position
button_equal = Button(root, text="=", padx=87, pady = 20, command=button_equal)
button_equal.grid(row=5, column=1, columnspan=2)


root.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM