GUI 계산기 만들기 과정 기록(Python)

Alal11·2022년 9월 29일
0

목표

윈도우 계산기 디자인을 오마주 하여 Python 계산기 GUI 만들어 보면서 공부하기!


과정

오오..!
창이 생겼다!

코드를 적고 실행시키는 방법은
터미널에 python .\파일명.py 라고 치거나
사진에서 오른쪽 위에 재생 버튼(Run Python File)을 누르면 된다.

실행하기 전에 저장하는 습관 들이자!

창 크기와 제목을 추가했다.

계산기 옆에 깃털 모양 이모지는 못바꾸나?

계산기의 결과창을 만들었다.

justify = 'right'는 결과창의 숫자를 오른쪽에 배치한다.
bg = 'white'는 결과창의 배경 색을 하얀색으로 한다.
fg = 'black'은 결과창 숫자의 글자 색을 검정으로 한다.
ipadx = 80은 결과창의 가로 길이를 80으로 한다.
ipady = 60은 결과창의 세로 길이를 60으로 한다.

계산기 버튼을 만들었다.

리스트를 이용하여 각각 버튼의 위치에 있을 값을 담아줬다.
숫자, 연산자에 따라 버튼 색깔을 다르게 해주고,
숫자, 연산자 위치와 버튼 크기를 설정해주었다.

import tkinter as tk

disValue = 0
operator = {'+':1, '-':2, '÷':3, '×':4, 'C':5, '=':6}
stoValue = 0
opPre = 0

def number_Click(value):                         # 숫자 클릭 정의
    global disValue
    disValue = (disValue*10) + value
    str_value.set(disValue)

def clear():                                      #  Clear 정의
    global disValue, operator, stoValue, opPre
    disValue = 0
    stoValue = 0
    opPre = 0
    str_value.set(disValue)
 

def oprator_Click(value):                          # 연산자 클릭 정의
    global disValue, operator, stoValue, opPre
    op = operator[value]
    if op == 5:          # C
        clear()
    elif disValue == 0:
        opPre = 0
    elif opPre == 0:
        opPre = op
        stoValue = disValue
        disValue = 0
        str_value.set(str(stoValue))
    elif op == 6:         # =
       if opPre == 1:
           disValue = stoValue + disValue
       if opPre == 2:
           disValue = stoValue - disValue
       if opPre == 3:
           disValue = stoValue / disValue
       if opPre == 4:
           disValue = stoValue * disValue

       str_value.set(str(disValue))
       stoValue = 0
       opPre = 0
    else:
        clear()


def Button_Click(value):                              # 버튼 클릭 정의
    try:
        value = int(value)
        number_Click(value)
    except:
        oprator_Click(value)



win = tk.Tk()                      # 창 생성

win.title("계산기")             # 창 제목

# 결과 창 구조
str_value = tk.StringVar()
str_value.set(str(disValue))
dis = tk.Entry(win, textvariable = str_value, justify = 'right', bg = 'whitesmoke', fg = 'black')
dis.grid(column = 0, row = 0, columnspan = 4, ipadx = 90, ipady = 60)

# 버튼 구조
Button_list = [['%','CE','C','Back'],
               ['1/x','x²','²√x','÷'],
               ['7','8','9','×'],
               ['4','5','6','-'],
               ['1','2','3','+'],
               ['+/-','0','.','=']]

for i,items in enumerate(Button_list):
    for k,item in enumerate(items):

        try:
            color = int(item)
            color = 'white'
        except:
            color = 'whitesmoke'

        btn = tk.Button(win,
            text = item,
            width = 10,
            height = 3,
            bg = color,
            fg = 'black',
            command = lambda cmd = item: Button_Click(cmd)
            )
        btn.grid(column = k, row = (i + 1))

win.mainloop()                  # 창 실행

더하기(+), 빼기(-), 나누기(÷), 곱하기(x), 초기화(C), 결과(=)
버튼의 작동까지 만들었다.

<최종 코드>

from contextlib import redirect_stderr
import tkinter as tk
import math

disValue = 0
operator = {'+':1, '-':2, '÷':3, 'x':4, 'C':5, '=':6, '%':7, 'x²':8, '²√x':9, '1/x':10}
stoValue = 0
opPre = 0

### 0~9까지의 숫자를 클릭할 때 정의
def number_Click(value):                         
    global disValue
    disValue = (disValue*10) + value            # 숫자를 클릭할 때마다 10의 자리씩 이동
    str_value.set(disValue)                     # 화면에 숫자를 나타낸다

###  C를 클릭할 때 Clear 정의
def clear():                                      
    global disValue, operator, stoValue, opPre
    disValue = 0                                # 주요 변수 초기화
    stoValue = 0
    opPre = 0
    str_value.set(disValue)                     # 화면을 지운다


 
### 연산자 클릭할 때 정의
def oprator_Click(value):                          
    global disValue, operator, stoValue, opPre

    # value의 값에 따라 숫자로 연산자를 변경한다 (+는 1, -는 2, ...)
    op = operator[value]

    if op == 5:         # C (clear)
        clear()
    
    elif disValue == 0:                         # 현재 화면에 출력된 값이 0일 때
        opPre = 0
                  
    elif opPre == 0:                            # 연산자가 한번도 클릭되지 않았을 때
        opPre = op                              # 현재 눌린 연산자가 있으면 저장
        stoValue = disValue                     # 현재까지의 숫자를 저장
        disValue = 0                            # 연산자 이후의 숫자를 받기 위해 초기화
        str_value.set(str(stoValue))            # 0으로 다음 숫자를 받을 준비
   
    elif op == 6:        # = (결과를 계산하고 출력)
        if opPre == 1:      # +
            disValue = stoValue + disValue
        if opPre == 2:      # -
            disValue = stoValue - disValue
        if opPre == 3:      # /
            disValue = stoValue / disValue
        if opPre == 4:      # x
            disValue = stoValue * disValue
        if opPre == 7:      # % (원래는 퍼센트인데 여기선 나머지로 함)
            disValue = stoValue % disValue

        str_value.set(str(disValue))             # 최종 결과 값을 출력
        stoValue = 0
        opPre = 0
        disValue = 0
            

    elif opPre == 8 or opPre == 9 or opPre == 10:
        if opPre == 8:      # x²
            disValue = stoValue ** 2
        if opPre == 9:      # ²√x
            disValue = stoValue ** 0.5
        if opPre == 10:     # 1/x
            disValue = 1 / stoValue

        str_value.set(disValue)
        stoValue = 0
        disValue = 0
        opPre = 0


    else:
        clear()


### 버튼 클릭 정의
def Button_Click(value):                              
    try:
        value = int(value)                  # 정수로 변환
        number_Click(value)                 # 정수인 경우 number_Click()를 호출
    except:
        oprator_Click(value)                # 정수가 아닌 연산자인 경우 oprator_Click() 호출



win = tk.Tk()                      # 창 생성

win.title("계산기")                # 창 제목

### 결과 창 구조
str_value = tk.StringVar()
str_value.set(str(disValue))
dis = tk.Entry(win, textvariable = str_value, justify = 'right', bg = 'whitesmoke', fg = 'black')
dis.grid(column = 0, row = 0, columnspan = 4, ipadx = 90, ipady = 60)

### 버튼 구조
Button_list = [['%','CE','C','Back'],
               ['1/x','x²','²√x','÷'],
               ['7','8','9','x'],
               ['4','5','6','-'],
               ['1','2','3','+'],
               ['+/-','0','.','=']]

for i,items in enumerate(Button_list):
    for k,item in enumerate(items):

        try:
            color = int(item)
            color = 'white'
        except:
            color = 'whitesmoke'

        btn = tk.Button(win,
            text = item,
            width = 10,
            height = 3,
            bg = color,
            fg = 'black',
            command = lambda cmd = item: Button_Click(cmd)
            )
        btn.grid(column = k, row = (i + 1))

win.mainloop()                    # 창 실행

나머지(%) 기능 추가했다.

x², ²√x, 1/x 기능은 시도해봤지만 오작동


최종 결과

  • +, -, x, ÷, %(나머지), C, = 기능은 정상 작동함

  • x², ²√x, 1/x 기능은 오작동

    ex) 8→ x²→ 8→ x² 이렇게 두 번 클릭해야 값이 나옴

  • CE, Back, +/-, . 기능은 구현 못함


➡️후기

파이썬 시작을 이 계산기 프로젝트로 해서 그런지 많이 어려웠다ㅠ_ㅠ

이 프로젝트의 목표를 내가 직접 만들기 보다는 공부하는 목적으로 다른 분들의 설명과 코드를 참고하며 이해하는 데에 초점을 맞췄기 때문에 어느정도 목표는 달성한 것이 아닐까..ㅋㅋㅋ

아래 링크는 파이썬 GUI 계산기 만들기 출처!
https://www.youtube.com/watch?v=rqif36EDSOI

위 링크랑 윈도우 계산기 기능이랑 다른 부분이 조금 있어서 내가 할 수 있는 선에서 바꾸어 보며 공부가 많이 되었다.

나중에라도 다시 이 프로젝트를 이어서 할 때를 위해 적어두는 수정할 점!!!

  1. x², ²√x, 1/x 기능 수정하기
  2. CE, Back, +/-, . 기능 구현하기
  3. 버튼의 글자 크기와 폰트 수정하기
  4. 버튼의 모양 바꾸기
  5. 창 크기에 따라 위젯의 크기도 자동 조절하기

+) 6. 함수말고 class, self로 만들어보기..ㅎㅎ;; (이게 더 쉽다고 함)
등등...!

0개의 댓글