Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
calculator app problem
#1
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


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
Reply


Messages In This Thread
calculator app problem - by jacksfrustration - Apr-11-2024, 12:13 PM
RE: calculator app problem - by deanhystad - Apr-11-2024, 03:09 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Calculator problem BeginnerCoderPaero 4 3,479 Jun-29-2018, 09:21 AM
Last Post: BeginnerCoderPaero
  Beginner. Calculator problem ¯\_(ツ)_/¯ stykus1992 0 2,436 Feb-15-2018, 11:01 AM
Last Post: stykus1992
  Tip calculator problem Dhaval 1 4,538 Jun-06-2017, 12:49 PM
Last Post: sparkz_alot

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020