파이썬의 tkinter 모듈은 각종 그래픽 인터페이스를 만들어주는 모듈입니다.
tkinter 모듈을 이용하면, 간단한 계산기 프로그램을 만들수 있습니다.
import tkinter 를 실행해보시고, 모듈이 없으시면, anaconda 소프트웨어를 설치할것을 추천합니다.
간단한 계산기라도 여러가지 경우의 수를 고려하면 구현해야 할것들이 많이 있지만, 일단 기본적인 연산만 가능하도록 만들어 보겠습니다.
화면 초기화
1 2 3 4 5 6 7 8 9 10 11 12 | 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
출력창, 버튼 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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() |
버튼에 명령추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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
버튼에 함수연결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
텍스트 창에 숫자 표시하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 위치
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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() 로 연결.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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() |
이제 함수를 만들어야 겠네요. 다음 토픽에 이어서 하도록 하겠습니다.