Home > Software engineering >  How can i merge my one python tkinter program with another one, i got error while doing so
How can i merge my one python tkinter program with another one, i got error while doing so

Time:12-02

Actually I'm working on a project named "Calculator" in tkinter, so i decided to make three buttons which says:

  1. Basic Calculator
  2. Unit Converter
  3. 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.

  • Related