Programming/Python

Python_Tkinter_계산기 만들기_StringVar

Bear_V 2021. 2. 27. 09:11

Tkinter를 이용하여 계산기를 만들어보았다.

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()