Programming/Python
Python_Tkinter_계산기 만들기_StringVar
Bear_V
2021. 2. 27. 09:11
Tkinter를 이용하여 계산기를 만들어보았다.
그리드와 버튼 만드는 것까지는 잘 만들어나갔는데, 숫자를 입력하고 출력하는 함수를 만드는 과정이 너무 어려웠다.
그래서 다른 블로거분들의 지식을 빌려 꾸역꾸역 만들어봤다.
특히 StringVar 함수가 낯설었다.
StringVar : tkinter GUI에서 화면에 띄운 텍스트 내용을 필요에 따라 바꾸어야 할때 사용하는 방법이라 한다.
변수이름 = tkinter.StringVar()
tkinter.(..., textvariable=변수이름,...)
변수이름.set("입력할 문자열")
계산된 값은 계산할 때마다 계속 바뀌어야 하기 때문에 StringVar 함수를 써야한다.
이로인해, 변수의 값이 바뀌면, 위젯에 표시된 값이 바뀐다.
주의사항:
StringVar()로 정의된 변수는 문자열 변수가 아니다.
그렇기 때문에 변수이름 = '문자열' 형식을 사용할 수 없고,
set 메소드를 사용해야 한다.
기타:
IntVar : 위젯에 나타난 정수를 변경가능한 타입으로 정한다.
변수이름 = tkinter.IntVar()
tkinter.Label(..., textvariable=n, ...)
변수이름.set(숫자)
from tkinter import *
from tkinter import ttk
'''########################################'''
# 함수
def calc():
formula=entry.get()
txt_var.set(eval(formula))
def btn_pressed(value):
if value == "":
entry.delete('0','end')
print("내용이 지워짐")
else:
entry.insert("end", value)
print(value,"pressed")
def oper_pressed(value):
if value == "":
entry.delete('0','end')
print("내용이 지워짐")
else:
entry.insert("end", value)
print(value,"pressed")
'''########################################'''
root = Tk()
root.title("Calculator")
root.geometry("320x290")
entry = Entry(root, width=20)
entry.grid(row=0, column=0, padx=5)
lbl0=Label(root, text='=').grid(row=0, column=1)
txt_var = StringVar(root)
lbl1=Label(root, textvariable=txt_var, width=15, bg='white').grid(row=0, column=2, columnspan=2)
btn1=Button(root, text="Calculation", command=calc).grid(row=1, column=0)
'''########################################'''
'''버튼'''
# clear 줄
btn_clear = Button(root, text="clear", width=5, height=2, command=lambda:btn_pressed(''))
btn_divide = Button(root, text="/", width=5, height=2, command=lambda:oper_pressed('/'))
btn_mul = Button(root, text="*", width=5, height=2, command=lambda:oper_pressed('*'))
btn_clear.grid(row=4, column=0, columnspan=2, sticky=N+E+W+S, padx=3, pady=3)
btn_divide.grid(row=4, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_mul.grid(row=4, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 7 시작 줄
btn_7 = Button(root, text="7", width=5, height=2, command=lambda:btn_pressed('7'))
btn_8 = Button(root, text="8", width=5, height=2, command=lambda:btn_pressed('8'))
btn_9 = Button(root, text="9", width=5, height=2, command=lambda:btn_pressed('9'))
btn_sub = Button(root, text="-", width=5, height=2, command=lambda:oper_pressed('-'))
btn_7.grid(row=5, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_8.grid(row=5, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_9.grid(row=5, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_sub.grid(row=5, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 4 시작 줄
btn_4 = Button(root, text="4", width=5, height=2, command=lambda:btn_pressed('4'))
btn_5 = Button(root, text="5", width=5, height=2, command=lambda:btn_pressed('5'))
btn_6 = Button(root, text="6", width=5, height=2, command=lambda:btn_pressed('6'))
btn_plus = Button(root, text="+", width=5, height=2, command=lambda:oper_pressed('+'))
btn_4.grid(row=6, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_5.grid(row=6, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_6.grid(row=6, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_plus.grid(row=6, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 1 시작 줄
btn_1 = Button(root, text="1", width=5, height=2, command=lambda:btn_pressed('1'))
btn_2 = Button(root, text="2", width=5, height=2, command=lambda:btn_pressed('2'))
btn_3 = Button(root, text="3", width=5, height=2, command=lambda:btn_pressed('3'))
btn_enter = Button(root, text="enter", command=calc) # 세로로 합쳐짐
btn_1.grid(row=7, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_2.grid(row=7, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_3.grid(row=7, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_enter.grid(row=7, column=3, rowspan=2, sticky=N+E+W+S, padx=3, pady=3)
# 0 시작 줄
btn_0 = Button(root, text="0", width=5, height=2, command=lambda:btn_pressed('0'))
btn_point = Button(root, text=".", width=5, height=2, command=lambda:btn_pressed('.'))
btn_0.grid(row=8, column=0, columnspan=2, sticky=N+E+W+S, padx=3, pady=3)
btn_point.grid(row=8, column=2, sticky=N+E+W+S, padx=3, pady=3)
#####################################################################
root.resizable(False, False)
root.mainloop()