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