tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf ·...

26
tkinter| t'\ ˜0 l =t YP ˜Yü =t (YP ˜Yü) tkinter| t'\ ˜0 l 1 / 26

Upload: hoangkhuong

Post on 21-Jun-2018

263 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

tkinter를 이용한 계산기 구현

박창이

서울시립대학교 통계학과

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 1 / 26

Page 2: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

학습내용

그림판

계산기 설계

연산 가능한 계산기

To do

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 2 / 26

Page 3: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

그림판 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

Page 4: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

그림판 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

Page 5: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

그림판 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

Page 6: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

그림판 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

Page 7: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

그림판 V

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 7 / 26

Page 8: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 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

Page 9: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 II

Button(window, text="1", width=5, command=click1).grid(row=1,column=0)

##### 메인 반복문 실행

window.mainloop()

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 9 / 26

Page 10: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 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

Page 11: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 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

Page 12: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 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

Page 13: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 VI

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 13 / 26

Page 14: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 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

Page 15: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

계산기 설계 VIII

column=c)

c = c+1

if c > 1:

c = 0

r = r+1

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 15 / 26

Page 16: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 17: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 II

연산자에도 cmd 함수 추가할 것

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 17 / 26

Page 18: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 19: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 IV

else:

display.insert(END, key)

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 19 / 26

Page 20: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 21: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 22: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 23: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 24: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 25: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

연산 가능한 계산기 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

Page 26: tkinter를 이용한 계산기 구현statlearn.uos.ac.kr/2018/adv_prog_spring_18/case3calc.pdf · tkinter를 이용한 계산기 구현 Author: 박창이 Created Date: 1/27/2018 4:54:55

To do

모든 버튼이 잘 작동하도록 빠진 부분 프로그램 하시오.

간단한 통계(평균, 분산, 표준편차 등) 및 공학용 계산기를

작성하시오.

박창이 (서울시립대학교 통계학과) tkinter를 이용한 계산기 구현 26 / 26