import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd
# 데이터 초기화
try:
data = pd.read_excel("food_data.xlsx") # 기존 데이터 불러오기
except FileNotFoundError:
data = pd.DataFrame(columns=["식품명", "소비기한", "보관방법"])
# 창을 화면 가운데에 배치하는 함수
def center_window(window, width, height):
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
x = (screen_width // 2) - (width // 2)
y = (screen_height // 2) - (height // 2)
window.geometry(f"{width}x{height}+{x}+{y}")
# 데이터 저장 함수
def save_data():
data.to_excel("food_data.xlsx", index=False)
messagebox.showinfo("저장 완료", "데이터가 저장되었습니다!")
# 검색 기능
def search_food():
food_name = search_entry.get()
if food_name in data["식품명"].values:
item = data.loc[data["식품명"] == food_name].iloc[0]
result_label.config(text=f"소비기한: {item['소비기한']}\n보관방법: {item['보관방법']}")
else:
result_label.config(text="해당 식품 정보를 찾을 수 없습니다.")
# 데이터 추가/수정
def add_food():
def save_new_food():
name = name_entry.get()
exp_date = exp_date_entry.get()
storage = storage_entry.get()
if name and exp_date and storage:
global data
if name in data["식품명"].values:
data.loc[data["식품명"] == name, ["소비기한", "보관방법"]] = [exp_date, storage]
else:
new_row = {"식품명": name, "소비기한": exp_date, "보관방법": storage}
data = pd.concat([data, pd.DataFrame([new_row])], ignore_index=True)
save_data()
add_window.destroy()
messagebox.showinfo("완료", "식품 정보가 추가/수정되었습니다.")
else:
messagebox.showerror("오류", "모든 필드를 입력해주세요.")
add_window = tk.Toplevel(root)
add_window.title("식품 추가/수정")
center_window(add_window, 300, 200) # 창을 중앙에 배치
tk.Label(add_window, text="식품명:", font=("Arial", 10)).grid(row=0, column=0, padx=10, pady=5)
name_entry = ttk.Entry(add_window, font=("Arial", 10))
name_entry.grid(row=0, column=1, padx=10, pady=5)
tk.Label(add_window, text="소비기한:", font=("Arial", 10)).grid(row=1, column=0, padx=10, pady=5)
exp_date_entry = ttk.Entry(add_window, font=("Arial", 10))
exp_date_entry.grid(row=1, column=1, padx=10, pady=5)
tk.Label(add_window, text="보관방법:", font=("Arial", 10)).grid(row=2, column=0, padx=10, pady=5)
storage_entry = ttk.Entry(add_window, font=("Arial", 10))
storage_entry.grid(row=2, column=1, padx=10, pady=5)
ttk.Button(add_window, text="저장", command=save_new_food).grid(row=3, column=0, columnspan=2, pady=10)
# 메인 GUI 구성
root = tk.Tk()
root.title("유통기한 확인 프로그램")
center_window(root, 400, 300) # 창을 중앙에 배치
root.resizable(False, False)
# 스타일 설정
style = ttk.Style()
style.theme_use("clam") # 기본 테마 변경
style.configure("TButton", font=("Arial", 10), padding=5)
style.configure("TLabel", font=("Arial", 12))
style.configure("TEntry", font=("Arial", 12))
# 검색 창
frame_top = ttk.Frame(root, padding="10")
frame_top.pack(fill="x")
ttk.Label(frame_top, text="식품명 검색:", font=("Arial", 12)).pack(side="left", padx=5)
search_entry = ttk.Entry(frame_top, width=20)
search_entry.pack(side="left", padx=5)
ttk.Button(frame_top, text="검색", command=search_food).pack(side="left", padx=5)
# 결과 표시 창
frame_result = ttk.Frame(root, padding="10")
frame_result.pack(fill="both", expand=True)
result_label = ttk.Label(frame_result, text="검색 결과가 여기에 표시됩니다.", anchor="center")
result_label.pack(fill="both", expand=True)
# 하단 버튼 창
frame_bottom = ttk.Frame(root, padding="10")
frame_bottom.pack(fill="x")
ttk.Button(frame_bottom, text="식품 추가/수정", command=add_food).pack(side="left", padx=5)
ttk.Button(frame_bottom, text="저장", command=save_data).pack(side="left", padx=5)
# 메인 루프 실행
root.mainloop()
프로그램 창이 화면 중앙에 배치되도록 설계해, 사용자 경험을 개선했습니다. 가독성과 편리함을 고려한 세심한 기능입니다.
모든 변경 사항은 save_data() 함수를 통해 엑셀 파일에 저장됩니다. 데이터를 안전하게 보관하기 위해 pandas 라이브러리를 활용했습니다.
새로운 식품 정보를 추가하거나 기존 데이터를 수정할 수 있는 기능입니다. 데이터 입력 후, 엑셀 파일에 반영되며 사용자에게 완료 알림을 제공합니다.
Tkinter 위젯을 사용해 간단하지만 직관적인 인터페이스를 구성했습니다.
사용자가 식품명을 입력하고 검색 버튼을 눌러 정보를 확인할 수 있습니다.
검색 결과가 표시되는 영역입니다. 기본적으로 "검색 결과가 여기에 표시됩니다."라는 텍스트가 나타납니다.