본문 바로가기

공부 일지 #12 | tkinter로 계산기 만들기

@studying:)2025. 7. 30. 16:53

학습 날짜: 2025.07.29


Tkinter를 사용하여 창을 띄우고, Label, Button, Entry 위젯을 연습해본 뒤, 지금까지 배운 내용을 종합하여 계산기를 만들어보는 실습을 진행했다.

 

1. 같이 만들어본 계산기

수업 시간에 만든 코드는 아래와 같다.
다만, 해당 코드에서 isEmpty 변수의 활용과 결과값을 화면에 출력하는 fn_result 함수는 스스로 구현하지 못해, 강사님께서 보여주신 예시 코드를 참고하여 완성했다.

코드

from tkinter import *

select_operator = -1

def fn_add():
    global select_operator
    select_operator = 0

def fn_minus():
    global select_operator
    select_operator = 1

def fn_mul():
    global select_operator
    select_operator = 2

def fn_div():
    global select_operator
    select_operator = 3

def fn_result():
    global select_operator

    x = edt_input_x.get()
    y = edt_input_y.get()

    isEmpty = 0
    if (x == "") or (y == ""):
        isEmpty = 0
    else:
        isEmpty = 1

    result_value = 0
    result_operator = ""
    if (select_operator >= 0) and isEmpty:
        x = float(x)
        y = float(y)

        if select_operator == 0:
            result_value = x+y
            result_operator = "+"
        elif select_operator == 1:
            result_value = x-y
            result_operator = "-"
        elif select_operator == 2:
            result_value = x*y
            result_operator = "*"
        elif select_operator == 3:
            result_value = x/y
            result_operator = "/"
        else:
            label_out.config(text=f"사칙연산 과정에서 오류가 발생했습니다.") #config() text 속성을 변경할 수 있도록 해주는 함수

        label_out.config(text=f"연산'{result_operator}' 결과는 {result_value} 입니다")
    else:
        label_out.config(text=f"입력값 설정을 확인하세요!!!", fg="red")

    #입력값과 연산선택의 초기화
    edt_input_x.delete(0, END)
    edt_input_y.delete(0, END)
    select_operator = -1

wnd = Tk()
wnd.geometry("450x300")
wnd.title("My Calculator")
wnd.config(padx=50, pady=30)

# input x, y
label_input_x= Label(wnd, text="input X: ")
edt_input_x = Entry(wnd, width=10)
label_input_x.grid(column=0, row=0)
edt_input_x.grid(column=1, row=0, columnspan=2)

label_input_y= Label(wnd, text="input Y: ")
edt_input_y = Entry(wnd, width=10)
label_input_y.grid(column=4, row=0)
edt_input_y.grid(column=5, row=0, columnspan=2)

# select operator
label_operator= Label(wnd, text="Operator ", pady=30)
label_operator.grid(column=0, row=1)

bt_add = Button(wnd, text="+", width=5, height=2, command=fn_add)
bt_add.grid(column=1, row=1, padx=5)

bt_minus = Button(wnd, text="-", width=5, height=2, command=fn_minus)
bt_minus.grid(column=2, row=1, padx=5)

bt_mul = Button(wnd, text="*", width=5, height=2, command=fn_mul)
bt_mul.grid(column=3, row=1, padx=5)

bt_div = Button(wnd, text="/", width=5, height=2, command=fn_div)
bt_div.grid(column=4, row=1, padx=5)

# calculate
label_exe = Label(wnd, text="Calculate", pady=15)
label_exe.grid(column=0, row=2)
bt_exe = Button(wnd, text="Calculate", width=12, height = 2, command=fn_result)
bt_exe.grid(column=2, row=2, columnspan=2)

# Result
label_out_name = Label(wnd, text="Output", pady=15)
label_out = Label(wnd, text="", pady=15)
label_out_name.grid(column=0, row=3)
label_out.grid(column=1, row=3, columnspan=3)

wnd.mainloop()

 

실행 화면

 

2. 새롭게 구현한 계산기 (복습 & 응용)

수업 내용을 복습하면서 화면 구성을 조금 변경해 보았고, 배운 내용을 바탕으로 새롭게 계산기를 구현해 보았다.

새로운 계산기는 이전 코드와 달리, 연산자 버튼을 누르면 결과가 바로 출력되도록 개선하였다.

 

코드

from tkinter import *

select_operator = 0
isEmpty = 0

def fn_emptyCheck():
    global isEmpty

    x = edt_input_x.get()
    y = edt_input_y.get()

    if (x == "") or (y == ""):
        isEmpty = 0
    else:
        isEmpty = 1
        x = float(x)
        y = float(y)
    return x, y

def fn_add():
    x, y = fn_emptyCheck()
    r_operator = "+"
    result = x + y
    fn_result(x, y, r_operator, result)

def fn_minus():
    x, y = fn_emptyCheck()
    r_operator = "-"
    result = x - y
    fn_result(x, y, r_operator, result)

def fn_mul():
    x, y = fn_emptyCheck()
    r_operator = "*"
    result = x * y
    fn_result(x, y, r_operator, result)

def fn_div():
    x, y = fn_emptyCheck()
    r_operator = "/"
    result = x / y
    fn_result(x, y, r_operator, result)

def fn_result(x, y, oper, result):
    if isEmpty:
        label_out.config(text=f"{x} {oper} {y} = {result}")
    else:
        label_out.config(text=f"입력값 설정을 확인하세요!!!", fg="red")


wnd = Tk()
wnd.geometry("450x300")
wnd.title("My Calculator")
wnd.config(padx=50, pady=30)

# input x, y
label_input_x= Label(wnd, text="input X: ")
edt_input_x = Entry(wnd, width=10)
label_input_x.grid(column=0, row=0)
edt_input_x.grid(column=1, row=0, columnspan=2)

label_input_y= Label(wnd, text="input Y: ")
edt_input_y = Entry(wnd, width=10)
label_input_y.grid(column=4, row=0)
edt_input_y.grid(column=5, row=0, columnspan=2)

# select operator
label_operator= Label(wnd, text="Operator ", pady=30)
label_operator.grid(column=0, row=1)

bt_add = Button(wnd, text="+", width=5, height=2, command=fn_add)
bt_add.grid(column=1, row=1, padx=5)

bt_minus = Button(wnd, text="-", width=5, height=2, command=fn_minus)
bt_minus.grid(column=2, row=1, padx=5)

bt_mul = Button(wnd, text="*", width=5, height=2, command=fn_mul)
bt_mul.grid(column=3, row=1, padx=5)

bt_div = Button(wnd, text="/", width=5, height=2, command=fn_div)
bt_div.grid(column=4, row=1, padx=5)

# Result
label_out_name = Label(wnd, text="Output", pady=15)
label_out = Label(wnd, text="", pady=15)
label_out_name.grid(column=0, row=3)
label_out.grid(column=1, row=3, columnspan=3)

wnd.mainloop()

 

실행 화면

studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차