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:

  1. Menampilkan data tinggi & berat badan terakhir yang sudah disimpan dari tabel data_diri.
  2. Menampilkan status BMI (Body Mass Index) secara otomatis.
  3. Menampilkan kategori BMI: Underweight, Normal, Overweight, atau Obese.
  4. 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 modul tkinter.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 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
    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 ttk

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)}")


    # 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

Popular posts from this blog

Isi Menu "Setting"

Isi Menu "Riwayat Aktivitas" (Bagian 2)