calc_functions.py
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | # 파이썬 계산기의 함수 모듈: 다음 단계 # 팩토리얼 함수: def factorial(n): try: n = int(n) except: return "--> 오류!" # '0'과 같은지 체크(특별한 경우): if n == 0: return 1 # 매우 큰 수인지 확인해서 돌려보냄: if n > 40: return "--> 답이 화면을 가득 채울 수 있습니다!" # 음수에 발생한 경우에 대한 점검: if n < 0: return "--> 오류!" # 팩토리얼 알고리즘 적용: ans = n while n > 1: ans = ans*(n-1) n = n-1 return ans # 로마 숫자로 변환하는 함수01: def to_roman(n): try: n = int(n) except: return "--> 오류!" # 인수가 4999보다 큰 숫자인지 범위를 벗어난 것으로 판단합니다.: if n > 4999: return "--> 범위를 넘어섭니다." # 튜플 안에 튜플 생성: romans = ((1000,"M"), (900,"CM"), (500,"D"), (400,"CD"), (100,"C"), (90,"XC"), (50,"L"), (40,"XL"), (10,"X"), (9,"IX"), (5,"V"), (4,"IV"), (1,"I")) # 알고리즘 시작: result ="" for (value,letters) in romans: while n >= value: result = result + letters n = n - value return result # 로마 숫자로 변환하는 함수02: def to_roman02(n): try: n = int(n) except: return "--> 오류!" # 인수가 4999보다 큰 숫자인지 범위를 벗어난 것으로 판단합니다.: if n > 4999: return "--> 범위를 넘어섭니다." # 튜플과 사전 생성: numberBreaks = (1000,900,500,400,100,90,50,40,10,9,5,4,1) letters = {1000:"M", 900:"CM", 500:"D", 400:"CD", 100:"C", 90:"XC", 50:"L", 40:"XL", 10:"X", 9:"IX", 5:"V", 4:"IV", 1:"I"} # 알고리즘 시작: result ="" for value in numberBreaks: while n >= value: result = result + letters[value] n = n - value return result # 10진수를 2진수로 변환하는 함수: def to_binary(n): try: n = int(n) return bin(n)[2:] except: return "-->오류!" # 2진수를 10진수로 변환하는 함수: def from_binary(n): try: return int(n,2) except: return "-->오류!" | cs |
Main.py
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | # Main.py from tkinter import * from decimal import * import calc_functions # 키 입력 함수: def click(key): # = 버튼이 눌렸을 때 계산 수행: if key == "=": try: result = str(eval(display.get()))[0:10] display.insert(END, "=" + result) except: display.insert(END, "--> 오류!") # C 버튼이 눌렸을 때 display 엔트리 위젯 내용 비움: elif key == "C": display.delete(0, END) # 상수 버튼에 대한 연결 코드: elif key == constants_list[0]: display.insert(END, "3.141592654") elif key == constants_list[1]: display.insert(END, "300000000") elif key == constants_list[2]: display.insert(END, "330") elif key == constants_list[3]: display.insert(END, "149597887.5") # 함수 버튼 행동 정의: elif key == functions_list[0]: n = display.get() # display 엔트리 위젯 내용 수집 display.delete(0,END) # display 엔트리 위젯 내용 비움 display.insert(END, calc_functions.factorial(n)) elif key == functions_list[1]: n = display.get() # display 엔트리 위젯 내용 수집 display.delete(0,END) # display 엔트리 위젯 내용 비움 display.insert(END, calc_functions.to_roman(n)) elif key == functions_list[2]: n = display.get() # display 엔트리 위젯 내용 수집 display.delete(0,END) # display 엔트리 위젯 내용 비움 display.insert(END, calc_functions.to_binary(n)) elif key == functions_list[3]: n = display.get() # display 엔트리 위젯 내용 수집 display.delete(0,END) # display 엔트리 위젯 내용 비움 display.insert(END, calc_functions.from_binary(n)) # 그 외 다른 키를 눌렀을 때 실행될 기본 동작: else: display.insert(END, key) ##### 메인: window = Tk() window.title("Mycalcultor") # top_row 프레임 생성 top_row = Frame(window) top_row.grid(row=0, column=0, columnspan=2,sticky=N) # 내용 수정이 가능한 엔트리 위젯을 사용해 결과 디스플레이 사용 display = Entry(top_row, width=45, bg="light gray") 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','.','='] # 반복문으로 숫자 버튼 생성 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=7, command=cmd).grid(row=r, column=c) c = c+1 if c > 2: c = 0 r = r + 1 # 연산자 프레임 생성 operator = Frame(window) operator.grid(row=1, column=1, sticky=E) operator_list = [ '*', '/', '+','-', '(',')', 'C'] # 반복문 안에서 연산자 버튼 생성 for btn_text in operator_list: def cmd(x=btn_text): click(x) Button(operator, text=btn_text, width=5, command=cmd).grid(row=r, column=c) c = c+1 if c > 1: c = 0 r = r + 1 # 상수 프레임 생성 constants = Frame(window) constants.grid(row=3, column=0, sticky=W) constants_list = [ 'pi', '빛의 이동 속도(m/s)', '소리의 이동 속도(m/s)', '태양과의 평균 거리(km)'] # 반복문과 함께 상수 버튼 생성 r = 0 c = 0 for btn_text in constants_list: def cmd(x=btn_text): click(x) Button(constants, text=btn_text, width=24, command=cmd).grid(row=r, column=c) r = r+1 # 함수 프레임 생성 functions = Frame(window) functions.grid(row=3, column=1, sticky=E) functions_list = [ 'factorial (!)', '-> roman', '-> binary', 'binary -> 10'] # 반복문과 함께 함수 버튼 생성 r = 0 c = 0 for btn_text in functions_list: def cmd(x=btn_text): click(x) Button(functions, text=btn_text, width=24, command=cmd).grid(row=r, column=c) r = r+1 ###### 메인 반복문 실행 window.mainloop() | cs |