본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
Python

[python GUI] Tkinter_간단한 계산 프로그램 만들기!

by Hazard3_o00sung 2021. 2. 1.
728x90

강력한 스크립트 언어 파이썬 입니다!

Easy GUI on Python'

  파이썬은 아주 다양한 모듈들이 많은 프로그램이라는 점은 모두 알고 계실 거라 생각합니다. 그중에서 간편하면서도, 쉽게 구현할 수 있는 그래픽 유저 인터페이스 모듈인 tkinter에 대해서 알아보도록 하겠습니다!!

 

tkinter모듈은 그래픽 유저 인터페이스툴킷에 대한 표준 파이썬 인터페이스입니다. 대부분 유닉스 플랫폼, 윈도, 맥, 리눅스 등 대부분의 시스템은 지원하기 때문에 거의 다 사용할 수 있다고 보아도 무방합니다. 우선 tkinter가 잘 있는지 확인해보도록 하겠습니다.

 

#윈도우 시스템
#커맨드 쉘창 연 후 아래 명령줄 입력 후 확인

#맥-리눅스
#터미널 실행 후 아래 명령줄 입력 후 확인
$ python -m tkinter

 

자 설치가 되어 있는 것을 확인하셨을 겁니다. tk안에도 무수히 많은 서브 클래스와 함수들이 존재합니다. 솔직히 처음 공부하면서 모듈 내부에 선언된 인터페이스를 모두 알 필요는 없습니다. 필요할 때마다 찾아서 프로그래밍하면 되니까요! 아래 링크 첨부해드릴 테니, 천천히 읽어보시기 바랍니다!!

 

TkDocs Home

 

TkDocs Home

Tk is the only cross-platform (Windows, Mac, Unix) graphical user interface toolkit designed exclusively for high-level dynamic languages, like Python, Tcl, Ruby, Perl, and many others. Whatever language you use, this site brings you the current, high-qual

tkdocs.com

 

저희는 빠르게 계산기 프로그램을 만들 생각입니다. 대부분 그래픽 모듈 입문 때 학습할 수 있는 수준이기 때문에 어렵지 않습니다. 파이썬의 클래스를 활용해서 만들었습니다. 코드를 보고 쭉 따라하시면 됩니다. 설명을 주석으로 대체할 예정이기 때문에 한 줄 한 줄 입력하면서 코드를 작성하면 되겠습니다!!

 

from tkinter import *
import tkinter.font as font
import tkinter as tk

class App: #전체적인 윈도우를 관리하는 클래스 
    def __init__(self):
        self.root = Tk() #tkinter 내부의 Tk를 끌고와서 윈도우 속성값 설정

        self.root.geometry("380x400") #사이즈는 원하시는 만큼..
        self.root.title("Example Calculator") #생성될 프로그램의 제목

        self.root.resizable(0,0) #리사이즈를 막습니다.
        
        self.result = StringVar() #문자열 형태의 섹션으로 결괏값 및 입력값 출력에 사용
        self.font = font.Font(size = 15)

        self.screen = Entry(self.root, text = self.result, width = 30,
                            justify = 'right', font=(10), bd = 4) #전체적인 화면을 초기화
        self.setScreen() #클래스 내부 멤버함수를 사용해서 self.screen 초기화
        self.keyPad = [['Cal', u"\u221A", "/", "<-"],
                        ["7", "8", "9", "*"],
                        ["4", "5", "6", "-"],
                        ["1", "2", "3", "+"],
                        ["!", 0, ".", "="]] #버튼에 들어갈 문자열 값

        self.button = {} #button을 담을 딕셔너리 변수

        self.resultValue = 0 #사용자에게 반환될 결괏값
        self.setGraphic() #멤버함수
    
    def show(self):
        self.root.mainloop() #Tk를 실행하는 멤버함수

    def setScreen(self):
        self.screen.grid(row = 0, columnspan = 4, padx = 15,
                        pady = 15, ipady= 15)
    
    def cal(self, event):
        btn = event.widget.cget("text")
        try: #아래 제어문들은 버튼에 해당하는 값들에 상응하는 연산 수행을 진행할 영역
            if btn == u"\u221A":
                ret = float(int.get()) ** (0.5)
                self.resultValue = str(ans)
                self.result.set(str(ans))
            elif btn == "c":
                self.result.set("")
            elif btn == "!":
                def fact(n): return n if n < 2 else n * fact(n-1)
                self.result.set(str(fact(int(self.result.get()))))

            elif btn == "<-":
                self.result.set(self.result.get()[:len(self.result.get()) - 1])

            elif btn == "=":
                self.resultValue = str(eval(self.result.get()))
                self.result.set(self.resultValue)

            else:
                self.result.set(self.result.get() + str(btn))
        except:
            self.result.set("계산할 수 없는 형식입니다")

    def setGraphic(self): #버튼 생성 코드 영역
        for _ in range(len(self.keyPad)):
            for _2 in range(len(self.keyPad[_])):
            #2차원 배열로 선언되었기 때문에 각 행열값에 해당하는 버튼 생성
                self.button["btn_"+str(self.keyPad[_][_2])] = Button(self.root, bd = 1, text = str(self.keyPad[_][_2]), font = self.font)

                self.button["btn_" + str(self.keyPad[_][_2])].grid(
                    row=_+1, column=_2, padx =5, pady=5, ipadx=5, ipady=5
                )

                self.button["btn_" + str(self.keyPad[_][_2])].bind("<Button-1>", self.cal)

if __name__== "__main__":
    app = App()
    app.show()

이 정도로 짧게만 작성해보았습니다. 대부분의 입문 프로그램은 위와 같이 작성되며, 이항연산이라는 간단한 계산만 수행하기 때문에 코드의 양이 크진 않습니다. 

 

이해가 잘 안가는 부분이 있다면, 댓글 남겨주시면 친절하게 설명드리도록 하겠습니다!! 

 

감사합니다!! 

728x90

댓글