Apr-11-2024, 12:13 PM
hello. so im trying to build a calculator app GUI with tkinter and i have the following problem
First to explain how the code works, i concatenate digits to the string representations of each of the variables. the state of a boolean variable is used to decide which of the variables to concatenate the digits to. this boolean is initially set as false and is set to true when the operator is chosen in order to append the selected digits to the second num variable. my code follows
First to explain how the code works, i concatenate digits to the string representations of each of the variables. the state of a boolean variable is used to decide which of the variables to concatenate the digits to. this boolean is initially set as false and is set to true when the operator is chosen in order to append the selected digits to the second num variable. my code follows
from tkinter import *
from tkinter import messagebox
import time
#initialize the values
#uses separated boolean value to decide which number
#gets the digit appended to
first_num="";second_num="";separated=False;operator=""
#use lambda functions to generate mathematical operations
exponents = lambda num1, num2: num1 ** num2
multiplication = lambda num1, num2: num1 * num2
division = lambda num1, num2: num1 / num2
addition = lambda num1, num2: num1 + num2
subtraction = lambda num1, num2: num1 - num2
def concatenate_digit(digit):
'''appends the chosen digit to either the first number
or the second of the operation dependent on global boolean value
also changes the label text to include the updated value of the variables'''
global first_num, second_num
if separated:
second_num += digit
result_lbl.config(text=f"{first_num} {operator} {second_num}")
else:
first_num += digit
result_lbl.config(text=f"{first_num}")
def clear_entry():
'''deletes last digit in the current value '''
global first_num, second_num
if separated:
second_num = second_num[:-1]
else:
first_num = first_num[:-1]
result_lbl.config(text=f"{first_num} {operator} {second_num}")
def clear_everything():
global first_num, second_num, separated, operator
first_num = ""; second_num = ""; separated = False; operator = ""
result_lbl.config(text="")
def equals_func():
global first_num,second_num,operator
num1=float(first_num)
num2=float(second_num)
if operator=="+":
result=addition(num1,num2)
result_lbl.config(text=f"{first_num} {operator} {second_num} = {result}")
elif operator=="-":
result=subtraction(num1,num2)
result_lbl.config(text=f"{first_num} {operator} {second_num} = {result}")
elif operator=="^":
result=exponents(num1,num2)
result_lbl.config(text=f"{first_num} {operator} {second_num} = {result}")
elif operator=="*":
result=multiplication(num1,num2)
result_lbl.config(text=f"{first_num} {operator} {second_num} = {result}")
elif operator=="/":
try:
result=division(num1,num2)
except ZeroDivisionError:
messagebox.showerror(title="OOooops",message="Cannot divide by zero. Try again!!")
clear_everything()
else:
result_lbl.config(text=f"{first_num} {operator} {second_num} = {result}")
if checkbutton.get()==1:
try:
first_num=str(result)
except UnboundLocalError:
messagebox.showerror(title="OOOoooops",message=f"{first_num} is not a compatible value. Restarting")
first_num="";second_num="";operator="";separated=False
else:
second_num=""
separated=True
result_lbl.config(text=f"{first_num}")
else:
first_num=""
second_num=""
operator=""
separated=False
def op_set(op):
global operator,separated
separated=True
operator=op
window=Tk()
window.title("Calculator App")
canvas=Canvas(window,width=600,height=600)
result_lbl=Label(text="Mathematical Operations")
result_lbl.grid(row=0,column=0,columnspan=6)
# Update button commands to use the new concatenate_digit function
Button(text="1", command=lambda: concatenate_digit("1")).grid(row=1,column=0)
two_but = Button(text="2", command=lambda: concatenate_digit("2")).grid(row=1,column=1)
three_but = Button(text="3", command=lambda: concatenate_digit("3")).grid(row=1,column=2)
four_but = Button(text="4", command=lambda: concatenate_digit("4")).grid(row=2,column=0)
five_but = Button(text="5", command=lambda: concatenate_digit("5")).grid(row=2,column=1)
six_but = Button(text="6", command=lambda: concatenate_digit("6")).grid(row=2,column=2)
seven_but = Button(text="7", command=lambda: concatenate_digit("7")).grid(row=3,column=0)
eight_but = Button(text="8", command=lambda: concatenate_digit("8")).grid(row=3,column=1)
nine_but = Button(text="9", command=lambda: concatenate_digit("9")).grid(row=3,column=2)
dot_but = Button(text=".", command=lambda: concatenate_digit(".")).grid(row=4,column=0)
zero_but = Button(text="0", command=lambda: concatenate_digit("0")).grid(row=4,column=1)
Button(text=".",command=lambda: concatenate_digit(".")).grid(row=4,column=0)
backspace_but = Button(text="<|", command=clear_entry).grid(row=4,column=2)
add_but=Button(text="+",command=lambda: op_set("+"))
add_but.grid(row=1,column=3)
sub_but=Button(text="-",command=lambda: op_set("-")).grid(row=2,column=3)
div_but=Button(text="/",command=lambda: op_set("/")).grid(row=3,column=3)
mul_but=Button(text="*",command=lambda: op_set("*")).grid(row=4,column=3)
equals_but=Button(text="=",command=equals_func).grid(row=3,column=4)
exp_but=Button(text="^",command=lambda: op_set("^")).grid(row=2,column=4)
clear_everything_but=Button(text="CE",command=clear_everything).grid(row=4,column=4)
checkbutton=IntVar()
res_check=Checkbutton(window,text="Continue with result",variable=checkbutton,onvalue=1,offvalue=0).grid(row=5,column=1)
window.mainloop()the problem is that if i run the code it works just fine for the first calculation. when i try to concatenate digits to the first num for a second calculation then the program concatenates the digits to the second num variable instead of the first. please help. it has to be a logic bug but i cant find it. as you can see in the code i revert to the boolean variable to the initial False value when the equals function is used. I just dont know where im going wrong with this. please help
