tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf ·...
TRANSCRIPT
tkinter를 이용한 계산기 구현
박창이
서울시립대학교 통계학과
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 1 / 26
학습내용
그림판
계산기 설계
연산 가능한 계산기
To do
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 2 / 26
그림판 I
크기 600× 400인 캔버스에서 화살표를 이용하여 녹색선으로 스케치하며 u키로 화면 지움
from tkinter import *
##### 변수 설정
# 캔버스의 높이, 폭, 배경색 지정
canvas_height = 400
canvas_width = 600
canvas_colour = "black"
# 선의 x,y 좌표, 색상, 폭, 길이 지정
p1_x=canvas_width/2
p1_y=canvas_height
p1_colour="green"
line_width=5
line_length=5
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 3 / 26
그림판 II
##### Functions:
# 사용자 콘트롤: 화살표를 이용한 이동, 지우기
def p1_move_N(event):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, (p1_y-line_length),
width=line_width, fill=p1_colour)
p1_y = p1_y - line_length
def p1_move_S(event):
global p1_y
canvas.create_line(p1_x, p1_y, p1_x, p1_y+line_length,
width=line_width, fill=p1_colour)
p1_y = p1_y + line_length
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 4 / 26
그림판 III
def p1_move_E(event):
global p1_x
canvas.create_line(p1_x, p1_y, p1_x + line_length, p1_y,
width=line_width, fill=p1_colour)
p1_x = p1_x + line_length
def p1_move_W(event):
global p1_x
canvas.create_line(p1_x, p1_y, p1_x - line_length, p1_y,
width=line_width, fill=p1_colour)
p1_x = p1_x - line_length
def erase_all(event):
canvas.delete(ALL)
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 5 / 26
그림판 IV
##### 메인: 윈도우 뛰우기
window = Tk()
window.title("MyEtchaSketch")
canvas = Canvas(bg=canvas_colour, height=canvas_height,
width=canvas_width, highlightthickness=0)
canvas.pack()
# windows.bind를 이용한 키를 눌렀을 때 움직임 지정:
window.bind("<Up>", p1_move_N)
window.bind("<Down>", p1_move_S)
window.bind("<Left>", p1_move_W)
window.bind("<Right>", p1_move_E)
window.bind("u", erase_all)
window.mainloop()
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 6 / 26
그림판 V
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 7 / 26
계산기 설계 I
화면에 숫자 버튼 1 생성
from tkinter import *
from decimal import *
##### 메인:
window = Tk()
window.title("MyCalculator")
# 내용 수정이 가능한 엔트리 위젯을 사용해 결과 디스플레이 사용
display = Entry(window, width=45, bg="light green")
display.grid()
# 숫자 버튼 생성:
def click1():
display.insert(END, "1")
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 8 / 26
계산기 설계 II
Button(window, text="1", width=5, command=click1).grid(row=1,column=0)
##### 메인 반복문 실행
window.mainloop()
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 9 / 26
계산기 설계 III
for문을 이용하여 버튼 생성
from tkinter import *
from decimal import *
# 키 입력 함수:
def click(key):
display.insert(END, key)
##### 메인:
window = Tk()
window.title("MyCalculator")
# top_row 프레임 생성
top_row = Frame(window)
top_row.grid(row=0, column=0, columnspan=2, sticky=N)
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 10 / 26
계산기 설계 IV
# 수정 가능한 엔트리 위젯
display = Entry(top_row, width=45, bg="light green")
display.grid()
# 숫자 버튼 프레임 생성
num_pad = Frame(window)
num_pad.grid(row=1, column=0, sticky=W)
# 숫자 버튼에 제공될 숫자:
num_pad_list = [
’7’, ’8’, ’9’,
’4’, ’5’, ’6’,
’1’, ’2’, ’3’,
’0’, ’.’, ’=’ ]
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 11 / 26
계산기 설계 V
# 반복문으로 숫자 버튼 생성
r = 0 # 행 카운터
c = 0 # 열 카운터
for btn_text in num_pad_list:
Button(num_pad, text=btn_text, width=5, command=click).grid(row=r,
column=c)
c = c+1
if c > 2:
c = 0
r = r+1
##### 메인 반복문 실행
window.mainloop()
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 12 / 26
계산기 설계 VI
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 13 / 26
계산기 설계 VII
앞의 코드에 연산자 버튼 추가
# 연산자 프레임 생성
operator = Frame(window)
operator.grid(row=1, column=1, sticky=E)
operator_list = [
’*’, ’/’,
’+’, ’-’,
’(’, ’)’,
’C’ ]
# 반복문으로 연산자 버튼 생성
r = 0
c = 0
for btn_text in operator_list:
Button(operator, text=btn_text, width=5, command=click).grid(row=r,
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 14 / 26
계산기 설계 VIII
column=c)
c = c+1
if c > 1:
c = 0
r = r+1
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 15 / 26
연산 가능한 계산기 I
cmd 함수에서 btn text를 디퐅트로 설정하여 click 함수에전달함으로써 어떤 버튼이 눌린것인지 알 수 있음
# 반복문으로 숫자 버튼 생성
r = 0
c = 0
for btn_text in num_pad_list:
def cmd(x=btn_text):
click(x)
Button(num_pad, text=btn_text, width=5, command=cmd).grid(row=r,
column=c)
c = c+1
if c > 2:
c = 0
r = r+1
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 16 / 26
연산 가능한 계산기 II
연산자에도 cmd 함수 추가할 것
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 17 / 26
연산 가능한 계산기 III
계산(=), 지우기(C) 기능 추가
# 키 입력 함수:
def click(key):
# = 버튼이 눌렸을 때 계산 수행:
if key == ’=’:
try:
result = str(eval(display.get()))[0:10]
display.insert(END, " = " + result)
except:
display.insert(END, " --> Error!")
# C 버튼이 눌려졌을 때 display 엔트리 위젯 내용 비움:
elif key == "C":
display.delete(0, END)
# 그 외 다른 키를 눌렀을 때 실행될 기본 동작:
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 18 / 26
연산 가능한 계산기 IV
else:
display.insert(END, key)
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 19 / 26
연산 가능한 계산기 V
상수, 진수 변환, 계승 기능 추가
# 팩토리얼 함수:
def factorial(n):
return "factorial (!)"
# 10진수를 2진수로 변환하는 함수:
def to_binary(n):
return "-> binary"
# 2진수를 10진수로 변환하는 함수:
def from_binary(n):
return "binary -> 10"
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 20 / 26
연산 가능한 계산기 VI
# 키 입력 함수:
def click(key):
# = 버튼이 눌렸을 때 계산 수행:
if key == "=":
try:
result = str(eval(display.get()))[0:10]
display.insert(END, " = " + result)
except:
display.insert(END, " --> Error!")
# C 버튼이 눌려졌을 때 display 엔트리 위젯 내용 비움:
elif key == "C":
display.delete(0, END)
# 상수 버튼에 대한 작업:
elif key == constants_list[0]:
display.insert(END, "3.141592654")
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 21 / 26
연산 가능한 계산기 VII
# 함수 버튼에 대한 작업:
elif key == functions_list[0]:
n = display.get() # 현재 display 엔트리 위젯 값 수집
display.delete(0, END) # 현재 display 엔트리 위젯 내용 비움
display.insert(END, factorial(n))
elif key == functions_list[1]:
n = display.get() # 현재 display 엔트리 위젯 값 수집
display.delete(0, END) # display 엔트리 위젯 내용 비움
display.insert(END, to_binary(n))
elif key == functions_list[2]:
n = display.get() # 현재 display 엔트리 위젯 값 수집
display.delete(0, END) # display 엔트리 위젯 내용 비움
display.insert(END, from_binary(n))
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 22 / 26
연산 가능한 계산기 VIII
# 그 외 다른 키를 눌렀을 때 실행될 기본 동작:
else:
display.insert(END, key)
# 상수 프레임 생성
constants = Frame(window)
constants.grid(row=3, column=0, sticky=W)
constants_list = [’pi’]
# 반복문으로 상수 버튼 생성
r = 0
c = 0
for btn_text in constants_list:
def cmd(x=btn_text):
click(x)
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 23 / 26
연산 가능한 계산기 IX
Button(constants, text=btn_text, width=22, command=cmd).grid(row=r,
column=c)
r = r+1
# 함수 프레임 생성
functions = Frame(window)
functions.grid(row=3, column=1, sticky=E)
functions_list = [
’factorial (!)’,
’10-> binary’,
’binary -> 10’ ]
# 반복문으로 함수 버튼 생성
r = 0
c = 0
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 24 / 26
연산 가능한 계산기 Xfor btn_text in functions_list:
def cmd(x=btn_text):
click(x)
Button(functions, text=btn_text, width=13, command=cmd).grid(row=r,
column=c)
r = r+1
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 25 / 26
To do
모든 버튼이 잘 작동하도록 빠진 부분 프로그램 하시오.
간단한 통계(평균, 분산, 표준편차 등) 및 공학용 계산기를
작성하시오.
박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 26 / 26