플그래밍/파이써언

[파이썬] 간단한 계산기 (+, -, *, /)

훗티v 2023. 2. 10. 16:55
반응형

📱 [파이썬] 간단한 계산기 (+, -, *, /)

 

ChatGPT를 참고하여 만든 Tkinter 계산기 입니다.

 

▫️ 덧셈, 뺄셈, 곱셈, 나눗셈
▫️ 입력 값 표시 줄

 

실행화면

 

 

입력 및 결과값

 

 

입력 값 오류

 

 

📦 파이썬 코드

import tkinter as tk

먼저 Python에서 GUI를 생성기능을 제공하는 tkinter 모듈을 가져옵니다.

 

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("계산기")

다음으로 계산기의 로직이 포함된 Calculator 클래스를 정의합니다. 

__init__ 메서드에서 계산기의 부모 창인 마스터를 매개변수로 전달합니다. 

창 제목은 "계산기"로 설정합니다.

 

        self.total = tk.DoubleVar()
        self.total.set(0)

        self.entered_number = tk.StringVar()
        self.entered_number.set("")

계산된 결과 값과 입력 값을(숫자) 각각 저장하기 위한 두 개의 tkinter 변수, self.totalself.entered_number를 생성합니다.

self.total은 0으로, self.entered_number는 빈 문자열로 초기화합니다.

 

        self.total_label = tk.Label(master, textvariable=self.total)
        self.total_label.grid(row=0, column=0, columnspan=4, padx=10, pady=10, ipadx=10, ipady=10)

        self.entry = tk.Entry(master, textvariable=self.entered_number)
        self.entry.grid(row=1, column=0, columnspan=4, padx=10, pady=10, ipadx=10, ipady=10)

위에 코드는 계산된 값과 입력 값을 각각 표시하는 tkinter 레이블과 입력 위젯을 생성합니다. 

텍스트 변수 옵션은 각각 self.total 및 self.entered_number로 설정되어 해당 값을 표시합니다.

마지막 줄에 그리드 메서드는 상위 창에서 위젯의 위치를 지정하는 데 사용됩니다.

 

    def create_buttons(self):
        tk.Button(self.master, text="1", command=lambda: self.button_click(1)).grid(row=2, column=0)
        tk.Button(self.master, text="2", command=lambda: self.button_click(2)).grid(row=2, column=1)
        tk.Button(self.master, text="3", command=lambda: self.button_click(3)).grid(row=2, column=2)
        tk.Button(self.master, text="+", command=lambda: self.button_click("+")).grid(row=2, column=3)
        tk.Button(self.master, text="4", command=lambda: self.button_click(4)).grid(row=3, column=0)
        tk.Button(self.master, text="5", command=lambda: self.button_click(5)).grid(row=3, column=1)
        tk.Button(self.master, text="6", command=lambda: self.button_click(6)).grid(row=3, column=2)
        tk.Button(self.master, text="-", command=lambda: self.button_click("-")).grid(row=3, column=3)
        tk.Button(self.master, text="7", command=lambda: self.button_click(7)).grid(row=4, column=0)
        tk.Button(self.master, text="8", command=lambda: self.button_click(8)).grid(row=4, column=1)
        tk.Button(self.master, text="9", command=lambda: self.button_click(9)).grid(row=4, column=2)
        tk.Button(self.master, text="*", command=lambda: self.button_click("*")).grid(row=4, column=3)
        tk.Button(self.master, text="C", command=lambda: self.button_clear()).grid(row=5, column=0)
        tk.Button(self.master, text="0", command=lambda: self.button_click(0)).grid(row=5, column=1)
        tk.Button(self.master, text="=", command=lambda: self.button_equal()).grid(row=5, column=2)
        tk.Button(self.master, text="/", command=lambda: self.button_click("/")).grid(row=5, column=3)

create_buttons 메서드는 계산기용 버튼을 생성합니다. 

각 버튼에 대해 텍스트 레이블과 버튼을 클릭할 때 호출할 함수를 지정하는 명령 옵션을 전달합니다.

 

    def button_click(self, number):
        current = self.entered_number.get()
        self.entered_number.set(current + str(number))

    def button_clear(self):
        self.entered_number.set("")

button_click 메서드는 입력된 숫자 값을 받아 self.entered_number의 현재 값에 더합니다. 

button_clear 메서드는 self.entered_number의 값을 빈 문자열로 설정하여 입력값을 지워줍니다.

 

    def button_equal(self):
        current = self.entered_number.get()
        self.entered_number.set("")

        try:
            self.total.set(eval(current))
        except:
            self.total.set("Error")

button_equal 메서드는 eval 함수를 사용하여 self.entered_number의 현재 값을 확인하고 그 결과를 self.total의 값으로 설정합니다.

식에서 오류가 확인될 경우 이 함수는 self.total 값을 "Error"로 설정합니다.

 

if __name__ == "__main__":
    root = tk.Tk()
    my_gui = Calculator(root)
    root.mainloop()

이 코드는 계산기 클래스의 인스턴스를 생성하고 루트 창을 부모로 전달한 다음 root.mainloop()를 사용하여 메인 이벤트 루프를 시작합니다.

 

 

📦 파이썬 코드(전체)

import tkinter as tk

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("계산기")

        self.total = tk.DoubleVar()
        self.total.set(0)

        self.entered_number = tk.StringVar()
        self.entered_number.set("")

        self.total_label = tk.Label(master, textvariable=self.total)
        self.total_label.grid(row=0, column=0, columnspan=4, padx=10, pady=10, ipadx=10, ipady=10)

        self.entry = tk.Entry(master, textvariable=self.entered_number)
        self.entry.grid(row=1, column=0, columnspan=4, padx=10, pady=10, ipadx=10, ipady=10)

        self.create_buttons()

    def create_buttons(self):
        tk.Button(self.master, text="1", command=lambda: self.button_click(1), width=2, height=1).grid(row=2, column=0)
        tk.Button(self.master, text="2", command=lambda: self.button_click(2), width=2, height=1).grid(row=2, column=1)
        tk.Button(self.master, text="3", command=lambda: self.button_click(3), width=2, height=1).grid(row=2, column=2)
        tk.Button(self.master, text="+", command=lambda: self.button_click("+"), width=2, height=1).grid(row=2, column=3)
        tk.Button(self.master, text="4", command=lambda: self.button_click(4), width=2, height=1).grid(row=3, column=0)
        tk.Button(self.master, text="5", command=lambda: self.button_click(5), width=2, height=1).grid(row=3, column=1)
        tk.Button(self.master, text="6", command=lambda: self.button_click(6), width=2, height=1).grid(row=3, column=2)
        tk.Button(self.master, text="-", command=lambda: self.button_click("-"), width=2, height=1).grid(row=3, column=3)
        tk.Button(self.master, text="7", command=lambda: self.button_click(7), width=2, height=1).grid(row=4, column=0)
        tk.Button(self.master, text="8", command=lambda: self.button_click(8), width=2, height=1).grid(row=4, column=1)
        tk.Button(self.master, text="9", command=lambda: self.button_click(9), width=2, height=1).grid(row=4, column=2)
        tk.Button(self.master, text="*", command=lambda: self.button_click("*"), width=2, height=1).grid(row=4, column=3)
        tk.Button(self.master, text="C", command=lambda: self.button_clear(), width=2, height=1).grid(row=5, column=0)
        tk.Button(self.master, text="0", command=lambda: self.button_click(0), width=2, height=1).grid(row=5, column=1)
        tk.Button(self.master, text="=", command=lambda: self.button_equal(), width=2, height=1).grid(row=5, column=2)
        tk.Button(self.master, text="/", command=lambda: self.button_click("/"), width=2, height=1).grid(row=5, column=3)

    def button_click(self, number):
        self.entered_number.set(self.entered_number.get() + str(number))

    def button_clear(self):
        self.entered_number.set("")
        self.total.set(0)

    def button_equal(self):
        try:
            self.total.set(eval(self.entered_number.get()))
        except:
            self.total.set("error")

root = tk.Tk()
root.geometry("185x240")
calc = Calculator(root)
root.mainloop()

 

 

 

 

 

 

반응형