Konten Sub Menu "Berat & Tinggi Badan"
Isi Menu "Profil Kesehatan"
(Konten Sub Menu "Berat & Tinggi Badan")
2. Sub Menu "Berat & Tinggi Badan"
Lanjut kita membuat konten Sub Menu "Berat & Tinggi Badan"
Baik! Kita lanjut membuat Sub Menu "Berat & Tinggi Badan" sebagai bagian dari menu Profil Kesehatan.
🎯 Tujuan Sub Menu "Berat & Tinggi Badan"
Menu ini akan:
- Menampilkan data tinggi & berat badan terakhir yang sudah disimpan dari tabel
data_diri. - Menampilkan status BMI (Body Mass Index) secara otomatis.
- Menampilkan kategori BMI: Underweight, Normal, Overweight, atau Obese.
- Tombol kembali ke menu Profil Kesehatan.
✅ STRUKTUR UI:
- Judul
- Info Berat Badan dan Tinggi Badan
- Info BMI dan kategori
- Tombol kembali
🧠 Rumus BMI
BMI = berat (kg) / (tinggi (m) * tinggi (m))
✅ File: sub_menu_berat_tinggi_badan.py
import tkinter as tk
from tkinter import messagebox
import sqlite3
import os
DB_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/data_diri.db"
def show_sub_menu_berat_tinggi_badan(root_frame):
from menu_profil_kesehatan import show_menu_profil_kesehatan
for widget in root_frame.winfo_children():
widget.destroy()
tk.Label(root_frame, text="Berat & Tinggi Badan", font=("Arial", 18, "bold"),
bg="green", fg="orange", padx=10, pady=10).pack(pady=20)
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("SELECT berat, tinggi FROM data_diri ORDER BY id DESC LIMIT 1")
result = cursor.fetchone()
conn.close()
if result:
berat, tinggi_cm = result
tinggi_m = tinggi_cm / 100 # konversi ke meter
bmi = berat / (tinggi_m * tinggi_m)
kategori = hitung_kategori_bmi(bmi)
tk.Label(root_frame, text=f"Berat Badan: {berat} kg", font=("Arial", 12)).pack(pady=5)
tk.Label(root_frame, text=f"Tinggi Badan: {tinggi_cm} cm", font=("Arial", 12)).pack(pady=5)
tk.Label(root_frame, text=f"BMI Anda: {bmi:.2f}", font=("Arial", 12, "bold")).pack(pady=10)
tk.Label(root_frame, text=f"Kategori: {kategori}", font=("Arial", 12), fg="blue").pack(pady=5)
else:
tk.Label(root_frame, text="Data belum tersedia. Silakan isi Data Diri terlebih dahulu.",
font=("Arial", 12), fg="red").pack(pady=10)
except Exception as e:
messagebox.showerror("Error", f"Gagal mengambil data: {str(e)}")
# Tombol kembali
tk.Button(root_frame, text="Kembali", font=("Arial", 12),
bg="gray", fg="white", command=lambda: show_menu_profil_kesehatan(root_frame)).pack(pady=20)
def hitung_kategori_bmi(bmi):
if bmi < 18.5:
return "Kurus (Underweight)"
elif 18.5 <= bmi < 25:
return "Normal"
elif 25 <= bmi < 30:
return "Gemuk (Overweight)"
else:
return "Obesitas"
🔁 Navigasi dari menu_profil_kesehatan.py
Pastikan di file menu_profil_kesehatan.py, kamu sudah menambahkan tombol ini:
from sub_menu_berat_tinggi_badan import show_sub_menu_berat_tinggi_badan
tk.Button(
root_frame,
text="Berat & Tinggi Badan",
font=("Arial", 12),
bg="light blue",
fg="black",
command=lambda: show_sub_menu_berat_tinggi_badan(root_frame)
).pack(pady=10)
✅ Output Contoh
Jika data terakhir:
- Berat: 72 kg
- Tinggi: 170 cm
→ Maka BMI:24.91
→ Kategori:Normal
Siap untuk lanjut ke submenu berikutnya? Misalnya:
- Kalori Harian
- Aktivitas Fisik
- Riwayat Data BMI
- atau integrasi grafik BMI
Silakan beri arahan.
Pada kode isi file menu_profil_kesehatan.py berikut, bisakah kode dipersingkat pada bagian tombol tombol sub menu agar bisa ditambah tombol sub menu lainnya.
Kode:
# Menu Profil Kesehatan
import tkinter as tk
from sub_menu_data_diri import show_sub_menu_data_diri
from sub_menu_berat_tinggi_badan import show_sub_menu_berat_tinggi_badan
def show_menu_profil_kesehatan(root_frame):
from menu_utama import tampilkan_halaman_utama # Hindari circular import
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
label_judul = tk.Label(root_frame, text="Profil Kesehatan", font=("Arial", 18, "bold"), bg="green", fg="orange", padx=10, pady=10)
label_judul.pack(pady=20)
# Submenu tombol
tk.Button(
root_frame,
text="Data Diri",
font=("Arial", 12),
bg="light blue",
fg="black",
command=lambda: show_sub_menu_data_diri(root_frame)
).pack(pady=10)
# Bisa tambah lagi: ("Hitung BMI", func_lainnya), dll.
tk.Button(
root_frame,
text="Berat & Tinggi Badan",
font=("Arial", 12),
bg="light blue",
fg="black",
command=lambda: show_sub_menu_berat_tinggi_badan(root_frame)
).pack(pady=10)
# Tombol kembali
tk.Button(root_frame, text="Kembali ke Menu Utama", font=("Arial", 12), bg="gray", fg="white", command=lambda: tampilkan_halaman_utama(root_frame)).pack(pady=30)
Ya, tentu bisa! Kamu bisa memperpendek dan merapikan bagian tombol-tombol sub menu di menu_profil_kesehatan.py dengan menggunakan daftar (list) sub menu dan perulangan for. Ini membuat kode lebih rapi dan mudah ditambah submenu lainnya ke depannya.
✅ Berikut versi kode yang sudah disingkat dan modular:
# menu_profil_kesehatan.py import tkinter as tk from sub_menu_data_diri import show_sub_menu_data_diri from sub_menu_berat_tinggi_badan import show_sub_menu_berat_tinggi_badan def show_menu_profil_kesehatan(root_frame): from menu_utama import tampilkan_halaman_utama # Hindari circular import for widget in root_frame.winfo_children(): widget.destroy() # Judul tk.Label( root_frame, text="Profil Kesehatan", font=("Arial", 18, "bold"), bg="green", fg="orange", padx=10, pady=10 ).pack(pady=20) # Daftar submenu sebagai list tuple: (teks tombol, fungsi yang dipanggil) submenus = [ ("Data Diri", show_sub_menu_data_diri), ("Berat & Tinggi Badan", show_sub_menu_berat_tinggi_badan), # Tambahkan submenu lain di sini, contoh: # ("Kalori Harian", show_sub_menu_kalori_harian), # ("Riwayat BMI", show_sub_menu_riwayat_bmi), ] # Buat tombol-tombol sub menu for teks, fungsi in submenus: tk.Button( root_frame, text=teks, font=("Arial", 12), bg="light blue", fg="black", command=lambda f=fungsi: f(root_frame) ).pack(pady=10) # Tombol kembali tk.Button( root_frame, text="Kembali ke Menu Utama", font=("Arial", 12), bg="gray", fg="white", command=lambda: tampilkan_halaman_utama(root_frame) ).pack(pady=30)
✅ Kelebihan Pendekatan Ini:
-
Tambah submenu cukup tambah 1 baris saja di list
submenus:("Kalori Harian", show_sub_menu_kalori_harian) -
Kode tetap rapi dan tidak duplikatif.
Siap saya bantu untuk membuat sub menu berikutnya seperti:
- Kalori Harian
- Aktivitas Fisik
- Riwayat BMI
- Grafik Kesehatan
Silakan beri judul submenu berikutnya.
Bila ada dibuat jarak antar tombol, maka pakai perintah apa
dengan pakai separator
Baik! Kalau maksud kamu adalah memberi pemisah visual antar tombol tanpa menambah banyak jarak (
pady), maka kamu bisa gunakan ttk.Separator dari modultkinter.ttk.
✅ Berikut versi yang memakai separator antar tombol sub menu:
# menu_profil_kesehatan.py import tkinter as tk from tkinter import ttk from sub_menu_data_diri import show_sub_menu_data_diri from sub_menu_berat_tinggi_badan import show_sub_menu_berat_tinggi_badan def show_menu_profil_kesehatan(root_frame): from menu_utama import tampilkan_halaman_utama # Hindari circular import for widget in root_frame.winfo_children(): widget.destroy() # Judul label_judul = tk.Label( root_frame, text="Profil Kesehatan", font=("Arial", 18, "bold"), bg="green", fg="orange", padx=10, pady=10 ) label_judul.pack(pady=20) # Daftar sub menu submenu_items = [ ("Data Diri", show_sub_menu_data_diri), ("Berat & Tinggi Badan", show_sub_menu_berat_tinggi_badan), # Tambahkan sub menu lainnya di sini ] for i, (label, action) in enumerate(submenu_items): tk.Button( root_frame, text=label, font=("Arial", 12), bg="light blue", fg="black", width=30, command=lambda a=action: a(root_frame) ).pack(pady=(0, 5)) # Padding bawah kecil if i < len(submenu_items) - 1: # Tambahkan separator antar tombol (kecuali terakhir) ttk.Separator(root_frame, orient='horizontal').pack(fill='x', padx=40, pady=2) # Tombol kembali tk.Button( root_frame, text="Kembali ke Menu Utama", font=("Arial", 12), bg="gray", fg="white", width=30, command=lambda: tampilkan_halaman_utama(root_frame) ).pack(pady=30)
Hasil:
- Tombol-tombol sub menu tersusun rapi.
- Garis pemisah horizontal (
ttk.Separator) tampil di antara tombol sebagai visual separator. - Kode tetap ringkas dan scalable.
Kalau mau buat separator warna-warni atau dengan label, juga bisa. Mau seperti itu juga?
Sampai saat ini perubahan, penyempurnaan, dan tambahan file pada applikasi SmartNutriChefAI adalah:
1. menu_profil_kesehatan.py
Kode programnya adalah berikut:
# menu_profil_kesehatan.py
import tkinter as tkfrom tkinter import ttkfrom sub_menu_data_diri import show_sub_menu_data_diri
from sub_menu_berat_tinggi_badan import show_sub_menu_berat_tinggi_badan
def show_menu_profil_kesehatan(root_frame):
from menu_utama import tampilkan_halaman_utama # Hindari circular import
for widget in root_frame.winfo_children():
widget.destroy()
# Judul
tk.Label(
root_frame,
text="Profil Kesehatan",
font=("Arial", 18, "bold"),
bg="green",
fg="orange",
padx=10,
pady=10
).pack(pady=20)
# Daftar submenu sebagai list tuple: (teks tombol, fungsi yang dipanggil)
submenus = [
("Data Diri", show_sub_menu_data_diri),
("Berat & Tinggi Badan", show_sub_menu_berat_tinggi_badan),
# Tambahkan submenu lain di sini, contoh:
# ("Kalori Harian", show_sub_menu_kalori_harian),
# ("Riwayat BMI", show_sub_menu_riwayat_bmi),
]
# Buat tombol-tombol sub menu
for teks, fungsi in submenus:
tk.Button(
root_frame,
text=teks,
font=("Arial", 12),
bg="light blue",
fg="black",
command=lambda f=fungsi: f(root_frame)
).pack(pady=10) # Tambahkan separator antar tombol (kecuali terakhir)
ttk.Separator(root_frame, orient='horizontal').pack(fill='x', padx=40, pady=2)
# Tombol kembali
tk.Button(
root_frame,
text="Kembali ke Menu Utama",
font=("Arial", 12),
bg="gray",
fg="white",
command=lambda: tampilkan_halaman_utama(root_frame)
).pack(pady=30)
2. sub_menu_berat_tinggi_badan.py
Kode programnya adalah berikut:
import tkinter as tk
from tkinter import ttkfrom tkinter import messagebox
import sqlite3
import os
DB_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/Database/data_diri.db"
def show_sub_menu_berat_tinggi_badan(root_frame):
from menu_profil_kesehatan import show_menu_profil_kesehatan
for widget in root_frame.winfo_children():
widget.destroy()
tk.Label(root_frame, text="Berat & Tinggi Badan", font=("Arial", 18, "bold"),
bg="green", fg="orange", padx=10, pady=10).pack(pady=20)
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
cursor.execute("SELECT berat, tinggi FROM data_diri ORDER BY id DESC LIMIT 1")
result = cursor.fetchone()
conn.close()
if result:
berat, tinggi_cm = result
tinggi_m = tinggi_cm / 100 # konversi ke meter
bmi = berat / (tinggi_m * tinggi_m)
kategori = hitung_kategori_bmi(bmi)
tk.Label(root_frame, text=f"Berat Badan: {berat} kg", font=("Arial", 12)).pack(pady=5)
tk.Label(root_frame, text=f"Tinggi Badan: {tinggi_cm} cm", font=("Arial", 12)).pack(pady=5)
tk.Label(root_frame, text=f"BMI Anda: {bmi:.2f}", font=("Arial", 12, "bold")).pack(pady=10)
tk.Label(root_frame, text=f"Kategori: {kategori}", font=("Arial", 12), fg="blue").pack(pady=5)
else:
tk.Label(root_frame, text="Data belum tersedia. Silakan isi Data Diri terlebih dahulu.",
font=("Arial", 12), fg="red").pack(pady=10)
except Exception as e:
messagebox.showerror("Error", f"Gagal mengambil data: {str(e)}")
# Tambahkan separator antar tombol (kecuali terakhir) ttk.Separator(root_frame, orient='horizontal').pack(fill='x', padx=40, pady=2)
# Tombol kembali
tk.Button(root_frame, text="Kembali", font=("Arial", 12),
bg="gray", fg="white", command=lambda: show_menu_profil_kesehatan(root_frame)).pack(pady=20)
def hitung_kategori_bmi(bmi):
if bmi < 18.5:
return "Kurus (Underweight)"
elif 18.5 <= bmi < 25:
return "Normal"
elif 25 <= bmi < 30:
return "Gemuk (Overweight)"
else:
return "Obesitas"
Bersambung Ke: Konten Sub Menu "Indeks Massa Tubuh (IMT)"
Comments
Post a Comment