SPLASH_SCREEN AWAL MEMULAI MEMBUAT APPLIKASI BERBASIS PYTHON

 " SPLASH_SCREEN" AWAL MEMULAI MEMBUAT APLIKASI BERBASIS PYTHON


Ada banyak jenis penulisan kode program untuk membuat sebuah file "splash_screen.py" dalam memulai sebuah proyek membuat sebuah aplikasi berbasis bahasa pemrograman python.

Aplikasi yang digunakan dalam penulisan kode python di HP adalah Pydroid3, bisa di download di sini Pydroid3.

Sedangkan menggunakan Laptop/komputer untuk program python ada di sini: Python versi terakhir.

memulai sebuah pembuatan applikasi dengan program python adalah membuat file "splash_screen.py", sebagai contoh membuat applikasi SmartNutriChefAI, seperti:

1. splash_screen konvensional.

Di dalam HP atau Lattop/komputer, buatlah sebuah folder tempat menyimpan file splash_screen.py. Bila di HP ada path: /storage/emulated/0/nama_folder_Anda/...

Lalu 

- Buat sebuah gambar dan beri nama gambar (logo.png), lalu simpan di dalam folder yang Anda buat tersebut.

- Di dalam folder tersebut, Buat sebuah file bernama "splash_screen.py" yang berisi kode program, contoh  kode programnya, berikut ini:


# splash_screen.py

impor tkinter sebagai tk

dari tkinter impor ttk

dari PIL impor Gambar, ImageTk


# Fungsi untuk membuka halaman utama

def buka_halaman_utama():

    splash.hancurkan()

    tampilkan_halaman_utama()


# Fungsi utama GUI aplikasi

def tampilkan_halaman_utama():

    akar = tk.Tk()

    root.title("SmartNutriChefAI - Menu Utama")

    akar.geometri("360x640")

    root.konfigurasi(bg="#f0fff0")


    # Judul

    label = ttk.Label(root, text="Selamat datang di\nSmartNutriChefAI", font=("Arial", 18, "bold"), background="#f0fff0")

    label.pack(pady=20)


    # Menampilkan logo

    mencoba:

        logo_path = "/storage/emulated/0/AppJadi/SmartNutriChefAI/logo.png"

        gambar = Gambar.buka(jalur_logo)

        gambar = gambar.ubah ukuran((100, 100))

        foto = ImageTk.PhotoImage(gambar)


        logo_label = tk.Label(root, gambar=foto, bg="#f0fff0")

        logo_label.image = foto # menyimpan referensi

        logo_label.pack(pady=10)

    kecuali Pengecualian sebagai e:

        print("Gagal memuat logo :",e)


    # Teks deskripsi

    deskripsi = tk.Label(root, text="AI untuk saran resep sehat\nberbasis nutrisi Anda", font=("Arial", 12), bg="#f0fff0", fg="#333", justify="center")

    deskripsi.pack(pady=20)


    # Tombol "Mulai Sekarang"

    btn_mulai = tk.Button(root, text="Mulai Sekarang", font=("Arial", 14), bg="#4CAF50", fg="white", lebar=25, tinggi=2, command=root.destroy)

    btn_mulai.pack(sisi=”bawah”, pady=30)


    root.mainloop()


# Layar Percikan

percikan = tk.Tk()

splash.title("SmartNutriChefAI - Memuat...")

percikan.geometri("500x300")

splash.configure(bg="#4CAF50")


label = ttk.Label(splash, text="SmartNutriChefAI", font=("Helvetica", 24, "tebal"), latar depan="putih", latar belakang="#4CAF50")

label.tempat(relx=0.5, mengandalkan=0.5, jangkar="tengah")


#Tampilkan splash selama 3 detik

splash.after(3000, buka_halaman_utama)

splash.mainloop()


Kode final ini sudah sangat siap digunakan sebagai struktur awal aplikasi SmartNutriChefAI.
Tampilannya sudah  mobile-friendly , profesional , dan alurnya jelas . S
etelah menekan tombol "Mulai Sekarang" pindah ke halaman input profil atau menu utama.

Tahap selanjutnya, 

Buat sebuah file bernama menu_utama.py, lalu simpan sejajar dengan file splash_screen.py di dalam folder tersebut. Isi file ini  berisi kode program, contoh kode programnya, berikut  ini:


# splash_screen.py

impor tkinter sebagai tk

dari tkinter impor ttk

dari PIL impor Gambar, ImageTk

dari menu_utama import tampilkan_halaman_utama


# Tahap 2: Splash dengan gambar & tombol

def tampilkan_splash_dengan_logo():

    splash2 = tk.Tk()

    splash2.title("SmartNutriChefAI")

    splash2.geometry("690x1390")

    splash2.konfigurasi(bg="#f0fff0")


    label = ttk.Label(splash2, text="Selamat datang di\nSmartNutriChefAI", font=("Arial", 18, "bold"), background="#f0fff0")

    label.pack(pady=20)


    # Gambar logo

    mencoba:

        logo_path = "/storage/emulated/0/AppJadi/SmartNutriChefAI/logo.png"

        gambar = Gambar.buka(jalur_logo)

        gambar = gambar.ubah ukuran((350, 400))

        foto = ImageTk.PhotoImage(gambar)


        logo_label = tk.Label(splash2, gambar=foto, bg="#f0fff0")

        logo_label.image = foto # Simpan referensi

        logo_label.pack(pady=10)

    kecuali Pengecualian sebagai e:

        print("Gagal memuat logo :",e)


    # Deskripsi

    deskripsi = tk.Label(

        percikan2,

        text="AI untuk saran resep sehat\nberbasis nutrisi Anda",

        huruf=("Arial", 12),

        bg="#f0fff0",

        fg="#333",

        ratakan="tengah"

    )

    deskripsi.pack(pady=20)


    # Tombol "Mulai Sekarang"

    def mulai_aplikasi():

        splash2.hancurkan()

        buka_menu_utama()


    btn_mulai = tk.Button(

        percikan2,

        text="Mulai Sekarang",

        huruf=("Arial", 14),

        bg="#4CAF50",

        fg="putih",

        lebar=25,

        tinggi=2,

        command=mulai_aplikasi

    )

    btn_mulai.pack(sisi=”bawah”, pady=30)


    splash2.mainloop()


# Tahap 3: Buka halaman menu utama

def buka_menu_utama():

    akar = tk.Tk()

    root.title("SmartNutriChefAI - Menu Utama")

    akar.geometri("690x1390")

    root.konfigurasi(bg="#f0fff0")


    rangka_utama = tk.Rangka(akar)

    main_frame.pack(isi="keduanya", perluas=Benar)


    tampilkan_halaman_utama(main_frame)


    root.mainloop()


# Tahap 1: Splash memuat awal 3 detik

def tampilkan_splash_awal():

    percikan = tk.Tk()

    splash.title("SmartNutriChefAI - Memuat...")

    percikan.geometri("670x1370")

    splash.configure(bg="#4CAF50")


    label = ttk.Label(

        memercikkan,

        teks="SmartNutriChefAI",

        font=("Helvetica", 22, "tebal"),

        latar depan="putih",

        latar belakang="#4CAF50"

    )

    label.tempat(relx=0.5, mengandalkan=0.5, jangkar="tengah")


    # Setelah 3 detik, tutup splash dan buka splash dengan logo

    splash.after(3000, lambda: [splash.destroy(), tampilkan_splash_dengan_logo()])

    splash.mainloop()


jika __nama__ == "__utama__":

    tampilkan_splash_awal()


Setelah tampil splash screen & halaman utama, ketika tombol "Mulai Sekarang" ditekan maka akan masuk ke halaman Menu dari applikasi ini, (kode isi file menu_utama.py harus Anda buat sendiri)


2. splash_screen modern.

Ini membuat splash_screen terbaru  yang alurnya rapi dari Splash → Menu Utama → Sub Menu, dst.

Ini file  splash_screen.py terbaru yang rapi → menampilkan layar pembuka beberapa detik lalu otomatis berpindah ke menu utama .


📌splash_screen.py

import tkinter as tk
from menu_utama import tampilkan_halaman_utama

def show_splash_screen():
    """Tampilkan splash screen lalu alihkan ke menu utama"""
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("500x350")
    splash.configure(bg="white")

    # Logo / Judul aplikasi
    tk.Label(
        splash,
        text="SmartNutriChefAI",
        font=("Arial", 22, "bold"),
        fg="#4CAF50",
        bg="white"
    ).pack(expand=True, pady=30)

    # Sub-judul
    tk.Label(
        splash,
        text="by SR Pakpahan",
        font=("Arial", 12),
        fg="gray",
        bg="white"
    ).pack(pady=10)

    # Progress info
    tk.Label(
        splash,
        text="Loading...",
        font=("Arial", 11),
        fg="black",
        bg="white"
    ).pack(side="bottom", pady=20)

    # Setelah 2.5 detik → buka menu utama
    splash.after(2500, lambda: open_main_menu(splash))
    splash.mainloop()


def open_main_menu(splash_root):
    """Tutup splash screen, buka menu utama"""
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")

    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

🔑 Catatan

  • Splash → Menu Utama otomatis setelah 2500 ms (2,5 detik).
    → Bisa disesuaikan ( splash.after(3000, ...)kalau mau 3 detik).
  • Judul, warna, teks bisa kamu ganti sesuai branding.
  • tampilkan_halaman_utamadipanggil dari menu_utama.py→ jadi konsistensi alurnya:

👉 Splash → Menu Utama → Sub Menu (misal Metode Formula MMAG, dll).



3. Splash screen dengan progres bar animasi

Berikut  versi  GUI dengan progres bar animasi  di splash screen biar lebih keren (daripada hanya teks "Loading...")

Kita upgrade splash screen biar lebih keren dengan progresif bar animasi 🎉
Pakai ttk.Progressbarsupaya loading terasa lebih “hidup” sebelum pindah ke Menu Utama .


📌 splash_screen.py(versi dengan bilah kemajuan animasi)

import tkinter as tk
from tkinter import ttk
from menu_utama import tampilkan_halaman_utama

def show_splash_screen():
    """Tampilkan splash screen dengan progress bar animasi"""
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("500x350")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Judul aplikasi
    tk.Label(
        splash,
        text="SmartNutriChefAI",
        font=("Arial", 22, "bold"),
        fg="#4CAF50",
        bg="white"
    ).pack(expand=True, pady=30)

    # Sub-judul
    tk.Label(
        splash,
        text="by SR Pakpahan",
        font=("Arial", 12),
        fg="gray",
        bg="white"
    ).pack(pady=10)

    # Progress label
    progress_label = tk.Label(
        splash,
        text="Loading...",
        font=("Arial", 11),
        fg="black",
        bg="white"
    )
    progress_label.pack(pady=10)

    # Progress bar
    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="determinate"
    )
    progress.pack(pady=20)

    # Animasi progress bar
    def animate_progress(value=0):
        if value <= 100:
            progress["value"] = value
            splash.after(30, lambda: animate_progress(value + 2))
        else:
            open_main_menu(splash)

    animate_progress()  # mulai animasi
    splash.mainloop()


def open_main_menu(splash_root):
    """Tutup splash screen, buka menu utama"""
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

🔑 Catatan

  • Bilah kemajuan naik dari 0 → 100dengan interval 30 ms.
    → Total durasi sekitar 3 detik. Bisa diubah di splash.after(30, ...)atau nilai kenaikan +2.
  • Setelah selesai ( value > 100), otomatis buka menu utama .
  • Bisa diganti modeindeterminate kalau mau animasi bolak-balik, tapi biasanya progres “naik penuh” lebih enak dilihat.


4. splash screen dengan  logo gambar (PNG/JPG) 

Berikut versi dengan  logo gambar (PNG/JPG)  di splash screen biar lebih branding, bukan hanya teks.

Kita bikin splash screen yang lebih profesional dengan gambar logo (PNG/JPG) ditampilkan di atas teks + bilah kemajuan.

Supaya lebih fleksibel, kita pakai PIL (Pillow)untuk mengubah ukuran logo otomatis biar pas.


📌 splash_screen.py(versi dengan gambar logo)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pastikan pillow sudah terinstall
from menu_utama import tampilkan_halaman_utama

# Path logo (ganti sesuai lokasi file logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    """Tampilkan splash screen dengan logo + progress bar animasi"""
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)  # resize biar pas
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img  # biar tidak di-garbage-collect
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash,
        text="SmartNutriChefAI",
        font=("Arial", 22, "bold"),
        fg="#4CAF50",
        bg="white"
    ).pack(pady=5)

    # Subjudul
    tk.Label(
        splash,
        text="by SR Pakpahan",
        font=("Arial", 12),
        fg="gray",
        bg="white"
    ).pack(pady=5)

    # Progress label
    progress_label = tk.Label(
        splash,
        text="Loading...",
        font=("Arial", 11),
        fg="black",
        bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar ===
    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="determinate"
    )
    progress.pack(pady=20)

    # === Animasi progress bar ===
    def animate_progress(value=0):
        if value <= 100:
            progress["value"] = value
            splash.after(30, lambda: animate_progress(value + 2))
        else:
            open_main_menu(splash)

    animate_progress()
    splash.mainloop()


def open_main_menu(splash_root):
    """Tutup splash screen, buka menu utama"""
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

🔑 Catatan

  1. Simpan logo di path:
    /storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png
    
    (atau ganti LOGO_PATHsesuai lokasi logo kamu).
  2. Ukuran logo otomatis di-resize menjadi 150x150 px
  3. Kalau file logo tidak ditemukan, splash screen tetap jalan dengan teks error [Logo not found].


5. splash screen dengan animasi fade-in

Berikut versi animasi fade-in (transparansi bertahap) untuk splash screen ini biar makin modern.

Kita upgrade splash screen dengan animasi fade-in (transparansi bertahap) biar tampilannya lebih modern dan smooth.

Di Tkinter, efek fade-in bisa dibuat dengan mengubah nilai -alpha(opacity window) dari 0.0 → 1.0 secara bertahap.


📌 splash_screen.py(logo versi + bilah kemajuan + fade-in)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pastikan pillow sudah terinstall
from menu_utama import tampilkan_halaman_utama

# Path logo (ganti sesuai lokasi file logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    """Tampilkan splash screen dengan logo, fade-in, dan progress bar"""
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Set transparansi awal (0 = full transparan)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    progress_label = tk.Label(
        splash, text="Loading...",
        font=("Arial", 11), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar ===
    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="determinate"
    )
    progress.pack(pady=20)

    # === Animasi fade-in ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()  # mulai fade-in

    # === Animasi progress bar ===
    def animate_progress(value=0):
        if value <= 100:
            progress["value"] = value
            splash.after(30, lambda: animate_progress(value + 2))
        else:
            open_main_menu(splash)

    animate_progress()
    splash.mainloop()


def open_main_menu(splash_root):
    """Tutup splash screen, buka menu utama"""
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

🔑 Perubahan Utama

  1. Tambah splash.attributes("-alpha", 0.0)→ supaya splash mulai dari transparan.
  2. Fungsi fade_in()→ menaikkan opacity 0.0 → 1.0secara bertahap dengan after().
  3. Efek fade-in berjalan bersamaan dengan progres bar.


6. Splash screen dengan efek fade-out transisi 

Kalau mau lebih keren lagi, kita bisa membuat efek fade-out saat splash menutup sebelum masuk ke menu utama.
Kita tambahkan juga efek fade-out transisi biar makin mulus.

Kita upgrade lagi splash screen biar ada fade-in → progres → fade-out → menu utama

Triknya sama: kita pakai splash.attributes("-alpha", value)tapi kali ini diturunkan dari 1.0 ke 0.0 sebelum buka menu utama.


📌 splash_screen.py(Fade-in + Progress + Fade-out)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai file logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    progress_label = tk.Label(
        splash, text="Loading...",
        font=("Arial", 11), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar ===
    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="determinate"
    )
    progress.pack(pady=20)

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # === Animasi progress bar ===
    def animate_progress(value=0):
        if value <= 100:
            progress["value"] = value
            splash.after(30, lambda: animate_progress(value + 2))
        else:
            fade_out()  # setelah selesai → fade out

    animate_progress()

    # === Fade-out animasi ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            open_main_menu(splash)

    splash.mainloop()


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

🔑 Alur Animasi

  1. Memudar0.0 → 1.0
  2. Progress bar jalan →0 → 100%
  3. Memudar1.0 → 0.0
  4. Tutup splash, buka menu utama.


7. Splash screen dengan progres bar konversi (loop tak tentu)

Kalau mau lebih dramatis lagi, bilah kemajuan bisa dibuat warna gradien atau bergaris + mode tak tentu (animasi bergelombang).

Kita buatkan juga versi dengan progres bar konversi (loop tak tentu) supaya lebih hidup?

Kita buat splash screen versi lebih dramatis dengan progresif bar bergaris dan mode indeterminate (alias “gelombang jalan terus” 🚀).

Di tkinter, ttk.Progressbarpunya opsi mode="indeterminate"lalu dijalankan dengan .start(speed)biar jalan otomatis. Kita kombinasikan dengan efek fade-in → jalan → fade-out


📌 splash_screen.py(Progress Bar Gelombang + Animasi Fade)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai file logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    progress_label = tk.Label(
        splash, text="Loading...",
        font=("Arial", 11), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar striped + indeterminate ===
    style = ttk.Style()
    style.theme_use("clam")  # "clam" support striped style
    style.configure("Custom.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="#4CAF50",  # warna isi (hijau)
                    lightcolor="#81C784",   # gradasi lebih terang
                    darkcolor="#388E3C")    # gradasi lebih gelap

    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="indeterminate",
        style="Custom.Horizontal.TProgressbar"
    )
    progress.pack(pady=20)

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # Jalankan progress bar indeterminate (animasi bergelombang)
    progress.start(10)  # semakin kecil angkanya, semakin cepat gerakan

    # Setelah beberapa detik → stop & fade-out
    splash.after(4000, lambda: fade_out())  # tampil 4 detik

    # === Fade-out animasi ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            open_main_menu(splash)

    splash.mainloop()


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

✨ Perbedaan dengan versi lama:

  1. Bilah kemajuan bergaris dengan mode tak tentu → bergerak mengkonversi tanpa angka.
  2. Warna bar dibuat gradien hijau ( #4CAF50 → #81C784 → #388E3C).
  3. Durasi splash yang ditentukan splash.after(4000, ...)(4 detik → bisa diubah misalnya 6000 = 6 detik).
  4. Tetap ada fade-in dan fade-out biar transisinya lancar.

🔥 Jadi sekarang splash kamu punya logo → fade-in → progres bar bergelombang → fade-out → menu utama .


8progress bar rainbow (warna berganti otomatis) 

Berikut versi progress bar rainbow (warna berganti otomatis) biar makin atraktif? 🌈

Sekarang kita bikin versi progres bar pelangi (warna berganti otomatis sambil animasi tak tentu / bergelombang).
Caranya kita bikin loop timer ( after) untuk mengganti warna progresbar setiap beberapa milidetik → kesannya kayak pelangi hidup.


📌 splash_screen.py(Bilah Kemajuan Pelangi 🌈)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai logo PNG/JPG kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    progress_label = tk.Label(
        splash, text="Loading...",
        font=("Arial", 11), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar rainbow ===
    style = ttk.Style()
    style.theme_use("clam")

    style.configure("Rainbow.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="red")

    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="indeterminate",
        style="Rainbow.Horizontal.TProgressbar"
    )
    progress.pack(pady=20)

    # Daftar warna rainbow
    rainbow_colors = ["#FF0000", "#FF7F00", "#FFFF00",
                      "#00FF00", "#0000FF", "#4B0082", "#8B00FF"]
    color_index = {"i": 0}  # pakai dict biar mutable dalam closure

    def cycle_colors():
        color = rainbow_colors[color_index["i"] % len(rainbow_colors)]
        style.configure("Rainbow.Horizontal.TProgressbar", background=color, lightcolor=color, darkcolor=color)
        color_index["i"] += 1
        splash.after(300, cycle_colors)  # ganti tiap 300ms

    cycle_colors()

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # Jalankan progress bar indeterminate (animasi bergelombang)
    progress.start(10)

    # Setelah beberapa detik → stop & fade-out
    splash.after(5000, lambda: fade_out())  # tampil 5 detik

    # === Fade-out animasi ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            open_main_menu(splash)

    splash.mainloop()


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

✨ Hasil:

  1. Fade-in → Tampilan logo → Progress bar jalan bergelombang.
  2. Progress bar warnanya berubah-ubah seperti pelangi 🌈 tiap 0.3 detik.
  3. Setelah 5 detik → fade-out smooth → masuk ke Menu Utama.


9. Splash screen efek teks “Loading...”

Berikut efek teks “Loading...” juga ikut ganti warna rainbow biar makin heboh. Kita tambah efek supaya teks “Loading...” juga ikut ganti warna rainbow sinkron dengan progres bar. Jadi lebih hidup & heboh.


📌 splash_screen.py(Kemajuan Pelangi + Teks Pelangi)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai logo PNG/JPG kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    # === Label Loading (akan ikut rainbow) ===
    progress_label = tk.Label(
        splash, text="Loading...",
        font=("Arial", 12, "bold"), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar rainbow ===
    style = ttk.Style()
    style.theme_use("clam")

    style.configure("Rainbow.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="red")

    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="indeterminate",
        style="Rainbow.Horizontal.TProgressbar"
    )
    progress.pack(pady=20)

    # Daftar warna rainbow
    rainbow_colors = ["#FF0000", "#FF7F00", "#FFFF00",
                      "#00FF00", "#0000FF", "#4B0082", "#8B00FF"]
    color_index = {"i": 0}  # pakai dict biar mutable dalam closure

    def cycle_colors():
        color = rainbow_colors[color_index["i"] % len(rainbow_colors)]
        # Update progress bar warna
        style.configure("Rainbow.Horizontal.TProgressbar",
                        background=color, lightcolor=color, darkcolor=color)
        # Update teks "Loading..." warna
        progress_label.config(fg=color)
        color_index["i"] += 1
        splash.after(300, cycle_colors)  # ganti tiap 300ms

    cycle_colors()

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # Jalankan progress bar indeterminate (animasi bergelombang)
    progress.start(10)

    # Setelah beberapa detik → stop & fade-out
    splash.after(5000, lambda: fade_out())  # tampil 5 detik

    # === Fade-out animasi ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            open_main_menu(splash)

    splash.mainloop()


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

✨ Hasil sekarang:

  1. Progress bar tak tentu tetap bergelombang 🌊.
  2. Warna progres bar berubah-ubah pelangi 🌈 tiap 0.3 detik.
  3. Teks “Loading...” ikut berubah warna sinkron → semakin hidup 🔥.
  4. Efek fade-in + fade-out tetap ada → transisi lancar.


10.  Splash screen animasi teks “Loading.” → “Loading..” → “Loading…” (dot berjalan)

Berikut animasi teks “Loading.” → “Loading..” → “Loading…” (dot berjalan) biar lebih realistis kayak aplikasi modern?

kita bikin teks “Loading.” → “Loading..” → “Loading…” berjalan loop, sinkron dengan warna pelangi. Jadi kemajuan splash screen akan semakin modern.


📌 splash_screen.py(Kemajuan Pelangi + Teks Pelangi + Animasi Titik)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai lokasi logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    # === Label Loading (rainbow + animasi dot) ===
    progress_label = tk.Label(
        splash, text="Loading.",
        font=("Arial", 12, "bold"), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar rainbow ===
    style = ttk.Style()
    style.theme_use("clam")

    style.configure("Rainbow.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="red")

    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="indeterminate",
        style="Rainbow.Horizontal.TProgressbar"
    )
    progress.pack(pady=20)

    # === Rainbow warna loop ===
    rainbow_colors = ["#FF0000", "#FF7F00", "#FFFF00",
                      "#00FF00", "#0000FF", "#4B0082", "#8B00FF"]
    color_index = {"i": 0}

    # Animasi dot "Loading."
    dots = [".", "..", "..."]
    dot_index = {"i": 0}

    def cycle_colors_and_text():
        # Ganti warna
        color = rainbow_colors[color_index["i"] % len(rainbow_colors)]
        style.configure("Rainbow.Horizontal.TProgressbar",
                        background=color, lightcolor=color, darkcolor=color)
        # Ganti teks + warna
        progress_label.config(
            text="Loading" + dots[dot_index["i"] % len(dots)],
            fg=color
        )
        # Increment index
        color_index["i"] += 1
        dot_index["i"] += 1
        splash.after(400, cycle_colors_and_text)  # update tiap 400ms

    cycle_colors_and_text()

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # Jalankan progress bar indeterminate (animasi bergelombang)
    progress.start(10)

    # Setelah beberapa detik → stop & fade-out
    splash.after(6000, lambda: fade_out())  # tampil 6 detik

    # === Fade-out animasi ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            open_main_menu(splash)

    splash.mainloop()


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

✨ Hasil sekarang:

  1. Bilah kemajuan pelangi bergelombang 🌈
  2. Teks “Memuat.” → “Memuat..” → “Memuat…” berganti otomatis ⏳
  3. Warna teks ikut berubah sesuai warna pelangi 🔥
  4. Ada fade-in + fade-out transisi halus ke menu utama 🚀

Apakah kamu mau saya menambahkan juga efek suara (bip atau file suara .wav/.mp3) saat splash selesai → biar makin dramatis? 🎵


mau kamu menambahkan juga  efek suara (file suara .wav/.mp3)

Wah keren! 🎶 Kita bisa menambahkan efek suara saat splash selesai (ketika fade-out → sebelum masuk menu utama).
Di Python (Tkinter), opsi sederhana:

  • Windows/Linux → pakai playsound( pip install playsound)
  • Android (Pydroid3) → biasanya lebih aman pakai pygame( pip install pygame) karena playsoundsuka error di Android.

Saya membuat contoh dengan pygame.mixer (lebih fleksibel, bisa MP3/WAV)


📌 splash_screen.py(Kemajuan Pelangi + Teks Pelangi + Animasi Titik + Efek Suara)

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk  # pip install pillow
import pygame  # pip install pygame
from menu_utama import tampilkan_halaman_utama

# Path logo (ubah sesuai lokasi logo kamu)
LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"

# Path sound effect (mp3 atau wav)
SOUND_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/splash_sound.mp3"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)

    # Transparansi awal (fade-in start)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    # === Judul ===
    tk.Label(
        splash, text="SmartNutriChefAI",
        font=("Arial", 22, "bold"), fg="#4CAF50", bg="white"
    ).pack(pady=5)

    tk.Label(
        splash, text="by SR Pakpahan",
        font=("Arial", 12), fg="gray", bg="white"
    ).pack(pady=5)

    # === Label Loading (rainbow + animasi dot) ===
    progress_label = tk.Label(
        splash, text="Loading.",
        font=("Arial", 12, "bold"), fg="black", bg="white"
    )
    progress_label.pack(pady=10)

    # === Progress bar rainbow ===
    style = ttk.Style()
    style.theme_use("clam")

    style.configure("Rainbow.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="red")

    progress = ttk.Progressbar(
        splash, orient="horizontal",
        length=300, mode="indeterminate",
        style="Rainbow.Horizontal.TProgressbar"
    )
    progress.pack(pady=20)

    # === Rainbow warna loop ===
    rainbow_colors = ["#FF0000", "#FF7F00", "#FFFF00",
                      "#00FF00", "#0000FF", "#4B0082", "#8B00FF"]
    color_index = {"i": 0}

    # Animasi dot "Loading."
    dots = [".", "..", "..."]
    dot_index = {"i": 0}

    def cycle_colors_and_text():
        # Ganti warna
        color = rainbow_colors[color_index["i"] % len(rainbow_colors)]
        style.configure("Rainbow.Horizontal.TProgressbar",
                        background=color, lightcolor=color, darkcolor=color)
        # Ganti teks + warna
        progress_label.config(
            text="Loading" + dots[dot_index["i"] % len(dots)],
            fg=color
        )
        # Increment index
        color_index["i"] += 1
        dot_index["i"] += 1
        splash.after(400, cycle_colors_and_text)  # update tiap 400ms

    cycle_colors_and_text()

    # === Fade-in animasi ===
    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))

    fade_in()

    # Jalankan progress bar indeterminate (animasi bergelombang)
    progress.start(10)

    # Setelah beberapa detik → stop & fade-out
    splash.after(6000, lambda: fade_out())  # tampil 6 detik

    # === Fade-out animasi + efek suara ===
    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            play_sound_effect()  # 🔊 mainkan suara
            open_main_menu(splash)

    splash.mainloop()


def play_sound_effect():
    """Mainkan efek suara saat splash selesai"""
    try:
        pygame.mixer.init()
        pygame.mixer.music.load(SOUND_PATH)
        pygame.mixer.music.play()
    except Exception as e:
        print(f"[Sound error] {e}")


def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()


if __name__ == "__main__":
    show_splash_screen()

✨ Hasil tambahan:

  1. Begitu splash selesai → efek suara otomatis dimainkan 🎶
  2. Kamu bisa menggunakan .mp3 (misalnya suara “ding” / “welcome”) atau .wav (lebih ringan).
  3. Efek ini berjalan bersamaan dengan transisi fade-out → jadi lebih dramatis 🔥

Mau saya bikin juga opsi toggle di settings (misalnya pengguna bisa pilih: Sound ON / OFF) supaya bisa dimatikan kalau tidak mau ada suara? 🎛️


Mau kamu bikin juga opsi toggle di settings (misalnya pengguna bisa pilih: Sound ON / OFF) supaya bisa dimatikan kalau tidak mau ada suara. 🎛️

Oke mantap 👍 kita tambahkan opsi Settings → Sound ON/OFF supaya pengguna bisa atur sendiri apakah efek suara splash dipakai atau tidak 🎛️.
Cara mudahnya: kita menyimpan flag pengaturan di file settings.json(atau SQLite, tapi JSON lebih ringan).


📌 settings_manager.py

import os, json

SETTINGS_FILE = "/storage/emulated/0/AppJadi/SmartNutriChefAI/settings.json"

DEFAULT_SETTINGS = {
    "sound_enabled": True
}

def load_settings():
    if not os.path.exists(SETTINGS_FILE):
        save_settings(DEFAULT_SETTINGS)
        return DEFAULT_SETTINGS
    with open(SETTINGS_FILE, "r") as f:
        return json.load(f)

def save_settings(settings):
    with open(SETTINGS_FILE, "w") as f:
        json.dump(settings, f, indent=4)

📌 Modifikasisplash_screen.py

Integrasikan setting sound:

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import pygame
from menu_utama import tampilkan_halaman_utama
from settings_manager import load_settings  # 🔧

LOGO_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/logo.png"
SOUND_PATH = "/storage/emulated/0/AppJadi/SmartNutriChefAI/assets/splash_sound.mp3"

def show_splash_screen():
    splash = tk.Tk()
    splash.title("SmartNutriChefAI - Splash")
    splash.geometry("520x400")
    splash.configure(bg="white")
    splash.resizable(False, False)
    splash.attributes("-alpha", 0.0)

    # === Logo ===
    try:
        img = Image.open(LOGO_PATH)
        img = img.resize((150, 150), Image.LANCZOS)
        logo_img = ImageTk.PhotoImage(img)
        logo_label = tk.Label(splash, image=logo_img, bg="white")
        logo_label.image = logo_img
        logo_label.pack(pady=25)
    except Exception as e:
        tk.Label(splash, text=f"[Logo not found]\n{e}",
                 font=("Arial", 10), fg="red", bg="white").pack(pady=25)

    tk.Label(splash, text="SmartNutriChefAI",
             font=("Arial", 22, "bold"), fg="#4CAF50", bg="white").pack(pady=5)

    tk.Label(splash, text="by SR Pakpahan",
             font=("Arial", 12), fg="gray", bg="white").pack(pady=5)

    # === Label Loading rainbow ===
    progress_label = tk.Label(splash, text="Loading.",
                              font=("Arial", 12, "bold"), fg="black", bg="white")
    progress_label.pack(pady=10)

    # === Progressbar ===
    style = ttk.Style()
    style.theme_use("clam")
    style.configure("Rainbow.Horizontal.TProgressbar",
                    troughcolor="white",
                    bordercolor="white",
                    background="red")

    progress = ttk.Progressbar(splash, orient="horizontal",
                               length=300, mode="indeterminate",
                               style="Rainbow.Horizontal.TProgressbar")
    progress.pack(pady=20)

    rainbow_colors = ["#FF0000", "#FF7F00", "#FFFF00",
                      "#00FF00", "#0000FF", "#4B0082", "#8B00FF"]
    color_index = {"i": 0}
    dots = [".", "..", "..."]
    dot_index = {"i": 0}

    def cycle_colors_and_text():
        color = rainbow_colors[color_index["i"] % len(rainbow_colors)]
        style.configure("Rainbow.Horizontal.TProgressbar",
                        background=color, lightcolor=color, darkcolor=color)
        progress_label.config(text="Loading" + dots[dot_index["i"] % len(dots)], fg=color)
        color_index["i"] += 1
        dot_index["i"] += 1
        splash.after(400, cycle_colors_and_text)

    cycle_colors_and_text()

    def fade_in(opacity=0.0):
        if opacity <= 1.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_in(opacity + 0.05))
    fade_in()

    progress.start(10)
    splash.after(6000, lambda: fade_out())

    def fade_out(opacity=1.0):
        if opacity > 0.0:
            splash.attributes("-alpha", opacity)
            splash.after(40, lambda: fade_out(opacity - 0.05))
        else:
            progress.stop()
            settings = load_settings()
            if settings.get("sound_enabled", True):
                play_sound_effect()  # 🔊 hanya kalau ON
            open_main_menu(splash)

    splash.mainloop()

def play_sound_effect():
    try:
        pygame.mixer.init()
        pygame.mixer.music.load(SOUND_PATH)
        pygame.mixer.music.play()
    except Exception as e:
        print(f"[Sound error] {e}")

def open_main_menu(splash_root):
    splash_root.destroy()
    root = tk.Tk()
    root.title("SmartNutriChefAI")
    root.geometry("600x500")
    tampilkan_halaman_utama(root)
    root.mainloop()

if __name__ == "__main__":
    show_splash_screen()

📌 Tambah Pengaturan Menu (opsional di menu_utama.py)

from settings_manager import load_settings, save_settings

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

    tk.Label(root_frame, text="Pengaturan", font=("Arial", 16, "bold")).pack(pady=20)

    settings = load_settings()
    sound_var = tk.BooleanVar(value=settings.get("sound_enabled", True))

    tk.Checkbutton(root_frame, text="Aktifkan Suara Splash",
                   variable=sound_var, font=("Arial", 12)).pack(pady=10)

    def simpan():
        settings["sound_enabled"] = sound_var.get()
        save_settings(settings)
        messagebox.showinfo("Info", "Pengaturan tersimpan!")

    tk.Button(root_frame, text="Simpan", command=simpan,
              bg="green", fg="white").pack(pady=10)

    tk.Button(root_frame, text="⬅ Kembali", bg="gray", fg="white",
              command=lambda: tampilkan_halaman_utama(root_frame)).pack(pady=20)

⚡ Jadi:

  • Default → suara aktif
  • Bisa dimatikan di pengaturan menu
  • Splash screen periksa pengaturan dulu sebelum memainkan musik

Mau saya sekalian bikin tombol UI Settings langsung menu_utama.pybiar bisa kamu akses cepat dari menu utama?



Comments