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