4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

そのコスメ、何年使っていますか?

コスメに消費期限あることご存知ですか?
女性が持っているリップの平均本数は約5本です。また、リップを所持している人の割合は、「6本以上」が最も多く54.7%、「3本」が14.2%という調査結果もあります。
リップだけでこの数、いつ買ったかなんて覚えていないですよね。

ちょっと待った!

化粧品の消費期限は、未開封の場合は一般的に3年、開封後は3ヶ月~1年程度が目安です。ただし、使用期限の目安は適切な保管環境でのため、直射日光や温度差のある場所で保管している場合は注意しましょうとのことです。

お決まりの「これいつ買ったっけ?」からの脱却

こういう時こそ、プログラミングの力で解決しましょう
CSVに記載され、毎回情報が見ること可能です。

ーー入力画面ーー

ーーcsv画面ーー

全体コードはこちら
python
import tkinter as tk
from tkinter import messagebox
import datetime
import csv
import os

# ((ここ変更))固定の保存パス
CSV_PATH = "〇〇"

# 使用期限カテゴリの設定(単位: 月)
CATEGORY_EXPIRY = {
    "リップ": 3,
    "スキンケア": 6,
    "アイシャドウ": 12,
    "ファンデーション": 9,
    "その他": 6
}

# 使用期限を管理するリスト
items = []

# 使用期限を計算する関数
def calculate_expiry(purchase_date, category):
    shelf_life_months = CATEGORY_EXPIRY.get(category, 6)  # デフォルトは6ヶ月
    purchase_date = datetime.datetime.strptime(purchase_date, "%Y-%m-%d")
    expiry_date = purchase_date + datetime.timedelta(days=shelf_life_months * 30)
    return expiry_date

# 保存ボタンの機能
def save_item():
    item_name = item_name_var.get()
    category = category_var.get()
    purchase_date = purchase_date_var.get()
    if not item_name or not purchase_date or not category:
        messagebox.showerror("エラー", "アイテム名、カテゴリ、購入日を入力してください!")
        return

    try:
        expiry_date = calculate_expiry(purchase_date, category)
        items.append((item_name, category, purchase_date, expiry_date))
        update_item_display()
        item_name_var.set("")
        purchase_date_var.set("")
        messagebox.showinfo("保存完了", f"{item_name} ({category}) の使用期限は {expiry_date.date()} です!")
    except ValueError:
        messagebox.showerror("エラー", "日付はYYYY-MM-DD形式で入力してください!")

# リストを更新して表示
def update_item_display():
    item_list.delete("1.0", tk.END)
    today = datetime.datetime.now()
    for item_name, category, purchase_date, expiry_date in items:
        status = "正常"
        if expiry_date < today:
            status = "期限切れ"
        elif (expiry_date - today).days <= 30:
            status = "期限間近"

        item_list.insert(
            tk.END,
            f"{item_name} ({category}) - 購入日: {purchase_date}, 使用期限: {expiry_date.date()} ({status})\n"
        )

# CSVエクスポート機能
def export_to_csv():
    try:
        os.makedirs(os.path.dirname(CSV_PATH), exist_ok=True)
        with open(CSV_PATH, mode="w", newline="", encoding="utf-8") as file:
            writer = csv.writer(file)
            writer.writerow(["アイテム名", "カテゴリ", "購入日", "使用期限"])
            for item_name, category, purchase_date, expiry_date in items:
                writer.writerow([item_name, category, purchase_date, expiry_date.date()])
        messagebox.showinfo("エクスポート完了", f"データが保存されました:\n{CSV_PATH}")
    except Exception as e:
        messagebox.showerror("エラー", f"エクスポート中にエラーが発生しました: {str(e)}")

# CSVインポート機能
def import_from_csv():
    global items
    if not os.path.exists(CSV_PATH):
        try:
            os.makedirs(os.path.dirname(CSV_PATH), exist_ok=True)
            with open(CSV_PATH, mode="w", newline="", encoding="utf-8") as file:
                writer = csv.writer(file)
                writer.writerow(["アイテム名", "カテゴリ", "購入日", "使用期限"])
        except Exception as e:
            messagebox.showerror("エラー", f"CSVファイルの作成中にエラーが発生しました: {str(e)}")
        return  # ファイルが新規作成された場合はスキップ

    try:
        with open(CSV_PATH, mode="r", encoding="utf-8") as file:
            reader = csv.reader(file)
            next(reader)  # ヘッダーをスキップ
            for row in reader:
                item_name, category, purchase_date, expiry_date = row
                expiry_date = datetime.datetime.strptime(expiry_date, "%Y-%m-%d")
                items.append((item_name, category, purchase_date, expiry_date))
        update_item_display()
    except Exception as e:
        messagebox.showerror("エラー", f"データの読み込み中にエラーが発生しました: {str(e)}")

# GUI作成
root = tk.Tk()
root.title("メイク使用期限管理")
root.geometry("600x500")

# 入力フィールド
item_name_var = tk.StringVar()
purchase_date_var = tk.StringVar()
category_var = tk.StringVar()

tk.Label(root, text="メイクアイテム名:").pack(pady=5)
tk.Entry(root, textvariable=item_name_var, width=30).pack(pady=5)

tk.Label(root, text="カテゴリ:").pack(pady=5)
tk.OptionMenu(root, category_var, *CATEGORY_EXPIRY.keys()).pack(pady=5)

tk.Label(root, text="購入日 (YYYY-MM-DD):").pack(pady=5)
tk.Entry(root, textvariable=purchase_date_var, width=30).pack(pady=5)

tk.Button(root, text="保存", command=save_item).pack(pady=10)

# リスト表示
tk.Label(root, text="メイクアイテムリスト:").pack(pady=5)
item_list = tk.Text(root, height=15, width=60)
item_list.pack(pady=5)

# エクスポートボタン
tk.Button(root, text="CSVエクスポート", command=export_to_csv).pack(pady=5)

# データ読み込み
import_from_csv()

# メインループ
root.mainloop()



使用期限カテゴリの設定

以下で修正できます。デフォルトは6にしています

 # 使用期限カテゴリの設定(単位: 月)
CATEGORY_EXPIRY = {
    "リップ": 3,
    "スキンケア": 6,
    "アイシャドウ": 12,
    "ファンデーション": 9,
    "その他": 6
}

最後に

肌荒れの元です⚠️
毎日使用するものだからこそ、管理しましょう
女性プログラマーの女子力がもっともっと上がりますように✨

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?