본문 바로가기

Manual

파이썬 tkinter, 냉동식품 관리(1)

파이썬 GUI 프로그래밍 연습을 위해 tkinter를 사용하여 냉동식품 관리 프로그램을 작성하려 합니다. 

냉장고 냉장실은 자주 열어 보기 때문에 보관하던 식품이 상해 버릴 일이 없지만, 냉동실은 자주 열지 않고 또, 냉동실의 냉기 전달의 효율을 위해 빈틈없이 꽉꽉 채우다 보니 자칫 깊숙이 넣어 둔 식품을 잊고 있다가 너무 오랜 시간이 지난 뒤에 발견하게 되는 경우가 있는 것 같습니다. 냉동고에 어떤 식품을 언제 구입해 두었는지, 유통기한은 언제까지인지 직관적으로 파악할 수 있으면 좋겠습니다.

그래서 냉동실 문을 열어보는 것 같이 속에 들어있는 식품의 정보를 보여주는 프로그램을 만드려고 합니다.

 

목차

1. 텍스트 파일 만들기

2. 홈 화면 창 만들기

     1) tkinter를 이용한 창 만들기

     2) 창에 라벨 나타내기

     3) 창에 버튼 나타내기

3. 개별 칸을 보여주는 창 만들기

4. 함수 만들기

   1) 창 열고 닫기 함수

   2) 데이터 수정 함수

5. 창 열고 닫기


1. 텍스트 파일 만들기

데이터는 텍스트  파일로 만들어 저장하고 읽어오겠습니다. 필요한 항목은 "구입일", "품목명", "수량", "유통기한", "보관장소" 정도면 될 것 같습니다. 각각의 칼럼 이름을 "p_Day", "item", "Qty", "exp_Day", "place"으로 정하고 테스트용 텍스트 파일을 만들어 'frozen_food.txt'로 저장합니다.

frozen_food.txt
0.00MB

 

2. 홈 화면 만들기

홈 화면을 냉장고처럼 만들고, 냉동실의 각 칸을 배치합니다. 칸 마다 열기 버튼과 닫기 버튼을 배치하여 실제 냉동실을 열어보는 것 같은 효과를 얻으려고 합니다. 열기 버튼을 클릭하여 열었을 때, 보관 중인 식품 목록이 유통기한이 임박한 순서대로 정열 되어 표시되면 좋겠습니다. 새로운 식품을 추가하거나 사용한 식품을 제거하는 창도 나타나게 하려고 합니다.

 

     1) tkinter를 이용한 창 만들기

창을 만들기 위해 tkinter 모듈을 불러와 tk로 줄여 부르고, tkinter의 ttk도 불러와 ttk로 줄여 부른다.

데이터프레임 작업을 위해 pandas도 불러와 pd로 줄여 부른다. 

테스트용으로 만든 텍스트 파이을 데이터프레임에 불러온다.

import tkinter as tk
import tkinter.ttk as ttk
import pandas as pd

df = pd.read_csv('frozen_food.txt') 

창을 만들기 위해

창이름 = tk.Tk()를 입력하고

창에 표시할 이름은

창이름.title('창에 표시할 이름') 형식을 사용하여 설정합니다.

창의 크기를

창이름.geometry("가로픽셀수x세로 픽셀 수+위치의 x좌표+위치의 y좌표") 형식으로 입력합니다.

'home'이라는 창을 400x400 크기로 만듭니다.

home = tk.Tk()
home.title("냉동식품 관리 program")
home.geometry("400x400")

     2) 창에 라벨 나타내기

만들어진 창에 필요한 글씨를 입력하기 위해

라벨이름 = tk.Label(창이름, text="나타낼 글씨", font=("폰트이름", 폰트크기), bg='배경색', width=폭, height=높이, anchor='정렬방식')

정렬방식은 n, ne, e, se, s, sw, w, nw, center 중 하나를 사용합니다.

라벨의 위치 지정을 위해

라벨이름.place(x=50, y=10)를 사용합니다.

lb1 = tk.Label(home, text="상1", font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
lb1.place(x=50, y=50)

lb2 = tk.Label(home, text="상2", font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
lb2.place(x=50, y=100)

lb3 = tk.Label(home, text="상3", font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
lb3.place(x=50, y=150)

lb4 = tk.Label(home, text="하1", font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
lb4.place(x=50, y=200)

lb5 = tk.Label(home, text="하2", font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
lb5.place(x=50, y=250)

근데, 비슷한 코드를 계속 반복해서 입력하는 것보다 for i in range(a, b) 반복문을 사용하면 좋겠다는 생각이 납니다.

라벨에 나타낼 글씨와 라벨의 위치 y좌표 값만 다르기 때문입니다.

라벨에 나타낼 글씨는 name_tag라는 이름의 list에 지정하여 차례로 표시되게 하였고

y좌표 값은 수식을 이용했습니다.

name_tag = ['상1','상2','상3','하1','하2']
for i in range(0,5):
     a = 50 + 50*i
     lb = tk.Label(home, text=name_tag[i], font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center')
     lb.place(x=50, y=a)

열 줄이나 되던 코딩이 다섯 줄로 줄었습니다. 

글자 수로는 637자에서 218자로 419자나 줄이고 같은 결과를 얻었습니다.

     3) 창에 버튼 나타내기

버튼은

버튼이름 = tk.Button(창 이름, text='표시할 글',font=("폰트 이름", 폰트 크기), bg='배경색', width=폭, height=높이, anchor='정렬', command=함수)을 사용하여 나타냅니다.

버튼을 클릭할 때 실행할 함수는 나중에 만들어 입력하기로 하고

우선 각 위치의 냉동실을 열고, 닫는 버튼만 표시합니다.

각 버튼의 위치는 라벨과 같은 방법으로 지정합니다.

btn11 = tk.Button(home, text='열기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn11.place(x=150, y=50)
btn12 = tk.Button(home, text='닫기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn12.place(x=250, y=50)

btn21 = tk.Button(home, text='열기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn21.place(x=150, y=100)
btn22 = tk.Button(home, text='닫기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn22.place(x=250, y=100)

btn31 = tk.Button(home, text='열기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn31.place(x=150, y=150)
btn32 = tk.Button(home, text='닫기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn32.place(x=250, y=150)

btn41 = tk.Button(home, text='열기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn41.place(x=150, y=200)
btn42 = tk.Button(home, text='닫기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn42.place(x=250, y=200)

btn51 = tk.Button(home, text='열기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn51.place(x=150, y=250)
btn52 = tk.Button(home, text='닫기', font=("나눔고딕", 12), bg='lightgray', width=10, height=2, anchor='center', command="" )     
btn52.place(x=250, y=250)

frozen_food.py
0.00MB

글이 너무 길어졌습니다. 나머지는 다음 글에 이어 작성하겠습니다.

728x90