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:
- Fungsi
show_sub_menu_cari_data_gizisaya simpan di filesub_menu_cari_data_gizi.pysupaya rapi. - Pastikan file tersebut ada di folder yang sama dengan
menu_data_bahan_makanan.py. - 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
Post a Comment