728x90
저번에 만든 계산기는 조금 엉성하고, 코드 작성도 길었었는데, 이번에 공부하면서 짧고 쉬운 코드를 배웠습니다. 저번에 만든 코드보다 간편하지만 퀄리티는 훨씬 나아진 버전입니다.
### 전체코드
import tkinter as tk
import tkinter.font as tkf
window=tk.Tk()
window.title("계산기")
window.resizable(False,False)
font=tkf.Font(family="맑은고딕",size=20)
###함수
def button_click(digit):
if digit == "←":
input_entry.delete(len(input_entry.get())-1)
else:
input_entry.insert(tk.END,digit)
def button_del():
input_entry.delete(0,tk.END)
resul_label.config(text="")
def button_resul():
try:
resul=eval(input_entry.get())
except:
resul_label.config(text="계산오류")
else:
resul_label.config(text=resul)
digits=[
["1","2","3","+"],
["4","5","6","-"],
["7","8","9","*"],
[".","0","←","/"]
]
input_entry=tk.Entry(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
input_entry.grid(column=0,row=0,columnspan=4,sticky="news",padx=1,pady=1)
resul_label=tk.Label(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
resul_label.grid(column=0,row=1,columnspan=4,sticky="news",padx=1,pady=1)
for a in range(4):
for b in range(4):
digit=digits[a][b]
button=tk.Button(window,text=digit,font=font,bg="white")
button.grid(row=a+2,column=b,sticky="news",padx=1,pady=1)
button.config(command=lambda cmd=button.cget("text"):button_click(cmd))
clear_button=tk.Button(window,text="C",font=font,command=button_del)
clear_button.grid(column=0,row=6,columnspan=2,sticky="news",padx=1,pady=1)
resul_button=tk.Button(window,text="=",font=font,command=button_resul)
resul_button.grid(column=2,row=6,columnspan=2,sticky="news",padx=1,pady=1)
window.mainloop()
전체 코드인데 나눠서 설명해보겠습니다.
import tkinter as tk
import tkinter.font as tkf
window=tk.Tk()
window.title("계산기")
window.resizable(False,False)
font=tkf.Font(family="맑은고딕",size=20)
- tkinter와 tkinter.font를 불러줍니다.
- tk모듈의 Tk클래스로 window객체를 만듭니다.
- title을 정해주고, resizable(False,False)를 써서 창 크기를 고정해줍니다.
- tkf모듈의 Font클래스를 사용해서 폰트를 정해줍니다. 글꼴은 맑은 고딕으로, 크기는 20으로 설정했습니다.
digits=[
["1","2","3","+"],
["4","5","6","-"],
["7","8","9","*"],
[".","0","←","/"]
]
input_entry=tk.Entry(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
input_entry.grid(column=0,row=0,columnspan=4,sticky="news",padx=1,pady=1)
resul_label=tk.Label(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
resul_label.grid(column=0,row=1,columnspan=4,sticky="news",padx=1,pady=1)
- 저번에는 버튼을 하나씩 전부 만들었었지만, 이번에는 digits[]를 사용해서 간단하게 만들어보겠습니다. 일단 원하는 모양대로 숫자와 기호를 작성합니다.
- 전부지우는C버튼과 결과를 나타내는 = 버튼은 따로 만들어줍니다.
- input_entry= 내가 누른 값이 나타나고, resul_laber=결과값이 나타납니다.
- input_entry은 맨 위에 배치할 거니 column, row는 0으로 설정해주고, 가로방향으로 4칸, 모든 방향으로 늘려줍니다. 간격은 x, y 1씩 띄웁니다. 또한 폰트는 아까 작성한 font를 설정하고 배경색은 흰색으로 합니다. tk.RIGHT를 사용해서 오른쪽에 배치합니다.
- resul_label은 다 똑같고 바로 밑에 배치시킬 거니, row만 1로 변경합니다.
- 참고로 입력값은 Entry를 사용해서 키보드로 숫자를 입력할 수도 있습니다.
for a in range(4):
for b in range(4):
digit=digits[a][b]
button=tk.Button(window,text=digit,font=font,bg="white")
button.grid(row=a+2,column=b,sticky="news",padx=1,pady=1)
button.config(command=lambda cmd=button.cget("text"):button_click(cmd))
clear_button=tk.Button(window,text="C",font=font,command=button_del)
clear_button.grid(column=0,row=6,columnspan=2,sticky="news",padx=1,pady=1)
resul_button=tk.Button(window,text="=",font=font,command=button_resul)
resul_button.grid(column=2,row=6,columnspan=2,sticky="news",padx=1,pady=1)
window.mainloop()
이제 for문을 사용해서 digits에서 만든 배열을 깔끔하게 나타내고, 실행하는 함수를 넣겠습니다.
- 처음 for문의 a는 row입니다. 4행이니 range(4)를 입력합니다.
- 두 번째 for문의 b는 column입니다. 4열이니 range(4)를 입력합니다.
- digit에는 digits에 있는 숫자들이 담깁니다.
- Button을 사용해서 버튼을 설정합니다. text는 digit으로 설정하고, 폰트는 아까 설정한 폰트, 배경색은 흰색으로 설정합니다.
- 버튼 위치를 정해야 되는데, row는 1행까지는 정했으니 2행부터 시작해야 됩니다. 그래서 row=a+2라고 적고, column은 b라고 정합니다. 또한 모든 방향으로 늘려주고, x, y간격을 1씩 띄웁니다.
- button.config(command=lambda cmd=button.cget("text"):button_click(cmd)) = command로 lambda함수를 연결합니다. cmd=버튼 누른 값을 cget을 사용해서 값을 정해주고, 그 값을 cmd에 저장합니다. cmd에 저장된 값을 button_click(cmd)의 cmd부분에 넣어줍니다.(버튼을 클릭하면 button_click함수로 이동한다는 뜻)
- clear_button은 C버튼을 만드는 코드입니다. text="C"로 설정하고, command를 사용해서 button_del함수에 연결합니다.
- resul_button은 =버튼을 만드는 코드입니다. text="="로 설정하고, command를 사용해서 button_resul함수에 연결합니다.
- clear_button과 resul_button의 grid는 2칸씩 차지할 거라서 columnspan=2라고 작성하고, 각각 column은 0과 2로 설정합니다.
- 마지막 window.mainloop() 작성하면 완료.
###함수
def button_click(digit):
if digit == "←":
input_entry.delete(len(input_entry.get())-1)
else:
input_entry.insert(tk.END,digit)
def button_del():
input_entry.delete(0,tk.END)
resul_label.config(text="")
def button_resul():
try:
resul=eval(input_entry.get())
except:
resul_label.config(text="계산오류")
else:
resul_label.config(text=resul)
def button_click
- 첫 번째 함수인 button_click은 ←버튼을 실행하는 함수입니다. (잘못 입력했을 때 하나씩 지울 수 있는 버튼)
- if를 사용해서 digit값이 "←" 라면, input_entry(내가 누른 값)에서 delete(지웁니다.) len(input_entry.get())-1(내가 누른 값을 뒤에서부터 지웁니다.)
- else(아니라면) input_entry.insert(tk.END,digit) insert를 사용해서 추가해줍니다.(끝에서부터,digit값을)
def button_del
- 두 번째 함수인 button_del는 C버튼을 실행하는 함수입니다. (모든 걸 리셋시키는 버튼)
- input_entry.delete(0,tk.END)를 사용해서 Input_entry(누른값)delete(지웁니다) 0,tk.END(0에서 끝까지)
- resul_label.config(text="")를 사용해서 resul_label(결과값)config(속성값)을 text=""으로 만듭니다.
def button_resul
- 세 번째 함수인 button_resul는 =버튼 클릭 시 실행하는 함수입니다. 만약 오류가 났다면 계산오류라는 문구를 표시합니다.
- try를 사용해서 실행할 함수를 설정합니다. eval을 사용하면 (input_entry.get)에 누른 값을 갖고 와서 계산한 뒤 그 값을 resul에 저장합니다.
- except : try가 아니라면 resul_label.config(결과값)에 text="결과오류"라는 문구를 나오게 합니다.
- else : try에 문제가 없다면 값을 출력합니다. resul_label.config(결과값)에 text=resul을 사용해서 입력값을 표시합니다.
확실히 저번에 만든 계산기보다 퀄리티가 좋은 것 같아요. 같은 계산기인데, 코드 작성도 짧아지고, 조금 더 편하게 만든 것 같습니다. 배우는 재미는 있지만.. 갈수록 어렵습니다..
728x90
'파이썬' 카테고리의 다른 글
파이썬 turtle 패키지로 그림그리기 코드 작성 (졸라맨) (0) | 2022.07.20 |
---|---|
파이썬 기본패키지 turtle 모듈 사용법 (0) | 2022.07.19 |
파이썬 Tkinter 패키지로 계산기 코드 작성 (0) | 2022.07.16 |
파이썬 기본패키지 tkinter 모듈 사용법 (0) | 2022.07.15 |
파이썬 random 패키지로 로또번호 뽑기 코드작성 (0) | 2022.07.14 |
댓글