Actually I'm working on a project named "Calculator" in tkinter, so i decided to make three buttons which says:
- Basic Calculator
- Unit Converter
- Financial Converter
So first i made the logic of unit converter and i made it and merged it successfully with the main code without getting a error. But In case of basic calculator, it shows error, actually it's working fine when i run it independently but when i try to merge it with the main code it shows error, so please help me to solve this bug.
Basic calculator program
from tkinter import *
calculator = Tk()
calculator.geometry("436x382")
calculator.resizable(0, 0)
calculator.title("Calculator")
# continuously updates the input field whenever you enter a number
def btn_click(item):
global expression
expression = expression str(item)
input_text.set(expression)
def bt_clear():
global expression
expression = ""
input_text.set("")
def bt_equal():
global expression
result = str(eval(expression)) # 'eval':This function is used to evaluates the string expression directly
input_text.set(result)
expression = ""
expression = ""
# 'StringVar()' :It is used to get the instance of input field
input_text = StringVar()
input_frame = Frame(calculator, width=312, height=50, bd=0, highlightbackground="black", highlightcolor="black", highlightthickness=2)
input_frame.pack(side=TOP)
input_field = Entry(input_frame, font=('arial', 18, 'bold'), textvariable=input_text, width=50, bg="#055", bd=0, justify=RIGHT)
input_field.grid(row=0, column=0)
input_field.pack(ipady=10) # 'ipady' is internal padding to increase the height of input field
btns_frame = Frame(calculator, width=312, height=272.5, bg="grey")
btns_frame.pack()
clear = Button(btns_frame, text = "AC", fg = "black", width = 32, height = 3, bd = 0, padx=30, bg = "#eee", cursor = "hand2", command = lambda: bt_clear()).grid(row = 0, column = 0, columnspan = 3, padx = 1, pady = 1)
divide = Button(btns_frame, text = "/", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: btn_click("/")).grid(row = 0, column = 3, padx = 1, pady = 1)
seven = Button(btns_frame, text = "7", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(7)).grid(row = 1, column = 0, padx = 1, pady = 1)
eight = Button(btns_frame, text = "8", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(8)).grid(row = 1, column = 1, padx = 1, pady = 1)
nine = Button(btns_frame, text = "9", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(9)).grid(row = 1, column = 2, padx = 1, pady = 1)
multiply = Button(btns_frame, text = "*", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: btn_click("*")).grid(row = 1, column = 3, padx = 1, pady = 1)
four = Button(btns_frame, text = "4", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(4)).grid(row = 2, column = 0, padx = 1, pady = 1)
five = Button(btns_frame, text = "5", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(5)).grid(row = 2, column = 1, padx = 1, pady = 1)
six = Button(btns_frame, text = "6", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(6)).grid(row = 2, column = 2, padx = 1, pady = 1)
minus = Button(btns_frame, text = "-", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: btn_click("-")).grid(row = 2, column = 3, padx = 1, pady = 1)
one = Button(btns_frame, text = "1", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(1)).grid(row = 3, column = 0, padx = 1, pady = 1)
two = Button(btns_frame, text = "2", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(2)).grid(row = 3, column = 1, padx = 1, pady = 1)
three = Button(btns_frame, text = "3", fg = "black", width = 10, height = 3, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(3)).grid(row = 3, column = 2, padx = 1, pady = 1)
plus = Button(btns_frame, text = " ", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: btn_click(" ")).grid(row = 3, column = 3, padx = 1, pady = 1)
zero = Button(btns_frame, text = "0", fg = "black", width = 21, height = 3, padx=20, bd = 0, bg = "#fff", cursor = "hand2", command = lambda: btn_click(0)).grid(row = 4, column = 0, columnspan = 2, padx = 1, pady = 1)
point = Button(btns_frame, text = ".", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: btn_click(".")).grid(row = 4, column = 2, padx = 1, pady = 1)
equals = Button(btns_frame, text = "=", fg = "black", width = 10, height = 3, bd = 0, bg = "#eee", cursor = "hand2", command = lambda: bt_equal()).grid(row = 4, column = 3, padx = 1, pady = 1)
calculator.mainloop()
main program link github link code.py is the main program
Error i got when i merge basic calculator program with main code Error message
CodePudding user response:
From the post I understand that your problem is that you get a name error when you click on a number in the calculator. (Please correct me if I'm wrong)
I looked through your code, and actually all you need to do is to copy the expression = ""
and define it at the start of your code.
After that, no error will appear.
Hope it helps! Next time, do remember to only give the minimal reproducible example.
CodePudding user response:
Since you have put the posted code inside a function (basiccalculator()
) in your real code, then expression
is a local variable inside that function. So there is no global variable expression
at all.
When you want to use expression
inside the nested functions, it cannot find expression
as it is declared as global.
Change global expression
to nonlocal expression
inside those nested functions will fix the issue:
def basiccalculator():
calculator = Tk()
calculator.geometry("436x382")
calculator.resizable(0, 0)
calculator.title("Calculator")
expression = ""
# continuously updates the input field whenever you enter a number
def btn_click(item):
nonlocal expression # use nonlocal instead of global
expression = expression str(item)
input_text.set(expression)
def bt_clear():
nonlocal expression
expression = ""
input_text.set("")
def bt_equal():
nonlocal expression
result = str(eval(expression)) # 'eval':This function is used to evaluates the string expression directly
input_text.set(result)
expression = ""
...
Refer the Python document on global
and nonlocal
for details.