Langsung ke konten utama

MELAKUKAN CRUD DATA PADA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah DI DATABASE DATAMUSIK db (Part-2)

MELAKUKAN CRUD DATA PADA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah DI DATABASE DATAMUSIK db (Part-2)


Untuk memilih Gugusan Nada Terpilih (Data Musik) dari tabel  Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, maka pada isi file CRUD_Gn_Cyan_Bawah(gabung).py pada  bottom_frame saya tambahkan label gugusan nada terpilih, 4 buah entry (bass_gn_cyan_bawah_entry, sub_bass_gn_cyan_bawah_entry, trebel_gn_cyan_bawah_entry, sub_trebel_gn_cyan_bawah_entry) untuk tempat meletakkan data gugusan nada terpilih yang didapat dari kedua tabel tersebut, dan sebuah tombol Pilih Nada untuk menjalankan perintah "select_nada" untuk memilih/mengambil dan meletakkan data gugusan nada terpilih yang dari tabel ke dalam masing-masing kotak entry, sebelum data ditampilkan maka semua entries terlebih dahulu sudah dibersihkan.

Namun data gugusan nada terpilih yang diambil dari tabel, data dipilih oleh pengguna berdasarkan ID, Progres, Mode, Level_Gn, dan Nada (Bass/Trebel) yang diinput pada masing masing kotak entries (EntryBoxs) yang tersedia pada frame_top,

Sehingga kode isi file CRUD_Gn_Cyan_Bawah(gabung).py berkembang menjadi seperti berikut ini:

import tkinter as tk

from tkinter import ttk

import sqlite3

from tkinter import messagebox

from tkinter import filedialog

from tkinter import Tk, Label, Entry, Button, Frame, StringVar

import subprocess

import os

import logging


# Initialize logging

logging.basicConfig(level=logging.INFO)


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik")    


# Function to initialize database

def init_db():

    conn = sqlite3.connect("DATAMUSIK.db")

    c = conn.cursor()

    # Create Gn_Cyan_Bawah table

    c.execute('''CREATE TABLE IF NOT EXISTS Gn_Cyan_Bawah (

                ID INTEGER PRIMARY KEY,

                Level_R TEXT,

                Bass INT,                

                Trebel_Biasa INT,

                Trebel_Aneh INT

                )''')

    # Create Sub_Gn_Cyan_Bawah table

    c.execute('''CREATE TABLE IF NOT EXISTS Sub_Gn_Cyan_Bawah (

                Sub_ID INTEGER PRIMARY KEY,

                Level_D TEXT,

                Bass INT,                

                Trebel_Biasa INT,

                Trebel_Aneh INT

                )''')

    conn.commit()

    conn.close()

    

# Head Frame

head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)

head_frame.place()


# Content Frame

content_frame = tk.Frame(root)

content_frame.pack()


# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()

        

# Function to switch modes and update pages

def switch_mode(progres, mode):

    if mode[progres - 1] == "naik":

        mode[progres - 1] = "turun"

        setup_turun_mode(progres)

    else:

        mode[progres - 1] = "naik"

        setup_naik_mode(progres)

        

# Options Frame

options_frame = tk.Frame(root, bg="#c3c3c3") 


# Current mode for each toggle button

current_mode = ['naik', 'naik', 'naik']

toggle_btns = []

indicator_labels = []

pages = [

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

]                                                

                                     

# Function to toggle menus

def toggle_menu(progres, mode):

    if mode[progres - 1] == 'naik':

        mode[progres - 1] = 'turun'

        toggle_btns[progres - 1].config(text="X _ T")

        pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

        indicator_labels[progres - 1].config(text="Turun")

    else:

        mode[progres - 1] = 'naik'

        toggle_btns[progres - 1].config(text="☰ _ N")

        pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

        indicator_labels[progres - 1].config(text="Naik")

    

    update_options_frame(progres)

    display_pages(progres)

    

# Function to display pages

def display_pages(progres):

    for widget in content_frame.winfo_children():

        widget.destroy()


    display_gn_cyan_bawah_page()


# Function to display default page

def display_gn_cyan_bawah_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()

    

              

# Function to setup "Naik" mode

def setup_naik_mode(progres):

    if progres == 1:

        pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

    elif progres == 2:

        pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

    elif progres == 3:

        pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

    

# Function to setup "Turun" mode

def setup_turun_mode(progres):

    if progres == 1:

        pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

    elif progres == 2:

        pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

    elif progres == 3:

        pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

                 

# Toggle Button 1

toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))

toggle_btn1.pack(side=tk.LEFT)

toggle_btn1.place(x=5, y=20)

toggle_btns.append(toggle_btn1)


title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))

title_lb1.pack(side=tk.LEFT)

title_lb1.place(x=108, y=11)


indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label1.pack(side=tk.LEFT)

indicator_label1.place(x=127, y=55)

indicator_labels.append(indicator_label1)


# Toggle Button 2

toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))

toggle_btn2.pack(side=tk.LEFT)

toggle_btn2.place(x=232, y=20)

toggle_btns.append(toggle_btn2)


title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))

title_lb2.pack(side=tk.LEFT)

title_lb2.place(x=334, y=5)


indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label2.pack(side=tk.LEFT)

indicator_label2.place(x=368, y=55)

indicator_labels.append(indicator_label2)


# Toggle Button 3

toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))

toggle_btn3.pack(side=tk.LEFT)

toggle_btn3.place(x=460, y=20)

toggle_btns.append(toggle_btn3)


title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))

title_lb3.pack(side=tk.LEFT)

title_lb3.place(x=565, y=5)


indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label3.pack(side=tk.LEFT)

indicator_label3.place(x=599, y=55)

indicator_labels.append(indicator_label3)


head_frame.pack(side=tk.TOP, fill=tk.X)

head_frame.pack_propagate(False)

head_frame.configure(height=120)


options_frame.pack(side=tk.LEFT)

options_frame.pack_propagate(False)

options_frame.configure(width=170, height=300) 


# Bottom Frame

bottom_frame = tk.Frame(root, bg="#e2e2e2")

bottom_frame.pack(side=tk.TOP, fill=tk.X)


# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()

                  

def open_data_gn_cyan_bawah_file():

    filepath = "DATA_Gn_Cyan_Bawah(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")      

                  

#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih 

gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")

gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")  


# Data Buttons

crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")

crud_btn.grid(row=5, column=0, padx=10, pady=5)


label_info = tk.Label(bottom_frame, fg="tomato",  text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")

label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)


separator = ttk.Separator(bottom_frame, orient='horizontal')

separator.grid(row=6, column=0, sticky="ew", pady=15)

     

# Frame untuk ID dan progres

frame_top = tk.Frame(root)

frame_top.pack(pady=10)


# CRUD Functions

def clear_entries():

    for row in entry_rows:

        for entry in row:

            entry.delete(0, tk.END)       


label_id = tk.Label(frame_top, text="ID:")

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

entry_id = tk.Entry(frame_top)

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


label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")

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

entry_level_gn = tk.Entry(frame_top)

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


label_progres = tk.Label(frame_top, text="Progres:")

label_progres.grid(row=2, column=0, padx=5, pady=5)

progres_var = tk.StringVar()

progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)

progres_combobox['values'] = (1, 2, 3)

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


label_mode = tk.Label(frame_top, text="Mode:")

label_mode.grid(row=3, column=0, padx=5, pady=5)

mode_var = tk.StringVar()

mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)

mode_combobox['values'] = ("Naik", "Turun")

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


label_nada = tk.Label(frame_top, text="Nada:")

label_nada.grid(row=4, column=0, padx=5, pady=5)

nada_var = tk.StringVar()

nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)

nada_combobox['values'] = ("Bass", "Trebel")

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


separator = ttk.Separator(frame_top, orient='horizontal')

separator.grid(row=6, column=0, sticky="ew", pady=15)


# Bottom Frame

bottom_frame = tk.Frame(root, bg="#e2e2e2")

bottom_frame.pack(side=tk.TOP, fill=tk.X)


# Label Gugusan Nada Terpilih Field

Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")

Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)


#Label dan Entry Ambil Gugusan nada Teroilih

label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")

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

entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)

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


label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")

label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)

entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)

entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)


label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")

label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)

entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)

entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)


label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")

label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)

entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)

entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)


# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna

def select_nada():

    save_current_values()

    

    nada = nada_var.get()

    progres = int(progres_var.get()) if progres_var.get() else 0


    if nada == "Bass":

        select_bass_nada_and_display_in_entries()

    elif nada == "Trebel":

        clear_entries_except_progres()

        restore_saved_values()

        select_trebel_nada_and_display_in_entries()

            # Reset progres and nada selection

    progres_combobox.set('')

    nada_combobox.set('')


# Fungsi untuk membersihkan semua entry

def clear_all_entries():

    entry_id.delete(0, tk.END)

    entry_level_gn.delete(0, tk.END)

    progres_var.set('')

    mode_var.set('')

    nada_var.set('')

    entry_bass_gn_cyan_bawah.delete(0, tk.END)

    entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)

    entry_trebel_gn_cyan_bawah.delete(0, tk.END)

    entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)


# Tombol untuk memilih nada

select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)

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


# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py 

active_page = None  # Menyimpan halaman aktif

# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py

def run_gn_a_trebel_file():

    filepath = "CRUD_Gn_A_Trebel.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    


def run_gn_biru_file():

    filepath = "CRUD_Gn_Biru.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    


def run_gn_cyan_bawah_file():

    filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    


def run_gn_cyan_atas_file():

    filepath = "CRUD_Gn_Cyan_Atas(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    

    

def run_gn_a_bass_file():

    filepath = "CRUD_Gn_A_Bass.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")                

               

# Function to display the options based on the current mode and progress

def update_options_frame(progres):

    # Clear existing buttons

    for widget in options_frame.winfo_children():

        widget.destroy()


    if current_mode[progres - 1] == "turun":

        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

        Gn_Cyan_Bawah_btn.place(x=3, y=0)

        

        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

        Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)    

        

        Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)

        Gn_A_Trebel_btn.place(x=3, y=50)

        

        Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)    


    else:  # Mode "naik"

        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

        Gn_Cyan_Bawah_btn.place(x=3, y=0)

        

        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

        Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)    


        Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)

        Gn_Cyan_Atas_btn.place(x=3, y=50)

        

        Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)    


        Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)

        Gn_Biru_btn.place(x=3, y=100)

        

        Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_Biru_indicate.place(x=2, y=105, width=5, height=45)    


        Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)

        Gn_A_Bass_btn.place(x=3, y=150)

        

        Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)

        

# Call update_options_frame for the initial setup

update_options_frame(1)


# Function to display Gn_A_Trebel page

def Gn_A_Trebel_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()      


# Function to display Gn_Biru page

def Gn_Biru_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()


# Function to display Gn_Cyan_Bawah page

def Gn_Cyan_Bawah_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()

    

# Function to display Gn_Cyan_Atas page

def Gn_Cyan_Atas_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()    


# Function to display Gn_Biru page

def Gn_A_Bass_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()


# Initialize the default page

def init_default_page():

    update_options_frame(1)  # Default to showing options for Progres-1

    clear_content_frame()

    tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()

    

    #Fungsi tombol di options_frame        

    Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)

    Gn_A_Trebel_btn.place(x=3, y=0)

    

    Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)  

        

    Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)

    Gn_Biru_btn.place(x=3, y=50)

        

    Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)     

    

    Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

    Gn_Cyan_Bawah_btn.place(x=3, y=100)                  

    Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

    Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)    


    Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)

    Gn_Cyan_Atas_btn.place(x=3, y=150)

        

    Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)    


    Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)

    Gn_A_Bass_btn.place(x=3, y=200)

        

    Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)


# Main Function

if __name__ == "__main__":

    init_db()

    init_default_page()

    root.mainloop()

    

 Selanjutnya tolong modifikasi kode agar supaya data gugusan nada terpilih yang diambil dari tabel dapat diletakkan di        4 entries yang tersedia (bass_gn_cyan_bawah_entry, sub_bass_gn_cyan_bawah_entry, trebel_gn_cyan_bawah_entry, sub_trebel_gn_cyan_bawah_entry), dan pastikan data gugusan nada terpilih tersebut dipilih berdasarkan input oleh  pengguna pada kotak entries:  ID, Progres, Mode, Level_Gn, dan Nada (Bass atau Trebel)                        


Terima kasih atas penjelasan dan kode yang telah Anda berikan. Berdasarkan uraian Anda, tampaknya Anda ingin menambahkan fitur untuk memilih gugusan nada terpilih dari tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah, dengan data yang akan ditampilkan pada bottom_frame di beberapa Entry. Berikut adalah beberapa poin dan penyesuaian yang dapat diterapkan untuk melengkapi kode yang Anda buat:Menambahkan Fungsi untuk Mengambil Data dari Tabel: Anda memerlukan fungsi untuk mengambil data berdasarkan ID, Progres, Mode, Level_Gn, dan jenis Nada dari tabel yang bersangkutan.Memperbaiki Struktur dan Logika: Beberapa fungsi seperti clear_entries, select_nada, dan fungsi yang terkait dengan pengambilan data dari tabel perlu diperbaiki atau ditambahkan agar sesuai dengan logika aplikasi.Berikut adalah kode yang sudah diperbaiki dan ditambahkan fungsi select_nada:


import tkinter as tk
from tkinter import ttk
import sqlite3
from tkinter import messagebox
from tkinter import filedialog
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import subprocess
import os
import logging

# Initialize logging
logging.basicConfig(level=logging.INFO)

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")    

# Function to initialize database
def init_db():
    conn = sqlite3.connect("DATAMUSIK.db")
    c = conn.cursor()
    # Create Gn_Cyan_Bawah table
    c.execute('''CREATE TABLE IF NOT EXISTS Gn_Cyan_Bawah (
                ID INTEGER PRIMARY KEY,
                Level_R TEXT,
                Bass INT,                
                Trebel_Biasa INT,
                Trebel_Aneh INT
                )''')
    # Create Sub_Gn_Cyan_Bawah table
    c.execute('''CREATE TABLE IF NOT EXISTS Sub_Gn_Cyan_Bawah (
                Sub_ID INTEGER PRIMARY KEY,
                Level_D TEXT,
                Bass INT,                
                Trebel_Biasa INT,
                Trebel_Aneh INT
                )''')
    conn.commit()
    conn.close()
    
# Head Frame
head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)
head_frame.place()

# Content Frame
content_frame = tk.Frame(root)
content_frame.pack()

# Function to clear content frame
def clear_content_frame():
    for widget in content_frame.winfo_children():
        widget.destroy()
        
# Function to switch modes and update pages
def switch_mode(progres, mode):
    if mode[progres - 1] == "naik":
        mode[progres - 1] = "turun"
        setup_turun_mode(progres)
    else:
        mode[progres - 1] = "naik"
        setup_naik_mode(progres)
        
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3") 

# Current mode for each toggle button
current_mode = ['naik', 'naik', 'naik']
toggle_btns = []
indicator_labels = []
pages = [
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
]                                                
                                     
# Function to toggle menus
def toggle_menu(progres, mode):
    if mode[progres - 1] == 'naik':
        mode[progres - 1] = 'turun'
        toggle_btns[progres - 1].config(text="X _ T")
        pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
        indicator_labels[progres - 1].config(text="Turun")
    else:
        mode[progres - 1] = 'naik'
        toggle_btns[progres - 1].config(text="☰ _ N")
        pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
        indicator_labels[progres - 1].config(text="Naik")
    
    update_options_frame(progres)
    display_pages(progres)
    
# Function to display pages
def display_pages(progres):
    for widget in content_frame.winfo_children():
        widget.destroy()

    display_gn_cyan_bawah_page()

# Function to display default page
def display_gn_cyan_bawah_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
    
              
# Function to setup "Naik" mode
def setup_naik_mode(progres):
    if progres == 1:
        pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    elif progres == 2:
        pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    elif progres == 3:
        pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    
# Function to setup "Turun" mode
def setup_turun_mode(progres):
    if progres == 1:
        pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
    elif progres == 2:
        pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
    elif progres == 3:
        pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
                 
# Toggle Button 1
toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))
toggle_btn1.pack(side=tk.LEFT)
toggle_btn1.place(x=5, y=20)
toggle_btns.append(toggle_btn1)

title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))
title_lb1.pack(side=tk.LEFT)
title_lb1.place(x=108, y=11)

indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label1.pack(side=tk.LEFT)
indicator_label1.place(x=127, y=55)
indicator_labels.append(indicator_label1)

# Toggle Button 2
toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))
toggle_btn2.pack(side=tk.LEFT)
toggle_btn2.place(x=232, y=20)
toggle_btns.append(toggle_btn2)

title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))
title_lb2.pack(side=tk.LEFT)
title_lb2.place(x=334, y=5)

indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label2.pack(side=tk.LEFT)
indicator_label2.place(x=368, y=55)
indicator_labels.append(indicator_label2)

# Toggle Button 3
toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))
toggle_btn3.pack(side=tk.LEFT)
toggle_btn3.place(x=460, y=20)
toggle_btns.append(toggle_btn3)

title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))
title_lb3.pack(side=tk.LEFT)
title_lb3.place(x=565, y=5)

indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label3.pack(side=tk.LEFT)
indicator_label3.place(x=599, y=55)
indicator_labels.append(indicator_label3)

head_frame.pack(side=tk.TOP, fill=tk.X)
head_frame.pack_propagate(False)
head_frame.configure(height=120)

options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300) 

# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)

# Function to clear content frame
def clear_content_frame():
    for widget in content_frame.winfo_children():
        widget.destroy()
                  
def open_data_gn_cyan_bawah_file():
    filepath = "DATA_Gn_Cyan_Bawah(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")      
                  
#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih 
gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")  

# Data Buttons
crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")
crud_btn.grid(row=5, column=0, padx=10, pady=5)

label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")
label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)

separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
     
# Frame untuk ID dan progres
frame_top = tk.Frame(root)
frame_top.pack(pady=10)

# CRUD Functions
def clear_entries():
    for row in entry_rows:
        for entry in row:
            entry.delete(0, tk.END)       

label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5, pady=5)

label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")
label_Level_Gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)

label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=2, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=2, column=1, padx=5, pady=5)

label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=3, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=3, column=1, padx=5, pady=5)

label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=4, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("Bass", "Trebel")
nada_combobox.grid(row=4, column=1, padx=5, pady=5)

separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)

# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)

# Label Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)

#Label dan Entry Ambil Gugusan nada Teroilih
label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")
label_bass_gn_cyan_atas.grid(row=7, column=1, padx=5, pady=5)
entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_gn_cyan_atas.grid(row=8, column=1, padx=5, pady=5)

label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")
label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)
entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)

label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)
entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)

label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)
entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)

# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna
def select_nada():
    save_current_values()
    
    nada = nada_var.get()
    progres = int(progres_var.get()) if progres_var.get() else 0

    if nada == "Bass":
        select_bass_nada_and_display_in_entries()
    elif nada == "Trebel":
        clear_entries_except_progres()
        restore_saved_values()
        select_trebel_nada_and_display_in_entries()
            # Reset progres and nada selection
    progres_combobox.set('')
    nada_combobox.set('')

# Fungsi untuk membersihkan semua entry
def clear_all_entries():
    entry_id.delete(0, tk.END)
    entry_level_gn.delete(0, tk.END)
    progres_var.set('')
    mode_var.set('')
    nada_var.set('')
    entry_bass_gn_cyan_bawah.delete(0, tk.END)
    entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)
    entry_trebel_gn_cyan_bawah.delete(0, tk.END)
    entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)

# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)

# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py 
active_page = None # Menyimpan halaman aktif
# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py
def run_gn_a_trebel_file():
    filepath = "CRUD_Gn_A_Trebel.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_biru_file():
    filepath = "CRUD_Gn_Biru.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_bawah_file():
    filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_atas_file():
    filepath = "CRUD_Gn_Cyan_Atas(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    
    
def run_gn_a_bass_file():
    filepath = "CRUD_Gn_A_Bass.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")                
               
# Function to display the options based on the current mode and progress
def update_options_frame(progres):
    # Clear existing buttons
    for widget in options_frame.winfo_children():
        widget.destroy()

    if current_mode[progres - 1] == "turun":
        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
        Gn_Cyan_Bawah_btn.place(x=3, y=0)
        
        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
        Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)    
        
        Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
        Gn_A_Trebel_btn.place(x=3, y=50)
        
        Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)    

    else: # Mode "naik"
        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
        Gn_Cyan_Bawah_btn.place(x=3, y=0)
        
        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
        Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)    

        Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
        Gn_Cyan_Atas_btn.place(x=3, y=50)
        
        Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)    

        Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
        Gn_Biru_btn.place(x=3, y=100)
        
        Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_Biru_indicate.place(x=2, y=105, width=5, height=45)    

        Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
        Gn_A_Bass_btn.place(x=3, y=150)
        
        Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)
        
# Call update_options_frame for the initial setup
update_options_frame(1)

# Function to display Gn_A_Trebel page
def Gn_A_Trebel_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()      

# Function to display Gn_Biru page
def Gn_Biru_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()

# Function to display Gn_Cyan_Bawah page
def Gn_Cyan_Bawah_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
    
# Function to display Gn_Cyan_Atas page
def Gn_Cyan_Atas_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()    

# Function to display Gn_Biru page
def Gn_A_Bass_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()

# Initialize the default page
def init_default_page():
    update_options_frame(1) # Default to showing options for Progres-1
    clear_content_frame()
    tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()
    
    #Fungsi tombol di options_frame        
    Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
    Gn_A_Trebel_btn.place(x=3, y=0)
    
    Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)  
        
    Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
    Gn_Biru_btn.place(x=3, y=50)
        
    Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)     
    
    Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
    Gn_Cyan_Bawah_btn.place(x=3, y=100)                  
    Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
    Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)    

    Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
    Gn_Cyan_Atas_btn.place(x=3, y=150)
        
    Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)    

    Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
    Gn_A_Bass_btn.place(x=3, y=200)
        
    Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)


# Main Function
if __name__ == "__main__":
    init_db()
    init_default_page()
    root.mainloop()
    
 
Penjelasan:
Fungsi select_nada:
Fungsi ini mengambil data dari tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah berdasarkan nilai yang diinput oleh pengguna di Entry pada frame_top. Data yang diambil kemudian diisi ke dalam Entry pada bottom_frame sesuai dengan jenis nada yang dipilih (Bass atau Trebel).

Validasi Input:
Fungsi ini juga melakukan validasi untuk memastikan semua Entry pada frame_top telah diisi sebelum mencoba mengambil data dari database.

Pembersihan Entry:
Sebelum menampilkan data yang baru, semua Entry dibersihkan terlebih dahulu menggunakan fungsi clear_all_entries.

Dengan penyesuaian ini, Anda seharusnya dapat mengambil dan menampilkan data sesuai dengan yang diinginkan pengguna. Jika ada kendala lain atau penyesuaian lebih lanjut yang diperlukan, silakan beritahu saya!                                     


Tolong kembali pastikan bahwa jumlah Level_Gn ada sebanyak 12 (dari 1 hingga 12) baik pada tabel Gn_Cyan_Bawah, maupun tabel Sub_Gn_Cyan_Bawah,. Penentu urutan Level_Gn adalah pada nada Bass. Berikut ini urutan Level_Gn pada Gn_Cyan_Bawah: 
1. Level Gn= 1 = 5 = 9 pada kolom Bass id 1 Gn_Gn_Cyan_Bawah, 
2. Level Gn= 2 = 6 =10 pada kolom Bass id 2, 
3. Level Gn= 3 = 7 = 11 pada kolom Bass id 3, 
4. Level Gn= 4 = 8 = 12 pada kolom Bass id 4, 
Sebenarnya Level Gn pada Gn_Cyan_Bawah ini sampai hingga tak terbatas (unlimited), tetapi kita batasi saja hingga sampai 12 level saja.
Sedangkan Level_Gn pada Sub_Gn_Cyan_Bawah, adalah: 
1. Level Gn= 1 = 2 = 3 = 4 = 5 = 6 =7 = 8 = 9 = 10 = 11 = 12 pada kolom Bass sub_id 1 Gn_Gn_Cyan_Bawah, 
Sebenarnya, juga Level Gn pada Gn_Cyan_Bawah ini sampai hingga tak terbatas (unlimited), tetapi kita batasi saja hingga sampai 12 level saja.

Dan pastikan pengambilan data kita lakukan pada bagian data Bass terlebih dahulu, baik data Bass dari Gn_Cyan_Bawah, maupun dari Bass Sub_Gn_Cyan_Bawah yang akan serempak diambil, dipilih dari tabel yang sesuai dan dimasukkan ke dalam kotak entries yang sesuai juga, Jadi jelas kode perintah untuk pengambilan data Bass berbeda dengan untuk data Trebel, sebab pada data Trebel akan memiliki penyesuaian atau adaptasi yaitu Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres


Untuk memastikan jumlah **Level_Gn** sesuai dengan urutan yang diinginkan, berikut adalah beberapa poin penting:

### 1. **Penentuan Urutan Level_Gn pada Gn_Cyan_Bawah**
   - **Level 1, 5, 9**: Mengambil data dari kolom Bass ID 1.
   - **Level 2, 6, 10**: Mengambil data dari kolom Bass ID 2.
   - **Level 3, 7, 11**: Mengambil data dari kolom Bass ID 3.
   - **Level 4, 8, 12**: Mengambil data dari kolom Bass ID 4.

### 2. **Penentuan Urutan Level_Gn pada Sub_Gn_Cyan_Bawah**
   - **Level 1 hingga 12**: Mengambil data dari kolom Bass Sub_ID 1.

### 3. **Pengambilan Data**
   - **Data Bass**: Harus diambil serempak dari **Gn_Cyan_Bawah** dan **Sub_Gn_Cyan_Bawah**, kemudian dimasukkan ke dalam kotak entries yang sesuai.
   - **Data Trebel**: Akan diambil setelahnya dengan penyesuaian atau adaptasi berdasarkan **progres**.

### Modifikasi Kode
Berikut ini adalah kode yang telah dimodifikasi untuk memastikan pengambilan data sesuai dengan urutan **Level_Gn**:

```python
def select_nada():
    id_value = entry_id.get()
    level_gn_value = int(entry_level_gn.get())
    progres_value = progres_var.get()
    mode_value = mode_var.get()
    nada_value = nada_var.get()

    if not all([id_value, level_gn_value, progres_value, mode_value, nada_value]):
        messagebox.showwarning("Warning", "Harap isi semua kolom!")
        return

    clear_all_entries()

    try:
        conn = sqlite3.connect("DATAMUSIK.db")
        c = conn.cursor()

        # Kondisi untuk menentukan kolom ID dan Sub_ID berdasarkan Level_Gn
        if level_gn_value in [1, 5, 9]:
            bass_id = 1
        elif level_gn_value in [2, 6, 10]:
            bass_id = 2
        elif level_gn_value in [3, 7, 11]:
            bass_id = 3
        elif level_gn_value in [4, 8, 12]:
            bass_id = 4
        else:
            messagebox.showerror("Error", "Level_Gn tidak valid!")
            return

        # Ambil data dari Gn_Cyan_Bawah
        c.execute('''
            SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Gn_Cyan_bawah
            WHERE ID=? AND ?=?
        ''', (bass_id, mode_value, progres_value))
        result_gn_cyan_bawah = c.fetchone()

        # Ambil data dari Sub_Gn_Cyan_bawah
        c.execute('''
            SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Sub_Gn_Cyan_bawah
            WHERE Sub_ID=1 AND ?=?
        ''', (mode_value, progres_value))
        result_sub_gn_cyan_bawah = c.fetchone()

        # Pengisian data Bass
        if nada_value == "Bass":
            if result_gn_cyan_bawah:
                entry_bass_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[0])
            if result_sub_gn_cyan_bawah:
                entry_bass_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[0])

        # Pengisian data Trebel
        elif nada_value == "Trebel":
            if result_gn_cyan_bawah:
                entry_trebel_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[1])
                entry_trebel_sub_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[2])
            if result_sub_gn_cyan_bawah:
                entry_trebel_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[1])

        conn.close()

    except Exception as e:
        messagebox.showerror("Error", f"Failed to fetch data: {e}")
```

Dengan kode ini, data **Bass** akan diambil dan dimasukkan ke dalam entry sesuai Level_Gn yang sudah ditentukan. Data **Trebel** juga akan dimasukkan setelah pengambilan data Bass, dengan penyesuaian berdasarkan kondisi progres. Hal ini memastikan bahwa pengambilan data sesuai dengan urutan Level_Gn yang kamu inginkan.


Kita memilih gugusan nada Bass dulu, baik Bass dari Gn_Cyan_Bawah maupun Bass dari Sub_Gn_Cyan_Bawah, data Bass Gn_Cyan_Bawah, dan Bass Sub_Gn_Cyan_Bawah ini akan serempak bersamaan diambil, lalu akan serempak dimasukkan ke dalam EntryBoxs: bass_gn_cyan_bawah_entry, dan bass_sub_gn_cyan_bawah_entry, pada kode isi file CRUD_Gn_Cyan_Bawah.py yang butuh dimodifikasi:

import tkinter as tk
from tkinter import ttk
import sqlite3
from tkinter import messagebox
from tkinter import filedialog
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import subprocess
import os
import logging

# Initialize logging
logging.basicConfig(level=logging.INFO)

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")    

# Function to initialize database
def init_db():
    conn = sqlite3.connect("DATAMUSIK.db")
    c = conn.cursor()
    # Create Gn_Cyan_Bawah table
    c.execute('''CREATE TABLE IF NOT EXISTS Gn_Cyan_Bawah (
                ID INTEGER PRIMARY KEY,
                Level_R TEXT,
                Bass INT,                
                Trebel_Biasa INT,
                Trebel_Aneh INT
                )''')
    # Create Sub_Gn_Cyan_Bawah table
    c.execute('''CREATE TABLE IF NOT EXISTS Sub_Gn_Cyan_Bawah (
                Sub_ID INTEGER PRIMARY KEY,
                Level_D TEXT,
                Bass INT,                
                Trebel_Biasa INT,
                Trebel_Aneh INT
                )''')
    conn.commit()
    conn.close()
    
# Head Frame
head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)
head_frame.place()

# Content Frame
content_frame = tk.Frame(root)
content_frame.pack()

# Function to clear content frame
def clear_content_frame():
    for widget in content_frame.winfo_children():
        widget.destroy()
        
# Fungsi CRUD untuk Gn_Biru
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        for row in entry_rows:
            c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",        
            (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))         
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        for row in entry_rows:
            c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
            record = c.fetchone()
            if record:
                for col, value in enumerate(record):
                    row[col].delete(0, tk.END)
                    row[col].insert(0, int(value) if isinstance(value, float) else value)
            else:
                print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Gn_Cyan_Bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?",
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode()
    input_id_entry()                            
        
# Function to switch modes and update pages
def switch_mode(progres, mode):
    if mode[progres - 1] == "naik":
        mode[progres - 1] = "turun"
        setup_turun_mode(progres)
    else:
        mode[progres - 1] = "naik"
        setup_naik_mode(progres)
        
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3") 

# Current mode for each toggle button
current_mode = ['naik', 'naik', 'naik']
toggle_btns = []
indicator_labels = []
pages = [
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
]                                                
                                     
# Function to toggle menus
def toggle_menu(progres, mode):
    if mode[progres - 1] == 'naik':
        mode[progres - 1] = 'turun'
        toggle_btns[progres - 1].config(text="X _ T")
        pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
        indicator_labels[progres - 1].config(text="Turun")
    else:
        mode[progres - 1] = 'naik'
        toggle_btns[progres - 1].config(text="☰ _ N")
        pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
        indicator_labels[progres - 1].config(text="Naik")
    
    update_options_frame(progres)
    display_pages(progres)
    
# Function to display pages
def display_pages(progres):
    for widget in content_frame.winfo_children():
        widget.destroy()

    display_gn_cyan_bawah_page()

# Function to display default page
def display_gn_cyan_bawah_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
    
              
# Function to setup "Naik" mode
def setup_naik_mode(progres):
    if progres == 1:
        pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    elif progres == 2:
        pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    elif progres == 3:
        pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
    
# Function to setup "Turun" mode
def setup_turun_mode(progres):
    if progres == 1:
        pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
    elif progres == 2:
        pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
    elif progres == 3:
        pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
                 
# Toggle Button 1
toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))
toggle_btn1.pack(side=tk.LEFT)
toggle_btn1.place(x=5, y=20)
toggle_btns.append(toggle_btn1)

title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))
title_lb1.pack(side=tk.LEFT)
title_lb1.place(x=108, y=11)

indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label1.pack(side=tk.LEFT)
indicator_label1.place(x=127, y=55)
indicator_labels.append(indicator_label1)

# Toggle Button 2
toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))
toggle_btn2.pack(side=tk.LEFT)
toggle_btn2.place(x=232, y=20)
toggle_btns.append(toggle_btn2)

title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))
title_lb2.pack(side=tk.LEFT)
title_lb2.place(x=334, y=5)

indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label2.pack(side=tk.LEFT)
indicator_label2.place(x=368, y=55)
indicator_labels.append(indicator_label2)

# Toggle Button 3
toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))
toggle_btn3.pack(side=tk.LEFT)
toggle_btn3.place(x=460, y=20)
toggle_btns.append(toggle_btn3)

title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))
title_lb3.pack(side=tk.LEFT)
title_lb3.place(x=565, y=5)

indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label3.pack(side=tk.LEFT)
indicator_label3.place(x=599, y=55)
indicator_labels.append(indicator_label3)

head_frame.pack(side=tk.TOP, fill=tk.X)
head_frame.pack_propagate(False)
head_frame.configure(height=120)

options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300) 

# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)

# Function to clear content frame
def clear_content_frame():
    for widget in content_frame.winfo_children():
        widget.destroy()
                  
def open_data_gn_cyan_bawah_file():
    filepath = "DATA_Gn_Cyan_Bawah(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")      
                  
#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih 
gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")  

# Data Buttons
crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")
crud_btn.grid(row=5, column=0, padx=10, pady=5)

label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")
label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)

separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
     
# Frame untuk ID dan progres
frame_top = tk.Frame(root)
frame_top.pack(pady=10)

# CRUD Functions
def clear_entries():
    for row in entry_rows:
        for entry in row:
            entry.delete(0, tk.END)       

label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5, pady=5)

label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")
label_Level_Gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)

label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=2, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=2, column=1, padx=5, pady=5)

label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=3, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=3, column=1, padx=5, pady=5)

label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=4, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("Bass", "Trebel")
nada_combobox.grid(row=4, column=1, padx=5, pady=5)

separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)

# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)

# Label Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)

#Label dan Entry Ambil Gugusan nada Teroilih
label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")
label_bass_gn_cyan_atas.grid(row=7, column=1, padx=5, pady=5)
entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_gn_cyan_atas.grid(row=8, column=1, padx=5, pady=5)

label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")
label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)
entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)

label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)
entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)

label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)
entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)

# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna
def select_nada():
    id_value = entry_id.get()
    level_gn_value = int(entry_level_gn.get())
    progres_value = progres_var.get()
    mode_value = mode_var.get()
    nada_value = nada_var.get()

    if not all([id_value, level_gn_value, progres_value, mode_value, nada_value]):
        messagebox.showwarning("Warning", "Harap isi semua kolom!")
        return

    clear_all_entries()

    try:
        conn = sqlite3.connect("DATAMUSIK.db")
        c = conn.cursor()

        # Kondisi untuk menentukan kolom ID dan Sub_ID berdasarkan Level_Gn
        if level_gn_value in [1, 5, 9]:
            bass_id = 1
        elif level_gn_value in [2, 6, 10]:
            bass_id = 2
        elif level_gn_value in [3, 7, 11]:
            bass_id = 3
        elif level_gn_value in [4, 8, 12]:
            bass_id = 4
        else:
            messagebox.showerror("Error", "Level_Gn tidak valid!")
            return

        # Ambil data dari Gn_Cyan_Bawah
        c.execute('''
            SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Gn_Cyan_bawah
            WHERE ID=? AND ?=?
        ''', (bass_id, mode_value, progres_value))
        result_gn_cyan_bawah = c.fetchone()

        # Ambil data dari Sub_Gn_Cyan_bawah
        c.execute('''
            SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Sub_Gn_Cyan_bawah
            WHERE Sub_ID=1 AND ?=?
        ''', (mode_value, progres_value))
        result_sub_gn_cyan_bawah = c.fetchone()

        # Pengisian data Bass
        if nada_value == "Bass":
            if result_gn_cyan_bawah:
                entry_bass_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[0])
            if result_sub_gn_cyan_bawah:
                entry_bass_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[0])

        # Pengisian data Trebel
        elif nada_value == "Trebel":
            if result_gn_cyan_bawah:
                entry_trebel_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[1])
                entry_trebel_sub_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[2])
            if result_sub_gn_cyan_bawah:
                entry_trebel_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[1])

        conn.close()

    except Exception as e:
        messagebox.showerror("Error", f"Failed to fetch data: {e}")

# Fungsi untuk membersihkan semua entry
def clear_all_entries():
    entry_id.delete(0, tk.END)
    entry_level_gn.delete(0, tk.END)
    progres_var.set('')
    mode_var.set('')
    nada_var.set('')
    entry_bass_gn_cyan_bawah.delete(0, tk.END)
    entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)
    entry_trebel_gn_cyan_bawah.delete(0, tk.END)
    entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)

# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)

# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py 
active_page = None # Menyimpan halaman aktif
# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py
def run_gn_a_trebel_file():
    filepath = "CRUD_Gn_A_Trebel.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_biru_file():
    filepath = "CRUD_Gn_Biru.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_bawah_file():
    filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_atas_file():
    filepath = "CRUD_Gn_Cyan_Atas(gabung).py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")    
    
def run_gn_a_bass_file():
    filepath = "CRUD_Gn_A_Bass.py"
    try:
        with open(filepath, 'r') as file:
            exec(file.read(), globals())
        messagebox.showinfo("Success", "File executed successfully")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to execute file: {e}")                
               
# Function to display the options based on the current mode and progress
def update_options_frame(progres):
    # Clear existing buttons
    for widget in options_frame.winfo_children():
        widget.destroy()

    if current_mode[progres - 1] == "turun":
        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
        Gn_Cyan_Bawah_btn.place(x=3, y=0)
        
        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
        Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)    
        
        Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
        Gn_A_Trebel_btn.place(x=3, y=50)
        
        Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)    

    else: # Mode "naik"
        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
        Gn_Cyan_Bawah_btn.place(x=3, y=0)
        
        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
        Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)    

        Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
        Gn_Cyan_Atas_btn.place(x=3, y=50)
        
        Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)    

        Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
        Gn_A_Bass_btn.place(x=3, y=150)
        
        Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
        Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)
        
# Call update_options_frame for the initial setup
update_options_frame(1)

# Function to display Gn_A_Trebel page
def Gn_A_Trebel_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()      

# Function to display Gn_Biru page
def Gn_Biru_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()

# Function to display Gn_Cyan_Bawah page
def Gn_Cyan_Bawah_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
    
# Function to display Gn_Cyan_Atas page
def Gn_Cyan_Atas_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()    

# Function to display Gn_Biru page
def Gn_A_Bass_page():
    clear_content_frame()
    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()

# Initialize the default page
def init_default_page():
    update_options_frame(1)  # Default to showing options for Progres-1
    clear_content_frame()
    tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()
    
    #Fungsi tombol di options_frame        
    Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
    Gn_A_Trebel_btn.place(x=3, y=0)
    
    Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)  
        
    Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
    Gn_Biru_btn.place(x=3, y=50)
        
    Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)     
    
    Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
    Gn_Cyan_Bawah_btn.place(x=3, y=100)                  
    Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
    Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)    

    Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
    Gn_Cyan_Atas_btn.place(x=3, y=150)
        
    Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)    

    Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
    Gn_A_Bass_btn.place(x=3, y=200)
        
    Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
    Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)


# Main Function
if __name__ == "__main__":
    init_db()
    init_default_page()
    root.mainloop()


Untuk mengimplementasikan pengambilan data secara bersamaan dari tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` dan memasukkannya ke dalam `EntryBoxs` (yaitu `entry_bass_gn_cyan_atas` dan `entry_bass_sub_gn_cyan_atas`), kita perlu membuat fungsi yang akan menjalankan query pada kedua tabel tersebut, kemudian mengisi `EntryBoxs` dengan data yang diperoleh.

Berikut adalah modifikasi yang bisa diterapkan pada kode:

### 1. Tambahkan Fungsi untuk Mengambil Data Bass

```python
def ambil_data_bass():
    conn = sqlite3.connect("DATAMUSIK.db")
    c = conn.cursor()

    try:
        # Ambil data Bass dari Gn_Cyan_Bawah berdasarkan Level_R tertentu
        c.execute("SELECT Bass FROM Gn_Cyan_Bawah WHERE Level_R = ?", (entry_level_gn.get(),))
        bass_gn_cyan_bawah = c.fetchone()

        # Ambil data Bass dari Sub_Gn_Cyan_Bawah berdasarkan Level_D tertentu
        c.execute("SELECT Bass FROM Sub_Gn_Cyan_Bawah WHERE Level_D = ?", (entry_level_gn.get(),))
        bass_sub_gn_cyan_bawah = c.fetchone()

        # Masukkan data ke dalam EntryBoxs jika ditemukan
        if bass_gn_cyan_bawah:
            entry_bass_gn_cyan_atas.delete(0, tk.END)
            entry_bass_gn_cyan_atas.insert(0, bass_gn_cyan_bawah[0])

        if bass_sub_gn_cyan_bawah:
            entry_bass_sub_gn_cyan_atas.delete(0, tk.END)
            entry_bass_sub_gn_cyan_atas.insert(0, bass_sub_gn_cyan_bawah[0])

    except Exception as e:
        messagebox.showerror("Error", f"Gagal mengambil data Bass: {e}")
    finally:
        conn.close()
```

### 2. Integrasikan Fungsi dengan Tombol atau Event

Jika Anda ingin fungsi ini dipanggil secara otomatis ketika Level atau ID tertentu dimasukkan, Anda bisa mengintegrasikan fungsi ini pada event atau tombol tertentu:

```python
# Misalnya kita tambahkan pada tombol "Ambil Data"
btn_ambil_data_bass = tk.Button(frame_top, text="Ambil Data Bass", command=ambil_data_bass)
btn_ambil_data_bass.grid(row=9, column=1, padx=5, pady=5)
```

### 3. Uji Coba Fungsi

Sekarang, setelah semua sudah siap, Anda dapat menjalankan program dan mencoba mengambil data dari kedua tabel dengan menekan tombol "Ambil Data Bass". Data yang diperoleh akan dimasukkan ke dalam `EntryBoxs` yang sesuai.

### 4. Penyesuaian Tambahan

Jika ada kondisi atau logika tertentu yang ingin diterapkan saat mengambil data, pastikan untuk menambahkannya di dalam fungsi `ambil_data_bass` sesuai kebutuhan.

Dengan langkah ini, Anda akan bisa mengambil dan menampilkan data Bass dari kedua tabel (`Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`) secara bersamaan di dalam GUI.




Komentar

Postingan populer dari blog ini

Pemograman R Studio

  Metode Numerik Menggunakan R Pengantar Gambaran Isi Buku Cara Berkontribusi dalam Buku Ini Ucapan Terima Kasih Lisensi 1  Bahasa Pemrograman R 1.1  Sejarah R 1.2  Fitur dan Karakteristik R 1.3  Kelebihan dan Kekurangan R 1.4  RStudio 1.5  Menginstall R dan RStudio 1.6  Working Directory 1.6.1  Mengubah Lokasi Working Directory 1.6.2  Mengubah Lokasi Working Directory Default 1.7  Memasang dan Mengaktifkan Paket R 1.8  Fasilitas Help 1.8.1  Mencari Help dari Suatu Perintah Tertentu 1.8.2  General Help 1.8.3  Fasilitas Help Lainnya 1.9  Referensi 2  Kalkulasi Menggunakan R 2.1  Operator Aritmatik 2.2  Fungsi Aritmetik 2.3  Operator Relasi 2.4  Operator Logika 2.5  Memasukkan Nilai Kedalam Variabel 2.6  Tipe dan Struktur Data 2.7  Vektor 2.7.1  Membuat vektor 2.7.2  Missing Values 2.7.3  Subset Pada Vektor 2.7.4  Operasi Matematis Menggunakan Vektor ...

MIGRASI DATABASE DARI SQLite KE MySQL (Part-1)

  MIGRASI DATABASE DARI SQLite KE MySQL (Part-1) Pemakaian yang mana lebih baik dalam membuat database_musik di mysql atau Exel yang cell Cell pada tabel dilakukan operasi fungsi logika matematika. Untuk keperluan membuat database atau tabel yang memerlukan operasi logika atau matematika, seperti yang Anda sebutkan, MySQL jauh lebih baik dibandingkan Excel. Berikut adalah beberapa alasan mengapa MySQL lebih disarankan: 1. **Kapasitas dan Skalabilitas**: MySQL dapat menangani jumlah data yang jauh lebih besar daripada Excel. Ini penting jika Anda berencana untuk menyimpan banyak data atau melakukan operasi yang kompleks di atas data tersebut. 2. **Kekuatan dan Kinerja**: MySQL dirancang khusus untuk memproses query dan operasi basis data dengan cepat. Ini termasuk operasi matematika, logika, dan agregasi data yang umum dilakukan dalam aplikasi. 3. **Fleksibilitas Struktur**: Dalam MySQL, Anda dapat dengan mudah menentukan struktur tabel yang kompleks dan melakukan kueri yang lebih r...

Cara Menjadi Pengembang Front End – Keterampilan Front End Web Dev

  Menyumbangkan Belajar coding —  kurikulum 3.000 jam gratis 10 JUNI 2022 / #PENGEMBANGAN UJUNG DEPAN Bagaimana Menjadi Pengembang Front End – Keterampilan Front End Web Dev Joel Olawanle Beberapa profesional dengan bayaran tertinggi di dunia adalah pengembang front-end.  Mereka menggunakan pengetahuan dan bakat mereka untuk merancang situs web yang menarik dan ramah pengguna. Pengembang front-end tidak memerlukan gelar atau sertifikat sekolah untuk bekerja.  Sebaliknya, mereka harus memahami dasar-dasar pengembangan front-end, bahasa pemrograman, dan kerangka kerja pengembangan front-end. Dalam panduan ini, Anda akan belajar bagaimana menjadi pengembang front end dengan terlebih dahulu memahami apa yang dimaksud dengan pengembangan front end, keterampilan teknis dan soft skill yang diperlukan, bahasa dan kerangka kerja yang tersedia, dan beberapa langkah untuk memulai. Seorang pengembang front-end di Amerika Serikat dapat memperoleh rata-rata $86,178 per tahun, menu...