본문 바로가기
DEV/파이썬 이론

파이썬 코딩 :: 파이썬 tkinter, GUI 실습_계산기 만들기

by 올커 2022. 8. 9.

파이썬 Tkinter, GUI 실습, 계산기 만들기


서문

Python Tkinter(Tk interface)를 활용해서 기본적인 GUI(Graphic User Interface)를 생성해본다

*tk라이브러리는 Window, Unix, Mac에서 지원

 

1. Python GUI 기본 구조

 1) 우선 새로운 파이썬 모듈을 생성한다.

 2) Python에 내장되어 있는 Tkinter 모듈을 임포트하고 코드 단순화를 위해 별칭을 지정(as tk)

import tkinter as tk

 3) 생성자를 호출해 win변수(window 약자)에 Tk 클래스의 인스턴스를 생성한다. 

win = tk.Tk()

 4) 클래스의 인스턴스 변수(win)를 사용하여 title 속성을 통해 GUI 윈도우 제목을 지정한다

win.title("계산기")

 5) 윈도우 메인 순환문을 시작한다.

win.mainloop()

 

2. Tkinter GUI 기본 함수

#레이블
label = tk.Label(window, text='계산기 입니다.')
label.pack() #label.grid()

#버튼
button = tk.Button(window, text='버튼')
button.pack()

#입력창
input = tk.Entry(window, width=10)
input.pack()

#콤보박스
from tkinter import ttk
combo = ttk.Combobox(window, width=30, state='readonly')
combo.pack()

#멀티입력창
from tkinter import scrolledtext
edit = scrolledtext.ScrolledText(window, width=30, height=5, wrap=tk.WORD)
edit.pack()

3. 계산기 GUI 구성하기

 1) Tkinter import

import tkinter as tk

 2) 사용할 변수 정의

disValue = 0       #입력된 값
operator ={'+':1, '-':2, '/':3, '*':4, 'C':5, '=':6}         #딕셔너리를 통해 각 명령어를 정수로 치환하여 구분
stoValue= 0        #저장된 값
opPre = 0          #이전 명령어 확인

 3) 사용할 함수 정의

  ① 숫자 버튼 클릭

def number_click(value):
    # print('숫자', value)
    global disValue            #global : 전역변수 사용
    disValue = (disValue*10) + value        #버튼을 누를때마다 기존입력된 숫자는 10의 배수로 추가
    str_value.set(disValue)        #set 명령어를 통해 Edit창에 값 자동으로 업데이트

  ② C(Clear) 버튼 클릭

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

  ③ 연산 명령(=, +, -, *, /) 버튼 클릭

def operator_click(value):
    #print('명령', value)
    global disValue, operator, stoValue, opPre
    op = operator[value]         #입력된 명령어가 op에 operator의 value(1, 2, 3, 4, 5, 6)로 들어옴

    if op == 5:                  #C(Clear)를 눌렀을 경우
        clear()
    elif disValue == 0:          #아무것도 눌리지 않은 경우
        opPre = 0                #이전의 명령을 0으로 초기화
    elif opPre == 0:             #이전의 명령이 없고, 명령이 새로 눌렸을 경우
        opPre = op               # 이전 명령어 opPre에 op값 백업
        stoValue = disValue      #현재 값을 저장하고
        disValue = 0             #화면의 값을 0으로 초기화하고
        str_value.set(disValue)  #출력
    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(disValue)
        disValue = 0             #출력 후 변수 초기화
        stoValue = 0             #저장된 값 초기화
        opPre = 0                # 이전의 명령을 0으로 초기화
    else:
        clear()

  ④ 버튼 클릭시 계산 함수 선언

#버튼 클릭시 계산 함수 선언
def button_click(value):
    print(value)
    try:
        value = int(value)
        number_click(value)
    except:
        operator_click(value)

  ⑤ 인스턴스 선언, GUI Title 정의

win = tk.Tk()
win.title('계산기')

  ⑥ Edit 창 만들기

#Edit 창
disValue =0    #초기화
str_value = tk.StringVar()    #결과 변수
str_value.set(str(disValue))      #set 명령어를 통해 Edit창에 값 자동으로 업데이트

dis = tk.Entry(win, textvariable=str_value, justify='right')
dis.grid(column=0, row=0, columnspan = 4, ipadx=80, ipady=30)     #ipdax : x축방향 길이, ipday : y축방향 길이

  ⑦ 버튼 생성하기

#버튼 생성
calItem = [['1', '2', '3', '+'],
           ['4', '5', '6', '-'],
           ['7', '8', '9', '*'],
           ['0', '=', 'C', '/']]

for i, items in enumerate(calItem):     #enumerate : 인덱스를 가져올 때 사용,  i는 인덱스, items는 각 리스트 추출
    for k, item in enumerate(items):      #k는 인덱스, item은 각 문자 추출

        #숫자와 숫자가 아닌 버튼의 색 구분하기
        try:
            color = int(item)
            color = 'grey'
        except:
            color = 'blue'

        #각 개별 버튼 크기, 색깔, 폰트
        bt = tk.Button(win,
                       text=item,
                       width = 10,
                       height = 5,
                       bg = color,      #bg = background 색깔
                       fg = 'white',       #fg = font 색깔
                       command = lambda cmd=item: button_click(cmd)     #command = 함수 사용, cmd라는 변수는 item에서 받아오고
                       )                                                #button_click이라는 함수에 cmd를 변수로 넣는다
        bt.grid(column=k, row=(i+1))      #row는 Edit창이 0을 사용하고 있으므로 1부터 -> i+1
        
        
 # 다른 버튼 생성 방법
#tk.Button(win, text='1', width=10, height=5).grid(column=0,row=1)

  ⑧ 윈도우 메인 순환문 시작

win.mainloop()

  ※ 완성된 계산기 모습

※ 첨부1. 계산기 최종 File

calculator_prac01.py
0.00MB

반응형

댓글