파이썬 실전 프로젝트

계산기 만들기 - 파이썬 tkinter 모듈

토픽 파이썬 실전 프로젝트

파이썬의 tkinter 모듈은 각종 그래픽 인터페이스를 만들어주는 모듈입니다.

tkinter 모듈을 이용하면, 간단한 계산기 프로그램을 만들수 있습니다.

 

import tkinter 를 실행해보시고, 모듈이 없으시면, anaconda 소프트웨어를 설치할것을 추천합니다.

 

 

간단한 계산기라도 여러가지 경우의 수를 고려하면 구현해야 할것들이 많이 있지만, 일단 기본적인 연산만 가능하도록 만들어 보겠습니다.

 

화면 초기화

 

from tkinter import *
from tkinter import ttk

#함수 추가할 부분 

root = Tk()
root.title("Calculator")
root.geometry("200x200")

#인터페이스(버튼,창) 추가할 부분.

root.mainloop()

ttk.Tk() 클래스는 기존의 Tk()클래스보다 그래픽이 부분 개선되었습니다. 기능은 거의 동일한 걸로 보입니다.
https://docs.python.org/3/library/tkinter.ttk.html

 

출력창, 버튼 추가

from tkinter import *
from tkinter import ttk


root = Tk()
root.title("Calculator")
root.geometry("100x100")

#숫자 및 결과 표시창.
number_entry = ttk.Entry(root, width=20)
number_entry.grid(row=0, columnspan=1)

#숫자 버튼.
button1 = ttk.Button(root, text="1")
button1.grid(row=1, column=0)

root.mainloop()

 

 

버튼에 명령추가
from tkinter import *
from tkinter import ttk


root = Tk()
root.title("Calculator")
root.geometry("100x100")

number_entry = ttk.Entry(root, width=20)
number_entry.grid(row=0, columnspan=1)

# command=lambda: 뒤에 명령 작성.
button1 = ttk.Button(root, text="1", command=lambda:print("button 1"))
button1.grid(row=1, column=0)

root.mainloop()
button 1
button 1

 

버튼에 함수연결
from tkinter import *
from tkinter import ttk

#함수 추가.
def button_pressed(value):
    print(value,"pressed")
    
root = Tk()
root.title("Calculator")
root.geometry("100x100")

number_entry = ttk.Entry(root, width=20)
number_entry.grid(row=0, columnspan=1)

# command에 함수 연결. 전달값은 버튼의 숫자 '1'
button1 = ttk.Button(root, text="1", command=lambda:button_pressed('1'))
button1.grid(row=1, column=0)

root.mainloop()
1 pressed
1 pressed

 

텍스트 창에 숫자 표시하기

 

from tkinter import *
from tkinter import ttk

def button_pressed(value):
    number_entry.insert("end",value)  #텍스트 창으로 숫자 전송.'end'는 오른쪽끝에 추가하라는 의미.
    print(value,"pressed")
    
root = Tk()
root.title("Calculator")
root.geometry("100x100")

#텍스트창의 값 저장할 변수.
entry_value = StringVar(root, value='')

#textvariable 속성으로 변수 설정.
number_entry = ttk.Entry(root, textvariable = entry_value, width=10)
number_entry.grid(row=0, columnspan=1)

button1 = ttk.Button(root, text="1", command = lambda:button_pressed('1'))
button1.grid(row=1, column=0)

root.mainloop()
1 pressed
1 pressed
1 pressed
1 pressed

 

숫자버튼 생성(1~9)

한줄에 3개씩 3줄, grid에 row값 1~3, column값 0~2, row=0은 entry 위치 

from tkinter import *
from tkinter import ttk

def button_pressed(value):
    number_entry.insert("end",value)
    print(value,"pressed")
    
root = Tk()
root.title("Calculator")
root.geometry("250x200")  # 버튼폭에 맞춰서 확장.

entry_value = StringVar(root, value='')

number_entry = ttk.Entry(root, textvariable = entry_value, width=20)
number_entry.grid(row=0, columnspan=3) #columnspan 은 여러칸에 걸쳐서 표시함.

# button 9개 추가
button7 = ttk.Button(root, text="7", command = lambda:button_pressed('7'))
button7.grid(row=1, column=0)
button8 = ttk.Button(root, text="8", command = lambda:button_pressed('8'))
button8.grid(row=1, column=1)
button9 = ttk.Button(root, text="9", command = lambda:button_pressed('9'))
button9.grid(row=1, column=2)

button4 = ttk.Button(root, text="4", command = lambda:button_pressed('4'))
button4.grid(row=2, column=0)
button5 = ttk.Button(root, text="5", command = lambda:button_pressed('5'))
button5.grid(row=2, column=1)
button6 = ttk.Button(root, text="6", command = lambda:button_pressed('6'))
button6.grid(row=2, column=2)

button1 = ttk.Button(root, text="1", command = lambda:button_pressed('1'))
button1.grid(row=3, column=0)
button2 = ttk.Button(root, text="2", command = lambda:button_pressed('2'))
button2.grid(row=3, column=1)
button3 = ttk.Button(root, text="3", command = lambda:button_pressed('3'))
button3.grid(row=3, column=2)

root.mainloop()
7 pressed
8 pressed
9 pressed
4 pressed
5 pressed
6 pressed
1 pressed
2 pressed
3 pressed
 
나머지 버튼 추가

사칙연산버튼(/*+-)은 math_button_pressed() 함수로 연결. '='버튼은 equal_button_pressed() 함수로 연결. AC 버튼, 0 버튼은 기존의 button_pressed() 로 연결.

from tkinter import *
from tkinter import ttk

def button_pressed(value):
    number_entry.insert("end",value)
    print(value,"pressed")
    
def math_button_pressed(value):
    print(value,"pressed")
    
def equal_button_pressed():
    print("equal pressed")
    
root = Tk()
root.title("Calculator")
root.geometry("300x200")  # 화면폭에 맞춰서 늘려줌.

entry_value = StringVar(root, value='')

number_entry = ttk.Entry(root, textvariable = entry_value, width=20)
number_entry.grid(row=0, columnspan=3) 


button7 = ttk.Button(root, text="7", command = lambda:button_pressed('7'))
button7.grid(row=1, column=0)
button8 = ttk.Button(root, text="8", command = lambda:button_pressed('8'))
button8.grid(row=1, column=1)
button9 = ttk.Button(root, text="9", command = lambda:button_pressed('9'))
button9.grid(row=1, column=2)
# 나누기 버튼 -> math_button_pressed() 로 연결.
button_div = ttk.Button(root, text="/", command = lambda:math_button_pressed('/'))
button_div.grid(row=1, column=3)

button4 = ttk.Button(root, text="4", command = lambda:button_pressed('4'))
button4.grid(row=2, column=0)
button5 = ttk.Button(root, text="5", command = lambda:button_pressed('5'))
button5.grid(row=2, column=1)
button6 = ttk.Button(root, text="6", command = lambda:button_pressed('6'))
button6.grid(row=2, column=2)
# 곱하기 버튼 -> math_button_pressed() 로 연결.
button_mult = ttk.Button(root, text="*", command = lambda:math_button_pressed('*'))
button_mult.grid(row=2, column=3)

button1 = ttk.Button(root, text="1", command = lambda:button_pressed('1'))
button1.grid(row=3, column=0)
button2 = ttk.Button(root, text="2", command = lambda:button_pressed('2'))
button2.grid(row=3, column=1)
button3 = ttk.Button(root, text="3", command = lambda:button_pressed('3'))
button3.grid(row=3, column=2)
#더하기 버튼 -> math_button_pressed() 로 연결.
button_add = ttk.Button(root, text="+", command = lambda:math_button_pressed('+'))
button_add.grid(row=3, column=3)

#마지막줄 AC,0,=,- 버튼추가
# -버튼 -> math_button_pressed() 로 연결.
# AC,0 버튼 -> button_pressed() 로 연결
# = 버튼 -> equal_button_pressed() 로 연결
button_ac = ttk.Button(root, text="AC", command = lambda:button_pressed('AC'))
button_ac.grid(row=4, column=0)
button0 = ttk.Button(root, text="0", command = lambda:button_pressed('0'))
button0.grid(row=4, column=1)
button_equal = ttk.Button(root, text="=", command = lambda:equal_button_pressed())
button_equal.grid(row=4, column=2)
button_sub = ttk.Button(root, text="-", command = lambda:math_button_pressed('-'))
button_sub.grid(row=4, column=3)


root.mainloop()

 

이제 함수를 만들어야 겠네요. 다음 토픽에 이어서 하도록 하겠습니다.

댓글

댓글 본문
  1. 독서로 운명이 변할까
    주피터 노트북에서는 이걸 입력해야 화면이 나타납니다
    대화보기
    • 김진호
      아 진짜 깔끔한 설명 감사합니다..!
    • nomadlife
      import 모듈 과 from 모듈 import * 의 차이는, 일단 사용법상으로는 모듈이름을 계속 붙여주느냐 아니냐의 차이입니다. 그냥 import 모듈 을 했으면, 모듈.StringVar() 이런식으로 매번 모듈이름을 붙여서 사용해야 하구요, from 모듈 import * 이라고 했으면, 그냥 모듈 이름없이 StringVar() 이렇게 사용할수가 있는거구요. import tkinter as tk 라고 하셨으면, StringVar() 앞에다가 tk.StringVar() 라고 해주시면 될거에요. 왼쪽 글목록중에 "모듈불러오기"라는 토픽이 있는데 한번 참고해 보세요. https://www.opentutorials.org......659
      대화보기
      • 김진호
        앗 말씀해주신 코드 넣어주니 돌아가네요..! 저는 단순히 import tkinter as tk 넣고 사용했거든요 ㅎㅎ.. 혹시 일반적인 import 모듈 이랑 from 모듈 import *의 차이가 무엇인가요..?
      • nomadlife
        혹시 첫줄에 from tkinter import * 해주셨나요? 아니면 코드나 오류메세지를 좀 자세히 알려주시면 좋을거 같아요
        대화보기
        • 김진호
          12번라인 StringVar() 함수 사용하려니 Undefined value 'StringVar' 라고 오류메세지가 뜹니다.. 뭐가 문제일까요 ㅠ
        • 최윤진
          훅 들어오는 어퍼컷같습니다
        • nomadlife
          root 객체의 mainloop() 함수를 실행하라는 의미인데,각종 UI를 먼저 셋팅하고, 마지막으로 Tk객체를 화면에 표시하라는 의미인것 같습니다. 파이썬에서 help(root) 나 help(Tk)라고 입력해보시면, Tk클래스의 다양한 함수들의 설명이 나옵니다. 참고로 root는 객체에 임의로 붙인 이름인데, 나중에 이름을 바꾸던지 해야겠네요. 지금보니, root 라는 이름은 좀 햇갈리는듯 합니다.
          대화보기
          • sieunpark77
            root.mainloop()는 어떤 의미이지요?