Konten Sub Menu "Cari Bahan Berdasarkan Gizi"

 Isi Menu "Data Bahan Makanan"

(Konten Sub Menu "Cari Bahan Berdasarkan Gizi")

2. Sub Menu  “Cari Bahan Berdasarkan Gizi"

Sekarang kita masuk ke Menu Data Bahan Makanan, kita lanjut membuat konten Sub Menu  "Cari Bahan Berdasarkan Gizi"

Oke, berarti kita akan bikin sub menu "Cari Bahan Berdasarkan Gizi" di aplikasi kamu.
Saya bayangkan tampilannya seperti ini:

  • Header: Judul “Cari Bahan Berdasarkan Gizi”
  • Form Input:
    • Dropdown (atau entry) untuk memilih kriteria gizi: Kalori, Protein, Lemak, Karbohidrat
    • Input angka nilai minimal dan nilai maksimal
    • Tombol Cari untuk menampilkan hasil
  • Tabel Hasil: Menampilkan bahan makanan yang memenuhi kriteria
  • Tombol Kembali: Balik ke menu sebelumnya

Kalau setuju, saya bisa buatkan kodenya seperti ini supaya langsung jalan:

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import os

DATABASE_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/data_bahan_makanan.db"

def cari_data_gizi(kriteria, min_val, max_val):
    conn = sqlite3.connect(DATABASE_PATH)
    c = conn.cursor()
    query = f"SELECT nama, kalori, protein, lemak, karbohidrat, vitamin FROM bahan_makanan WHERE {kriteria} BETWEEN ? AND ?"
    c.execute(query, (min_val, max_val))
    hasil = c.fetchall()
    conn.close()
    return hasil

def show_sub_menu_cari_data_gizi(root_frame):
    from menu_data_bahan_makanan import show_menu_data_bahan_makanan

    for widget in root_frame.winfo_children():
        widget.destroy()

    # === HEADER ===
    tk.Label(root_frame, text="Cari Bahan Berdasarkan Gizi",
             font=("Arial", 18, "bold"), bg="blue", fg="white", pady=8).pack(fill="x")

    # === FORM ===
    form_frame = tk.Frame(root_frame, pady=10)
    form_frame.pack()

    tk.Label(form_frame, text="Pilih Kriteria:", font=("Arial", 12)).grid(row=0, column=0, padx=5, pady=5)
    kriteria_var = tk.StringVar(value="kalori")
    kriteria_cb = ttk.Combobox(form_frame, textvariable=kriteria_var, values=["kalori", "protein", "lemak", "karbohidrat", "vitamin"], state="readonly")
    kriteria_cb.grid(row=0, column=1, padx=5, pady=5)

    tk.Label(form_frame, text="Nilai Minimal:", font=("Arial", 12)).grid(row=1, column=0, padx=5, pady=5)
    min_var = tk.DoubleVar(value=0)
    min_entry = tk.Entry(form_frame, textvariable=min_var)
    min_entry.grid(row=1, column=1, padx=5, pady=5)

    tk.Label(form_frame, text="Nilai Maksimal:", font=("Arial", 12)).grid(row=2, column=0, padx=5, pady=5)
    max_var = tk.DoubleVar(value=1000)
    max_entry = tk.Entry(form_frame, textvariable=max_var)
    max_entry.grid(row=2, column=1, padx=5, pady=5)

    # === HASIL PENCARIAN ===
    kolom = ("Nama", "Kalori (kkal)", "Protein (g)", "Lemak (g)", "Karbohidrat (g)", "Vitamin")
    tree = ttk.Treeview(root_frame, columns=kolom, show="headings")
    for col in kolom:
        tree.heading(col, text=col)
        tree.column(col, anchor="center", width=150)
    tree.pack(fill="both", expand=True, padx=10, pady=10)

    # === TOMBOL CARI ===
    def aksi_cari():
        try:
            min_val = float(min_var.get())
            max_val = float(max_var.get())
        except ValueError:
            messagebox.showerror("Error", "Nilai minimal/maksimal harus angka.")
            return
        hasil = cari_data_gizi(kriteria_var.get(), min_val, max_val)
        for row in tree.get_children():
            tree.delete(row)
        if not hasil:
            messagebox.showinfo("Hasil", "Tidak ada bahan yang sesuai kriteria.")
        else:
            for item in hasil:
                tree.insert("", "end", values=item)

    tk.Button(form_frame, text="Cari", bg="green", fg="white", width=15, command=aksi_cari).grid(row=3, column=0, columnspan=2, pady=10)

    # === FOOTER ===
    tk.Button(root_frame, text="Kembali ke Menu Data Bahan Makanan",
              font=("Arial", 14), bg="gray", fg="white", width=35, height=2,
              command=lambda: show_menu_data_bahan_makanan(root_frame)).pack(pady=5)

Kalau kita integrasikan ke menu utama, nanti cukup panggil:

show_sub_menu_cari_data_gizi(root_frame)

ketika user pilih menu “Cari Bahan Berdasarkan Gizi”.

Kalau mau, saya bisa langsung buatkan integrasi penuh ke menu_data_bahan_makanan.py supaya sub menu ini muncul di pilihan menu.
Mau saya buatkan integrasinya sekarang?


Bagaimana dengan perubahan kode pada isi file "menu_data_bahan_makanan.py"

Kalau kita mau menambahkan Sub Menu "Cari Bahan Berdasarkan Gizi" ke aplikasi kamu, maka file menu_data_bahan_makanan.py perlu ditambah 1 tombol lagi yang memanggil fungsi show_sub_menu_cari_data_gizi() yang sudah kita buat tadi.

Kurang lebih revisinya seperti ini:

import tkinter as tk
from sub_menu_lihat_daftar_bahan import show_sub_menu_lihat_daftar_bahan
from sub_menu_cari_data_gizi import show_sub_menu_cari_data_gizi  # ← Tambah import

def show_menu_data_bahan_makanan(root_frame):
    for widget in root_frame.winfo_children():
        widget.destroy()

    tk.Label(root_frame, text="Menu Data Bahan Makanan",
             font=("Arial", 18, "bold"), bg="blue", fg="white", pady=8).pack(fill="x")

    menu_frame = tk.Frame(root_frame, pady=20)
    menu_frame.pack()

    # Tombol Lihat Daftar Bahan
    tk.Button(menu_frame, text="Lihat Daftar Bahan",
              font=("Arial", 14), bg="green", fg="white", width=30, height=2,
              command=lambda: show_sub_menu_lihat_daftar_bahan(root_frame)).pack(pady=10)

    # Tombol Cari Bahan Berdasarkan Gizi
    tk.Button(menu_frame, text="Cari Bahan Berdasarkan Gizi",
              font=("Arial", 14), bg="orange", fg="white", width=30, height=2,
              command=lambda: show_sub_menu_cari_data_gizi(root_frame)).pack(pady=10)

    # Tombol Kembali ke menu utama
    from main_menu import show_main_menu
    tk.Button(menu_frame, text="Kembali ke Menu Utama",
              font=("Arial", 14), bg="gray", fg="white", width=30, height=2,
              command=lambda: show_main_menu(root_frame)).pack(pady=10)

📌 Catatan:

  1. Fungsi show_sub_menu_cari_data_gizi saya simpan di file sub_menu_cari_data_gizi.py supaya rapi.
  2. Pastikan file tersebut ada di folder yang sama dengan menu_data_bahan_makanan.py.
  3. Kalau di Android (Termux + Pydroid), path database dan import file harus disesuaikan.

Kalau mau, saya bisa langsung buatkan sub_menu_cari_data_gizi.py dan revisi menu_data_bahan_makanan.py yang sudah siap jalan tanpa perlu utak-atik lagi.
Mau saya buat langsung?


Sampai saat ini perubahan, penyempurnaan, dan tambahan file pada applikasi SmartNutriChefAI adalah:

1. menu_data_bahan_makanan.py

Kode programnya adalah berikut:


# Menu Data Bahan Makanan

import tkinter as tk

from DataBahanMakanan.sub_menu_lihat_daftar_bahan import show_sub_menu_lihat_daftar_bahan

from DataBahanMakanan.sub_menu_cari_data_gizi import show_sub_menu_cari_data_gizi


def show_menu_data_bahan_makanan(root_frame):

    # Hapus semua widget yang ada

    for widget in root_frame.winfo_children():

        widget.destroy()


    # Judul menu

    tk.Label(root_frame, text="Data Bahan Makanan", font=("Arial", 18, "bold"),

             bg="green", fg="white", pady=10).pack(pady=20)


    # Tombol ke sub menu "Lihat Daftar Bahan"

    tk.Button(root_frame, text="Lihat Daftar Bahan", font=("Arial", 14),

              bg="#4CAF50", fg="white", width=25, height=2,

              command=lambda: show_sub_menu_lihat_daftar_bahan(root_frame)).pack(pady=10)

              

    tk.Button(root_frame, text="Cari Data Gizi", font=("Arial", 14),

              bg="#4CAF50", fg="white", width=25, height=2,

              command=lambda: show_sub_menu_cari_data_gizi(root_frame)).pack(pady=10)           


    # Import dari menu_utama.py

    from menu_utama import tampilkan_halaman_utama


    # Tombol kembali ke menu utama

    tk.Button(root_frame, text="Kembali Ke Menu Utama", font=("Arial", 14),

              bg="gray", fg="white", width=25, height=2,

              command=lambda: tampilkan_halaman_utama(root_frame)).pack(pady=20)


2. sub_menu_cari_data_gizi.py

Kode programnya adalah berikut:


# Sub Menu Cari Data Gizi

import tkinter as tk

from tkinter import ttk, messagebox

import sqlite3

import os


DATABASE_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/data_bahan_makanan.db"


def cari_data_gizi(kriteria, min_val, max_val):

    conn = sqlite3.connect(DATABASE_PATH)

    c = conn.cursor()

    query = f"SELECT nama, kalori, protein, lemak, karbohidrat, vitamin FROM bahan_makanan WHERE {kriteria} BETWEEN ? AND ?"

    c.execute(query, (min_val, max_val))

    hasil = c.fetchall()

    conn.close()

    return hasil


def show_sub_menu_cari_data_gizi(root_frame):

    from menu_data_bahan_makanan import show_menu_data_bahan_makanan


    for widget in root_frame.winfo_children():

        widget.destroy()


    # === HEADER ===

    tk.Label(root_frame, text="Bahan Berdasarkan Gizi",

             font=("Arial", 17, "bold"), bg="blue", fg="white", pady=8).pack(fill="x")


    # === FORM ===

    form_frame = tk.Frame(root_frame, pady=10)

    form_frame.pack()


    tk.Label(form_frame, text="Pilih Kriteria:", font=("Arial", 12)).grid(row=0, column=0, padx=5, pady=5)

    kriteria_var = tk.StringVar(value="kalori")

    kriteria_cb = ttk.Combobox(form_frame, textvariable=kriteria_var, values=["kalori", "protein", "lemak", "karbohidrat", "vitamin"], state="readonly")

    kriteria_cb.grid(row=0, column=1, padx=5, pady=5)


    tk.Label(form_frame, text="Nilai Minimal:", font=("Arial", 12)).grid(row=1, column=0, padx=5, pady=5)

    min_var = tk.DoubleVar(value=0)

    min_entry = tk.Entry(form_frame, textvariable=min_var)

    min_entry.grid(row=1, column=1, padx=5, pady=5)


    tk.Label(form_frame, text="Nilai Maksimal:", font=("Arial", 12)).grid(row=2, column=0, padx=5, pady=5)

    max_var = tk.DoubleVar(value=1000)

    max_entry = tk.Entry(form_frame, textvariable=max_var)

    max_entry.grid(row=2, column=1, padx=5, pady=5)


    # === HASIL PENCARIAN ===

    kolom = ("Nama", "Kalori (kkal)", "Protein (g)", "Lemak (g)", "Karbohidrat (g)", "Vitamin")

    tree = ttk.Treeview(root_frame, columns=kolom, show="headings")

    for col in kolom:

        tree.heading(col, text=col)

        tree.column(col, anchor="center", width=150)

    tree.pack(fill="both", expand=True, padx=10, pady=10)


    # === TOMBOL CARI ===

    def aksi_cari():

        try:

            min_val = float(min_var.get())

            max_val = float(max_var.get())

        except ValueError:

            messagebox.showerror("Error", "Nilai minimal/maksimal harus angka.")

            return

        hasil = cari_data_gizi(kriteria_var.get(), min_val, max_val)

        for row in tree.get_children():

            tree.delete(row)

        if not hasil:

            messagebox.showinfo("Hasil", "Tidak ada bahan yang sesuai kriteria.")

        else:

            for item in hasil:

                tree.insert("", "end", values=item)


    tk.Button(form_frame, text="Cari", font=("Arial", 12), bg="green", fg="white", width=15, command=aksi_cari).grid(row=3, column=0, columnspan=2, pady=10)


    # === FOOTER ===

    tk.Button(root_frame, text="Kembali",

              font=("Arial", 14), bg="gray", fg="white", width=35, height=2,

              command=lambda: show_menu_data_bahan_makanan(root_frame)).pack(pady=5)


Bersambung Ke:  Tambahan Sub Menu Lainnya Pada "Menu Data Bahan Makanan"


Comments

Popular posts from this blog

Isi Menu "Setting"

Isi Menu "Riwayat Aktivitas" (Bagian 2)