본문 바로가기
Programming/Project

파이썬 tkiter로 간단한 GUI 계산기 만들기

by akter 2022. 3. 9.

안녕하세요. 오늘은 지금까지 배운 파이썬을 사용하거나, 필요한 부분들은 찾아 간단한 GUI 계산기 만들기 프로젝트를 하려고 합니다. 

우선 파이썬에는 다이얼로그를 만들어주는 기본 인터페이스가 존재하는데요. 그 인터페이스 이름은 tkinter입니다. 

from tkinter import *   # tkinter 인터페이스 불러오기 (tkinter는 파이썬이 기본 제공해주는 인터페이스이고, 다이얼로그를 만드는 기능) 
win = Tk()               # tkinter를 window 변수에 담기
win.title("Calculator")  # 다이얼로그 타이틀 정하기

 
 
위와 같이 from tkinter import *로 tkinter 인터페이스를 불러오고 TK()를 win이라는 변수에 담아줍니다.
그리고 win.title로 윈도우창이 켜졌을 때의 타이틀을 정해줍니다. 저는 계산기의 영어인 "Calculator"로 해주었습니다.
 
 
buttons = ['7', '8', '9', '+', 'C',     # buttons 변수에 리스트 형태로 버튼 배치
               '4', '5', '6', '-', ' ',
               '1', '2', '3', '*', ' ',
               '0', '.', '=', '/', ' ']

# for문을 통해 버튼을 생성
i = 0
for b in buttons:   # buttons를 순환하는 순환 변수 b
    cmd = lambda key = b: click(key) 
# lambda함수를 사용하여 순환 함수 b를 변수 key에 전달을 하고, key는 함수 click의 인수가 됨
    btn = Button(win, text = b, width = 5, relief = 'ridge', command = cmd) 
# 순환 변수 b를 text로 받고, relief는 위젯의 테두리
# 스타일을 정하는 것으로 "ridge"는 테두리만 볼록한 것
# 클릭했을 때 실행되는 command에는 cmd를 넣어줌

    btn.grid(row = i // 5 + 1, column = i % 5)  
# 배치관리자 grid를 활용하여 가로가 5칸이기 때문에 column은 i를 5로 나눈 나머지로 해주고,
# 세로도 5칸이지만 맨 첫 번째 줄은 entry로 지정을 해줄 거기 때문에 i를 5+1로 나눈 값으로 해줌
    i += 1
 

그리고 버튼들을 만들어 줄 건데요. buttons라는 변수에 리스트 형태로 계산기 버튼들을 배치해줍니다. 그리고 for 반복문을 통해 buttons 변수를 순환하는 순환 변수 b를 만들어주고,  btn라는 변수를 만들어 순환 변수 b를 text로 받고, relief를 통해 버튼이 "ridge" 테두리만 볼록하게 해줍니다. 그리고 width를 이용해 크기도 정해주고 클릭했을 때 실행되는 command에 cmd를 넣어주었습니다.

cmd는 lambda함수를 이용하여 순환 함수 b를 변수 key에 전달하고, key는 click() 함수의 인수가 되도록 해주었습니다. 

그리고 변수 btn은 배치관리자 gird를 활용하여 가로가 5칸으로 만들 예정이기 때문에 column은 i % 5로 주었고, 세로는 4칸이지만 첫 번째 줄은 클릭된 버튼 값을 받을 entry로 사용할 거기 때문에 row는 i // 5+1로 해주었습니다.

entry = Entry(win, justify = 'right', width = 33, bg = 'yellow')    
# Entry는 한 줄의 텍스트를 사용자로부터 입력받는 필드이며, bg로
# 백그라운드 색상을 "yellow"로 해주고, width로 크기를 설정,
# justify로 오른쪽 정렬

entry.grid(row = 0, column = 0, columnspan = 5) 
# coloumnspan은 열병합을 뜻하는 것으로 Entry 위젯이 5개의 셀을 차지하도록 설정
   

그리고 클릭된 버튼들을 입력 받아 표시해줄 Entry는 entry라는 변수에 우선 담아주고, justify를 통해 오른쪽 정렬을 해주고, width로 크기도 정해주고, bg를 통해 백그라운드 컬러를 'yellow'로 해주었습니다.

그리고 entry.grid를 이용하여 entry는 첫 번째 줄에 가로로 5셀을 사용하여야하기 때문에 row와 coloumn을 둘 다 0으로 주고, 열병합을 뜻하는 coloumnspan을 5로 주어 가로 5개의 셀을 차지하도록 설정해주었습니다.

def click(key):
 if key == '=':  # '=' 버튼이 클릭되면 수식을 계산하여 결과를 표시
        try:
            result = eval(entry.get())      
# eval은 내장함수이며, string type의 data를 계산 가능한 식으로 바꿔 계산하는 함수이며,
# entry.get()을 통해 entry에 입력된 data를 가져오기
            entry.delete(0, END)            # 결과를 표시하기 전에 entry를 지우기
            entry.insert(END, str(result))  # 계산된 결과를 표시
        except:
            entry.insert(END, " ERROR")     # 계산이 되지 않는 식을 입력했을 때 " ERROR" 라는 문구가 뜨게 구현
    elif key == 'C':
        entry.delete(0, END)                # 'C' 버튼이 클릭되면 entry를 지우기
    else:
        entry.insert(END, key)              # 그 외에 다른 버튼이 클릭될 시에는 클릭된 key를 표시

 

그리고 def로 click이라는 함수를 만들어주어 위에 순환 함수 b를 받는 key를 넣어주어서 key를 받게 해줍니다. 그리고 조건문을 활용하여 각 key마다 실행해야 일들을 설정해주었는데요.

우선 if를 활용해'=' 버튼은 eval라는 string type의 data를 계산 가능한 식으로 바꿔 계산하는 함수를 사용하여 entry의 data를 entry.get()으로 받아 result 변수에 넣어줍니다.
그리고 결과를 표시하기 전에 entry창을 초기화 해주기 위해 entry.delete(0, END)를 사용하였고, 계산된 결과를 표시해주기 위해 entry.insert(END, str(result))를 사용해주었습니다.

그리고 except로 예외 처리를 해주었는데요. 계산이 되지 않는 식이 입력되었을 땐 ' ERROR'라는 문구가 뜨도록 entry.insert(END, " ERROR")를 넣어주었습니다.

그리고 다음에는 elif를 통해 entry를 초기화 해주는 버튼인 'C'를 entry.delete(0, END)로 해주었습니다.

그리고 그 외의 버튼들은 클릭되면 표시가 되도록 else를 통해 entry.insert(END, key)를 해주었습니다.

win.mainloop()   # tkinter 프로그래밍할 때 윈도우 화면에서 발생하는 다양한 메세지들을 받고 처리하는 함수

 

마지막으로 tkinter 프로그래밍을 할 때 윈도우 화면에서 발생하는 다양한 메세지들을 받고 처리할 수 있는 함수인 win.mainloop()를 해줌으로써 이번에 파이썬을 활용한 간단한 계산기 만들기 프로젝트를 완료했습니다.

읽어주셔서 감사합니다.

'Programming > Project' 카테고리의 다른 글

Todo list 프로젝트 만들기 #2  (0) 2022.02.23
Todo list 프로젝트 만들기 #1  (0) 2022.02.19

댓글