Langsung ke konten utama

KESELURUHAN KODE ISI FILE CRUD_Gn_Cyan_Atas_Trebel.py

 KESELURUHAN KODE ISI FILE CRUD_Gn_Cyan_Atas_Trebel.py


Jadi keseluruhan kode untuk file: CRUD_Gn_Cyan_Atas_Trebel.py adalah berikut ini:


import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas")


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10)  # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

frame_top.grid_columnconfigure(0, minsize=-20)  # Tambahkan kolom negatif (menggeser ke kiri)


# Definisikan entry untuk level_gn dan id, dan combobox di bawah 

label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")

label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)

entry_level_gn = tk.Entry(frame_top)

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


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

label_id_selected.grid(row=2, column=0, padx=0, pady=7)

entry_id = tk.Entry(frame_top)

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


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

label_progres.grid(row=3, column=0, padx=0, pady=7)

progres_var = tk.StringVar()

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

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

progres_combobox.grid(row=3, column=1, padx=0, pady=7)


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

label_mode.grid(row=4, column=0, padx=0, pady=7)

mode_var = tk.StringVar()

mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])

mode_combobox.grid(row=4, column=1, padx=0, pady=7)


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

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

nada_var = tk.StringVar()

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

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

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


def update_combobox_trebel(event):

    # Hapus opsi yang ada sebelumnya

    combobox_trebel.set('')

    combobox_trebel['values'] = []


    # Cek nilai yang dipilih pada combobox_nada

    nada_selected = nada_combobox.get()

    if nada_selected == "Trebel":

        # Jika Trebel dipilih, tambahkan opsi untuk combobox_trebel

        

        combobox_trebel['values'] = ["Trebel_1", "Trebel_2", "Trebel_3", "Trebel_4", "Trebel_5"]

        trebel_var = tk.StringVar()

        combobox_trebel.grid(row=6, column=1, padx=10, pady=10)  # Menampilkan combobox_trebel

    else:

        combobox_trebel.grid_remove()  # Sembunyikan combobox_trebel jika bukan Trebel yang dipilih


# Label untuk combobox Trebel

label_trebel = ttk.Label(frame_top, text="Pilih Trebel:")

label_trebel.grid(row=6, column=0, padx=10, pady=10)


# Combobox Trebel (Kosongkan awalnya)

combobox_trebel = ttk.Combobox(frame_top, state="readonly")

combobox_trebel.grid(row=6, column=1, padx=10, pady=10)

combobox_trebel.grid_remove()  # Sembunyikan combobox_trebel saat awal


# Tambahkan callback pada perubahan nilai di combobox_nada

nada_combobox.bind("<<ComboboxSelected>>", update_combobox_trebel)


# Fungsi untuk mengambil data Gn_Cyan_Atas dari database berdasarkan ID

def get_data_gn_cyan_atas_from_db(id_selected):

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

    cursor = conn.cursor()

    cursor.execute(" SELECT * FROM Gn_Cyan_Atas WHERE ID = ?", (id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data

        

# Fungsi untuk mengambil data Sub_Gn_Cyan_Bawah dari database berdasarkan Sub_ID

def get_data_sub_gn_cyan_atas_from_db(sub_id_selected):

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

    cursor = conn.cursor()

    cursor.execute("SELECT * FROM Sub_Gn_Cyan_Atas WHERE Sub_ID = ?", (sub_id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn == 1:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 2:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 3:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 4:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 5:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 6:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 7:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 8:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 9:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 10:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 11:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 12:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        else:

            messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")

            reset_entries()


    except ValueError:

        messagebox.showerror("Error", "Input harus berupa angka.")

        reset_entries()

        

# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly')  # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow",  command=validate_level_gn)

validate_button.grid(row=1, column=2, padx=0, pady=7)


def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())  # Mengubah progres menjadi integer

        mode_selected = mode_var.get().lower()

        nada_selected = nada_var.get().lower()

        trebel_selected = combobox_trebel.get().lower()

        

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

        cursor = conn.cursor()


        # Mengambil data dari tabel Gn_Cyan_Atas berdasarkan ID

        cursor.execute("SELECT Trebel_1, Trebel_2, Trebel_3, Trebel_4, Trebel_5 FROM Gn_Cyan_Atas WHERE ID = ?", (id_selected,))

        data_gn_cyan_atas = cursor.fetchone()


        # Mengambil data dari tabel Sub_Gn_Cyan_Atas berdasarkan Sub_ID (dalam hal ini Sub_ID = 1)

        cursor.execute("SELECT Trebel_1, Trebel_2, Trebel_3, Trebel_4, Trebel_5 FROM Sub_Gn_Cyan_Atas WHERE Sub_ID = ?", (1,))

        data_sub_gn_cyan_atas = cursor.fetchone()

        

        conn.close()

        

        # Pastikan data dari database ada

        if not data_gn_cyan_atas:

            messagebox.showerror("Error", "Data tidak ditemukan di tabel Gn_Cyan_Atas.")

            return

        

        if not data_sub_gn_cyan_atas:

            messagebox.showerror("Error", "Data tidak ditemukan di tabel Sub_Gn_Cyan_Atas.")

            return


        # Inisialisasi index_trebel berdasarkan pilihan Trebel

        trebel_index_map = {

            "trebel_1": 0,

            "trebel_2": 1,

            "trebel_3": 2,

            "trebel_4": 3,

            "trebel_5": 4

        }

        if trebel_selected not in trebel_index_map:

            messagebox.showerror("Error", "Pilihan Trebel tidak valid.")

            return

        index_trebel = trebel_index_map[trebel_selected]


        if data_gn_cyan_atas or data_sub_gn_cyan_atas:

            if mode_selected == "naik" or "turun":

                if progres_selected == 1 and nada_selected == "trebel":

            # Logika untuk Progres 1

                    entry_trebel.delete(0, tk.END)

                    entry_trebel.insert(0, data_gn_cyan_atas[index_trebel])  # Ambil data dari Gn_Cyan_Atas berdasarkan index_trebel

                    entry_sub_trebel.delete(0, tk.END)

                    entry_sub_trebel.insert(0, data_sub_gn_cyan_atas[index_trebel])  # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel


                elif progres_selected == 2 and nada_selected == "trebel":

            # Logika untuk Progres 2

                    entry_sub_trebel.delete(0, tk.END)   

                    entry_sub_trebel.insert(0, adjust_trebel_value(data_sub_gn_cyan_atas[index_trebel], 1))              # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel


                elif progres_selected == 3 and nada_selected == "trebel":

            # Logika untuk Progres 3

                    entry_sub_trebel.delete(0, tk.END)   

                    entry_sub_trebel.insert(0, adjust_trebel_value(data_sub_gn_cyan_atas[index_trebel], 2))                 # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel

                                       

        # Inisialisasi index_id berdasarkan pilihan ID

        if id_selected == 1: 

            index_id = 0

        elif id_selected == 2: 

            index_id = 1

        elif id_selected == 3: 

            index_id = 2                     

        else:

            messagebox.showerror("Error", "Pilihan ID tidak valid.")

            return        

            

        if id_selected in [1, 2, 3] and  mode_selected == "naik" or "turun":

            if index_id + 1 == 1:          

                id_selected = 1                     

            elif index_id + 1 == 2:        

                id_selected == 2                              

            elif index_id + 1 >= 3:            

                id_selected == 3                         

            elif index_id - 1 == 1:            

                id_selected == 3                    

            elif index_id - 1 == 0:        

                id_selected == 2                              

            elif index_id - 1 <= -1:          

                id_selected == 1   

            else:

                messagebox.showerror("Error", "Penyesuaian ID tidak valid.")

                return                                     

    

        # Penyesuaian ID berdasarkan level_gn_selected

        def adjust_id(level_gn_selected):

            if level_gn_selected in [1, 4, 6, 11]:

                return 1, 0

            elif level_gn_selected in [2, 7, 9, 12]:

                return 2, 1

            elif level_gn_selected in [3, 5, 8, 10]:

                return 3, 2

            else:

                messagebox.showerror("Error", "Level_Gn tidak valid.")

                return None, None

        id_selected, index_id = adjust_id(level_gn_selected)

        if id_selected is None:

            return   


        if data_gn_cyan_atas:

    # Aturan mode naik: id_selected bertambah sesuai dengan progres - 1

            new_id = id_selected + (progres_selected - 1)

            print(f"new_id: {new_id}")  # Debugging: lihat apakah new_id benar

    # Pengecualian jika new_id > 3, maka berputar kembali ke id 1 atau id 2

            if new_id == 4:

                new_id = 1

            elif new_id == 5:

                new_id = 2


            # Aturan mode turun: id_selected berkurang sesuai dengan progres - 1

            new_id = id_selected - (progres_selected - 1)        

            if new_id == 0:

                new_id = 3

            elif new_id == -1:

                new_id = 2                

            print(f"Adjusted new_id after exception: {new_id}")  


# Logika utama untuk mengambil dan menampilkan data Trebel_1 hingga Trebel_5

            if 0 <= index_trebel <= 4:  # Pastikan index berada dalam rentang 0 hingga 4

                trebel_value = data_gn_cyan_atas[index_trebel]  # Ambil Trebel berdasarkan index_trebel

                print(f"trebel_value (dari index_trebel): {trebel_value}")  # Debugging: pastikan trebel_value diambil dengan benar            

                if progres_selected == 2 and mode_selected == "naik":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 2  # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[2]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  # Debugging: pastikan new_id_value diambil dengan benar

                        entry_trebel.delete(0, tk.END)                          

                # Hitung final_adjustment dengan pengurangan untuk digit pertama dan gabungkan digit kedua

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  # Debugging: lihat hasil final_adjustment

                # Masukkan hasilnya ke entry_trebel

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 3  

                        new_id_value = data_gn_cyan_atas[3]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 1  

                        new_id_value = data_gn_cyan_atas[1]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)         

                        

                elif progres_selected == 3 and mode_selected == "naik":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 3  # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[3]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  # Debugging: pastikan new_id_value diambil dengan benar

                        entry_trebel.delete(0, tk.END)                          

                # Hitung final_adjustment dengan pengurangan untuk digit pertama dan gabungkan digit kedua

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  # Debugging: lihat hasil final_adjustment

                # Masukkan hasilnya ke entry_trebel

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 1 

                        new_id_value = data_gn_cyan_atas[1]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 2  

                        new_id_value = data_gn_cyan_atas[2]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                        

                    else:

                        messagebox.showerror("Error", f"ID: {id_selected}, Nada: {nada_selected} tidak valid untuk Progres dan Mode")

                        return

                                                

                if progres_selected == 2 and mode_selected == "turun":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 3  

                        new_id_value = data_gn_cyan_atas[3]  

                        print(f"new_id_value (dari index_trebel): {new_id_value}") 

                        entry_trebel.delete(0, tk.END)                          

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}") 

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 1 

                        new_id_value = data_gn_cyan_atas[1]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 2  

                        new_id_value = data_gn_cyan_atas[2]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                                    

  

                if progres_selected == 3 and mode_selected == "turun":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 2 

                        new_id_value = data_gn_cyan_atas[2]  

                        print(f"new_id_value (dari index_trebel): {new_id_value}") 

                        entry_trebel.delete(0, tk.END)                          

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}") 

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 3

                        new_id_value = data_gn_cyan_atas[3]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 1 

                        new_id_value = data_gn_cyan_atas[1]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                                   

                    else:

                        messagebox.showerror("Error", f"ID: {id_selected}, Nada: {nada_selected} tidak valid untuk Progres dan Mode")

                        return


    except ValueError:

        messagebox.showerror("Error", "Input harus berupa angka yang valid.")

    except IndexError:

        messagebox.showerror("Error", "Indeks data tidak valid, pastikan data yang diakses memiliki cukup karakter.")

    except Exception as e:

        messagebox.showerror("Error", f"Terjadi kesalahan: {str(e)}")                        


    finally:

    # Menghapus status read-only sementara

        entry_id.config(state='normal')


    # Bersihkan atau reset entry dan combobox setelah tombol pilih_nada ditekan

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('')

        mode_combobox.set('')

        nada_combobox.set('')


    # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')


    # Pastikan reset_entries() adalah fungsi valid yang digunakan untuk mereset komponen lainnya

        reset_entries()


# Fungsi untuk menyesuaikan nilai sub trebel berdasarkan progres

def adjust_trebel_value(trebel_value, progres):

    if trebel_value.isdigit():

        adjusted_value = ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)

    else:

        adjusted_value = trebel_value

    return adjusted_value    

        

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    # Pastikan digit pertama dari trebel_value adalah digit

    if trebel_value.isdigit():

        # Modifikasi digit pertama dengan mengurangkan 'pengurang' yang ditentukan

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        # Jika bukan digit, tidak diubah

        digit_pertama = trebel_value

    # Ambil digit kedua dan seterusnya dari new_id_value dan kurangi 2 untuk setiap digit

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 2) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  # Jika bukan digit, tidak diubah

    # Gabungkan digit pertama dengan digit kedua dan seterusnya

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value

    

def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        digit_pertama = trebel_value

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 2) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    # Pastikan digit pertama dari trebel_value adalah digit

    if trebel_value.isdigit():

        # Modifikasi digit pertama dengan mengurangkan 'pengurang' yang ditentukan

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        # Jika bukan digit, tidak diubah

        digit_pertama = trebel_value

    # Ambil digit kedua dan seterusnya dari new_id_value dan kurangi 2 untuk setiap digit

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 3) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  # Jika bukan digit, tidak diubah

    # Gabungkan digit pertama dengan digit kedua dan seterusnya

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value

                    

def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        digit_pertama = trebel_value

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 3) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value


#label dan entry

label_trebel_gn_cyan_atas = tk.Label(frame_top, text="Trebel Gn_Cyan_Atas:")

label_trebel_gn_cyan_atas.grid(row=10, column=0, padx=0, pady=7)

entry_trebel = tk.Entry(frame_top)

entry_trebel.grid(row=10, column=1, padx=0, pady=7)


label_trebel_sub_gn_cyan_atas = tk.Label(frame_top, text="Sub Trebel Gn_Cyan_Atas:")

label_trebel_sub_gn_cyan_atas.grid(row=11, column=0, padx=0, pady=7)

entry_sub_trebel = tk.Entry(frame_top)

entry_sub_trebel.grid(row=11, column=1, padx=0, pady=7)


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

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


# Tombol untuk menjalankan fungsi pilih_nada

button_pilih_nada = tk.Button(frame_top, text="Pilih Nada", bg="lightgreen", command=pilih_nada)

button_pilih_nada.grid(row=8, column=1, padx=0, pady=7)


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

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


root.mainloop()


Tolong beri arti dari penulisan kode berikut:

def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    # Pastikan digit pertama dari trebel_value adalah digit

    if trebel_value.isdigit():

        # Modifikasi digit pertama dengan mengurangkan 'pengurang' yang ditentukan

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        # Jika bukan digit, tidak diubah

        digit_pertama = trebel_value

    # Ambil digit kedua dan seterusnya dari new_id_value dan kurangi 2 untuk setiap digit

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 3) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:] # Jika bukan digit, tidak diubah

    # Gabungkan digit pertama dengan digit kedua dan seterusnya

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value


                elif progres_selected == 3 and mode_selected == "naik":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 3 # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[3] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}") # Debugging: pastikan new_id_value diambil dengan benar

                        entry_trebel.delete(0, tk.END)                          

                # Hitung final_adjustment dengan pengurangan untuk digit pertama dan gabungkan digit kedua

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}") # Debugging: lihat hasil final_adjustment

                # Masukkan hasilnya ke entry_trebel

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 1 

                        new_id_value = data_gn_cyan_atas[1] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 2  

                        new_id_value = data_gn_cyan_atas[2] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)            


Penjelasan kode di atas adalah sebagai berikut:


### Fungsi `adjust_id_trebel_progres3_naik_value`

Fungsi ini bertugas memodifikasi nilai dari suatu string berdasarkan aturan berikut:


1. **Mengecek apakah nilai pertama dari `trebel_value` adalah digit**:

   - Jika benar, maka digit pertama dari `trebel_value` akan dikurangi dengan nilai `pengurang` yang ditentukan (dalam kasus ini `pengurang=2`).

   - Jika bukan digit, maka nilai pertama tetap seperti semula tanpa perubahan.


2. **Mengecek apakah `new_id_value` merupakan digit**:

   - Jika benar, maka setiap digit kedua dan seterusnya dari `new_id_value` akan dikurangi sebesar 3.

   - Jika bukan digit, maka digit kedua dan seterusnya tetap seperti semula.


3. **Menggabungkan hasil**:

   - Digit pertama yang telah dikurangi akan digabungkan dengan hasil pengurangan pada digit kedua dan seterusnya dari `new_id_value`.


4. **Pengembalian hasil**:

   - Nilai hasil penggabungan ini kemudian dikembalikan sebagai output dari fungsi.


Contoh:

- Misalkan `trebel_value = "3"`, `new_id_value = "456"`, dan `pengurang = 2`. Maka digit pertama (`3`) dikurangi 2 menjadi `1`, dan digit kedua serta seterusnya dari `456` akan menjadi `12` (`5-3=2` dan `6-3=3`). Hasil akhirnya adalah "112".


### Penggunaan Fungsi di Dalam Logika Program:

Kode ini menggunakan logika berdasarkan **progres** dan **mode** yang dipilih.


- **Jika `progres_selected == 3` dan `mode_selected == "naik"`**:

  - Kode memproses data `trebel_value` untuk setiap ID yang dipilih (1, 2, atau 3) sesuai dengan logika berikut:


    1. **Untuk ID 1 dan nada "trebel"**:

       - `new_id_value` diambil dari data `data_gn_cyan_atas[3]`.

       - Fungsi `adjust_id_trebel_progres3_naik_value` kemudian digunakan untuk memodifikasi nilai `trebel_value` dan `new_id_value`.

       - Hasil akhir dimasukkan kembali ke dalam `entry_trebel`.


    2. **Untuk ID 2 dan nada "trebel"**:

       - `new_id_value` diambil dari data `data_gn_cyan_atas[1]`.

       - Sama seperti sebelumnya, hasil dari `adjust_id_trebel_progres3_naik_value` dimasukkan ke `entry_trebel`.


    3. **Untuk ID 3 dan nada "trebel"**:

       - `new_id_value` diambil dari data `data_gn_cyan_atas[2]`.

       - Proses modifikasi dengan fungsi yang sama dan hasil dimasukkan ke `entry_trebel`.


### Kesimpulan:

Kode ini digunakan untuk memodifikasi nilai dari kolom `trebel` berdasarkan ID, progres, dan mode yang dipilih. Fungsi `adjust_id_trebel_progres3_naik_value` mengubah digit pertama dari `trebel_value` dengan mengurangkan angka yang ditentukan (`pengurang`), lalu menggabungkannya dengan digit kedua dan seterusnya dari `new_id_value`, di mana setiap digit kedua dan seterusnya dikurangi dengan angka tetap (3). Hasil modifikasi ini kemudian ditampilkan di widget tkinter `entry_trebel`.


Kalau kode berikut apa arti penulisannya:

                        new_id = 3 # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[3] # Data berdasarkan index_trebel

      

Penulisan kode berikut memiliki arti sebagai berikut:


```python

new_id = 3 # Menetapkan new_id untuk logika khusus ini

```

- Kode ini menetapkan nilai `new_id` sebagai **3**. Artinya, `new_id` digunakan sebagai variabel untuk menyimpan angka **3** dalam konteks logika tertentu. Mungkin logika khusus ini membutuhkan `new_id` sebagai **3** untuk proses lebih lanjut yang terkait dengan ID tertentu atau pengambilan data lainnya.


```python

new_id_value = data_gn_cyan_atas[3] # Data berdasarkan index_trebel

```

- Baris ini mengambil **data** dari struktur `data_gn_cyan_atas` pada **index ke-3** dan menyimpannya dalam variabel `new_id_value`. 

- `data_gn_cyan_atas` mungkin merupakan list atau array yang berisi data-data tertentu, dan `data_gn_cyan_atas[3]` berarti mengambil elemen yang berada pada posisi ke-4 (karena indexing dimulai dari 0).

- Data yang diambil dari `index ke-3` ini kemudian akan digunakan untuk proses lebih lanjut, mungkin untuk memodifikasi atau digunakan bersama dengan `new_id` dan data lainnya.


### Kesimpulan:

Kode ini:

1. Menetapkan `new_id` menjadi 3, untuk logika atau proses tertentu.

2. Mengambil data dari array/list `data_gn_cyan_atas` pada index ke-3, yang akan digunakan lebih lanjut dalam proses yang sedang berjalan.   


data_gn_cyan_atas[3] ini apakah mengambil data berdasarkan index_trebel ataukah index_id


Dalam konteks kode yang diberikan, `data_gn_cyan_atas[3]` mengambil data dari indeks ke-3 dari struktur `data_gn_cyan_atas`. Namun, apakah ini terkait dengan **index_trebel** atau **index_id** bergantung pada bagaimana struktur `data_gn_cyan_atas` disusun dan digunakan dalam program.


Jika dalam struktur `data_gn_cyan_atas` data disimpan berdasarkan **index_trebel** (yang merujuk pada nada Trebel dalam musik), maka pengambilan `data_gn_cyan_atas[3]` berarti mengambil data pada posisi ke-4 yang relevan dengan nada Trebel tertentu.


Namun, jika `data_gn_cyan_atas` menyimpan data berdasarkan **index_id** (yang mungkin berhubungan dengan ID tertentu dari data yang lebih umum), maka `data_gn_cyan_atas[3]` merujuk pada data ID ke-3 (atau ke-4 jika indeks mulai dari 0) dalam list tersebut.


Untuk menjawab pertanyaan dengan tepat, kita perlu melihat bagaimana **data_gn_cyan_atas** disusun dan apa yang diwakili oleh indeks dalam struktur data tersebut. Jika ada penjelasan sebelumnya dalam kode atau dokumentasi bahwa indeks tersebut merujuk pada **index_trebel**, maka itulah konteks yang dipakai. Sebaliknya, jika indeks mewakili ID, maka itu merujuk pada **index_id**.


Berdasarkan baris ini:

```python

new_id_value = data_gn_cyan_atas[3] # Data berdasarkan index_trebel

```

Komentar menyebutkan bahwa data ini diambil berdasarkan **index_trebel**, jadi kemungkinan besar struktur ini memang dirancang untuk menyimpan data nada Trebel.


Jadi kalau mengambil data berdasarkan index_id, bagaimana bentuk penulisan kodenya.


Jika ingin mengambil data berdasarkan **index_id**, penulisan kodenya akan bergantung pada bagaimana data disusun dalam struktur tersebut. Misalnya, jika `data_gn_cyan_atas` adalah list atau dictionary yang menyimpan data dengan menggunakan **index_id**, maka kode akan sedikit berbeda bergantung pada jenis strukturnya.


Berikut beberapa contoh skenario:


### 1. **Jika `data_gn_cyan_atas` adalah List dan menggunakan index_id sebagai indeks:**

```python

# Misal data_gn_cyan_atas adalah list dengan data berdasarkan index_id

data_gn_cyan_atas = ['data_id_0', 'data_id_1', 'data_id_2', 'data_id_3']


# Mengambil data berdasarkan index_id

index_id = 3

new_id_value = data_gn_cyan_atas[index_id]

print(f"Data berdasarkan index_id {index_id}: {new_id_value}")

```

Dalam contoh ini, `data_gn_cyan_atas[index_id]` akan mengambil data di posisi ke-3 dalam list (karena list dimulai dari indeks 0).


### 2. **Jika `data_gn_cyan_atas` adalah Dictionary dengan index_id sebagai kunci:**

```python

# Misal data_gn_cyan_atas adalah dictionary dengan index_id sebagai kunci

data_gn_cyan_atas = {

    1: 'data_id_1',

    2: 'data_id_2',

    3: 'data_id_3',

    4: 'data_id_4'

}


# Mengambil data berdasarkan index_id

index_id = 3

new_id_value = data_gn_cyan_atas.get(index_id, 'Data tidak ditemukan')

print(f"Data berdasarkan index_id {index_id}: {new_id_value}")

```

Dalam contoh ini, `data_gn_cyan_atas.get(index_id)` akan mengambil data dengan kunci yang sesuai dengan **index_id** yang ditentukan.


### 3. **Jika `data_gn_cyan_atas` adalah List of Dictionaries dan index_id adalah salah satu atribut di dalam dictionary:**

```python

# Misal data_gn_cyan_atas adalah list yang berisi dictionary dengan atribut index_id

data_gn_cyan_atas = [

    {'index_id': 1, 'data': 'data_id_1'},

    {'index_id': 2, 'data': 'data_id_2'},

    {'index_id': 3, 'data': 'data_id_3'}

]


# Mengambil data berdasarkan index_id

index_id = 3

new_id_value = next((item['data'] for item in data_gn_cyan_atas if item['index_id'] == index_id), 'Data tidak ditemukan')

print(f"Data berdasarkan index_id {index_id}: {new_id_value}")

```

Dalam contoh ini, kita menggunakan `next()` untuk mencari item dalam list yang memiliki `index_id` yang cocok, lalu mengambil data dari item tersebut.


### Kesimpulan:

Cara mengambil data berdasarkan **index_id** sangat bergantung pada struktur data yang digunakan. Jika **index_id** adalah indeks dalam list, maka kita cukup menggunakan indeks tersebut langsung. Jika **index_id** adalah kunci dalam dictionary, kita dapat menggunakan kunci untuk mengambil nilai yang sesuai.


Kalau begitu, kode keseluruhan untuk file CRUD_Gn_Cyan_Atas_Trebe.py akan menjadi seperti berikut ini:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas")


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)


# Definisikan entry untuk level_gn dan id, dan combobox di bawah 

label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")

label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)

entry_level_gn = tk.Entry(frame_top)

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


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

label_id_selected.grid(row=2, column=0, padx=0, pady=7)

entry_id = tk.Entry(frame_top)

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


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

label_progres.grid(row=3, column=0, padx=0, pady=7)

progres_var = tk.StringVar()

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

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

progres_combobox.grid(row=3, column=1, padx=0, pady=7)


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

label_mode.grid(row=4, column=0, padx=0, pady=7)

mode_var = tk.StringVar()

mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])

mode_combobox.grid(row=4, column=1, padx=0, pady=7)


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

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

nada_var = tk.StringVar()

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

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

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


def update_combobox_trebel(event):

    # Hapus opsi yang ada sebelumnya

    combobox_trebel.set('')

    combobox_trebel['values'] = []


    # Cek nilai yang dipilih pada combobox_nada

    nada_selected = nada_combobox.get()

    if nada_selected == "Trebel":

        # Jika Trebel dipilih, tambahkan opsi untuk combobox_trebel

        

        combobox_trebel['values'] = ["Trebel_1", "Trebel_2", "Trebel_3", "Trebel_4", "Trebel_5"]

        trebel_var = tk.StringVar()

        combobox_trebel.grid(row=6, column=1, padx=10, pady=10) # Menampilkan combobox_trebel

    else:

        combobox_trebel.grid_remove() # Sembunyikan combobox_trebel jika bukan Trebel yang dipilih


# Label untuk combobox Trebel

label_trebel = ttk.Label(frame_top, text="Pilih Trebel:")

label_trebel.grid(row=6, column=0, padx=10, pady=10)


# Combobox Trebel (Kosongkan awalnya)

combobox_trebel = ttk.Combobox(frame_top, state="readonly")

combobox_trebel.grid(row=6, column=1, padx=10, pady=10)

combobox_trebel.grid_remove() # Sembunyikan combobox_trebel saat awal


# Tambahkan callback pada perubahan nilai di combobox_nada

nada_combobox.bind("<<ComboboxSelected>>", update_combobox_trebel)


# Fungsi untuk mengambil data Gn_Cyan_Atas dari database berdasarkan ID

def get_data_gn_cyan_atas_from_db(id_selected):

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

    cursor = conn.cursor()

    cursor.execute(" SELECT * FROM Gn_Cyan_Atas WHERE ID = ?", (id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data

        

# Fungsi untuk mengambil data Sub_Gn_Cyan_Bawah dari database berdasarkan Sub_ID

def get_data_sub_gn_cyan_atas_from_db(sub_id_selected):

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

    cursor = conn.cursor()

    cursor.execute("SELECT * FROM Sub_Gn_Cyan_Atas WHERE Sub_ID = ?", (sub_id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn == 1:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 2:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 3:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 4:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 5:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 6:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 7:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 8:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 9:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn == 10:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        elif level_gn == 11:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn == 12:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        else:

            messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")

            reset_entries()


    except ValueError:

        messagebox.showerror("Error", "Input harus berupa angka.")

        reset_entries()

        

# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)

validate_button.grid(row=1, column=2, padx=0, pady=7)


def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get()) # Mengubah progres menjadi integer

        mode_selected = mode_var.get().lower()

        nada_selected = nada_var.get().lower()

        trebel_selected = combobox_trebel.get().lower()

        

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

        cursor = conn.cursor()


        # Mengambil data dari tabel Gn_Cyan_Atas berdasarkan ID

        cursor.execute("SELECT Trebel_1, Trebel_2, Trebel_3, Trebel_4, Trebel_5 FROM Gn_Cyan_Atas WHERE ID = ?", (id_selected,))

        data_gn_cyan_atas = cursor.fetchone()


        # Mengambil data dari tabel Sub_Gn_Cyan_Atas berdasarkan Sub_ID (dalam hal ini Sub_ID = 1)

        cursor.execute("SELECT Trebel_1, Trebel_2, Trebel_3, Trebel_4, Trebel_5 FROM Sub_Gn_Cyan_Atas WHERE Sub_ID = ?", (1,))

        data_sub_gn_cyan_atas = cursor.fetchone()

        

        conn.close()

        

        # Pastikan data dari database ada

        if not data_gn_cyan_atas:

            messagebox.showerror("Error", "Data tidak ditemukan di tabel Gn_Cyan_Atas.")

            return

        

        if not data_sub_gn_cyan_atas:

            messagebox.showerror("Error", "Data tidak ditemukan di tabel Sub_Gn_Cyan_Atas.")

            return


        # Inisialisasi index_trebel berdasarkan pilihan Trebel

        trebel_index_map = {

            "trebel_1": 0,

            "trebel_2": 1,

            "trebel_3": 2,

            "trebel_4": 3,

            "trebel_5": 4

        }

        if trebel_selected not in trebel_index_map:

            messagebox.showerror("Error", "Pilihan Trebel tidak valid.")

            return

        index_trebel = trebel_index_map[trebel_selected]


        if data_gn_cyan_atas or data_sub_gn_cyan_atas:

            if mode_selected == "naik" or "turun":

                if progres_selected == 1 and nada_selected == "trebel":

            # Logika untuk Progres 1

                    entry_trebel.delete(0, tk.END)

                    entry_trebel.insert(0, data_gn_cyan_atas[index_trebel]) # Ambil data dari Gn_Cyan_Atas berdasarkan index_trebel

                    entry_sub_trebel.delete(0, tk.END)

                    entry_sub_trebel.insert(0, data_sub_gn_cyan_atas[index_trebel]) # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel


                elif progres_selected == 2 and nada_selected == "trebel":

            # Logika untuk Progres 2

                    entry_sub_trebel.delete(0, tk.END)   

                    entry_sub_trebel.insert(0, adjust_trebel_value(data_sub_gn_cyan_atas[index_trebel], 1)) # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel


                elif progres_selected == 3 and nada_selected == "trebel":

            # Logika untuk Progres 3

                    entry_sub_trebel.delete(0, tk.END)   

                    entry_sub_trebel.insert(0, adjust_trebel_value(data_sub_gn_cyan_atas[index_trebel], 2)) # Ambil data dari Sub_Gn_Cyan_Atas berdasarkan index_trebel

                                       

        # Inisialisasi index_id berdasarkan pilihan ID

        if id_selected == 1: 

            index_id = 0

        elif id_selected == 2: 

            index_id = 1

        elif id_selected == 3: 

            index_id = 2                     

        else:

            messagebox.showerror("Error", "Pilihan ID tidak valid.")

            return        

            

        if id_selected in [1, 2, 3] and mode_selected == "naik" or "turun":

            if index_id + 1 == 1:          

                id_selected = 1                     

            elif index_id + 1 == 2:        

                id_selected == 2                              

            elif index_id + 1 >= 3:            

                id_selected == 3                         

            elif index_id - 1 == 1:            

                id_selected == 3                    

            elif index_id - 1 == 0:        

                id_selected == 2                              

            elif index_id - 1 <= -1:          

                id_selected == 1   

            else:

                messagebox.showerror("Error", "Penyesuaian ID tidak valid.")

                return                                     

    

        # Penyesuaian ID berdasarkan level_gn_selected

        def adjust_id(level_gn_selected):

            if level_gn_selected in [1, 4, 6, 11]:

                return 1, 0

            elif level_gn_selected in [2, 7, 9, 12]:

                return 2, 1

            elif level_gn_selected in [3, 5, 8, 10]:

                return 3, 2

            else:

                messagebox.showerror("Error", "Level_Gn tidak valid.")

                return None, None

        id_selected, index_id = adjust_id(level_gn_selected)

        if id_selected is None:

            return   


        if data_gn_cyan_atas:

    # Aturan mode naik: id_selected bertambah sesuai dengan progres - 1

            new_id = id_selected + (progres_selected - 1)

            print(f"new_id: {new_id}") # Debugging: lihat apakah new_id benar

    # Pengecualian jika new_id > 3, maka berputar kembali ke id 1 atau id 2

            if new_id == 4:

                new_id = 1

            elif new_id == 5:

                new_id = 2


            # Aturan mode turun: id_selected berkurang sesuai dengan progres - 1

            new_id = id_selected - (progres_selected - 1)        

            if new_id == 0:

                new_id = 3

            elif new_id == -1:

                new_id = 2                

            print(f"Adjusted new_id after exception: {new_id}")  


# Logika utama untuk mengambil dan menampilkan data Trebel_1 hingga Trebel_5

            if 0 <= index_trebel <= 4: # Pastikan index berada dalam rentang 0 hingga 4

                trebel_value = data_gn_cyan_atas[index_trebel] # Ambil Trebel berdasarkan index_trebel

                print(f"trebel_value (dari index_trebel): {trebel_value}") # Debugging: pastikan trebel_value diambil dengan benar            

                if progres_selected == 2 and mode_selected == "naik":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 2 or index_id == 1 # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}") # Debugging: pastikan new_id_value diambil dengan benar

                        entry_trebel.delete(0, tk.END)                          

                # Hitung final_adjustment dengan pengurangan untuk digit pertama dan gabungkan digit kedua

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}") # Debugging: lihat hasil final_adjustment

                # Masukkan hasilnya ke entry_trebel

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 3 or index_id == 2

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 1 or index_id == 0

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)         

                        

                elif progres_selected == 3 and mode_selected == "naik":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 3 or index_id == 2 # Menetapkan new_id untuk logika khusus ini

        # Ambil data dari new_id_value untuk digit kedua dan seterusnya

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}") # Debugging: pastikan new_id_value diambil dengan benar

                        entry_trebel.delete(0, tk.END)                          

                # Hitung final_adjustment dengan pengurangan untuk digit pertama dan gabungkan digit kedua

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}") # Debugging: lihat hasil final_adjustment

                # Masukkan hasilnya ke entry_trebel

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 1 or index_id == 0

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 2 or index_id == 1 

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                        

                    else:

                        messagebox.showerror("Error", f"ID: {id_selected}, Nada: {nada_selected} tidak valid untuk Progres dan Mode")

                        return

                                                

                if progres_selected == 2 and mode_selected == "turun":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 3 or index_id == 2 

                        new_id_value = data_gn_cyan_atas[index_id]  

                        print(f"new_id_value (dari index_trebel): {new_id_value}") 

                        entry_trebel.delete(0, tk.END)                          

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}") 

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 1 or index_id == 0

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 2 or index_id == 1

                        new_id_value = data_gn_cyan_atas[index_id] # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang=1)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                                    

  

                 if progres_selected == 3 and mode_selected == "turun":

                    if id_selected == 1 and nada_selected == "trebel":

                        new_id = 2 or index_id == 1

                        new_id_value = data_gn_cyan_atas[index_id]  

                        print(f"new_id_value (dari index_trebel): {new_id_value}") 

                        entry_trebel.delete(0, tk.END)                          

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}") 

                        entry_trebel.insert(0, final_adjustment)

                        

                    elif id_selected == 2 and nada_selected == "trebel":

                        new_id = 3 or index_id == 2 

                        new_id_value = data_gn_cyan_atas[index_id]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment) 


                    elif id_selected == 3 and nada_selected == "trebel":

                        new_id = 1 or index_id == 0

                        new_id_value = data_gn_cyan_atas[index_id]  # Data berdasarkan index_trebel

                        print(f"new_id_value (dari index_trebel): {new_id_value}")  

                        entry_trebel.delete(0, tk.END)                                     

                        final_adjustment = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang=2)

                        print(f"final_adjustment: {final_adjustment}")  

                        entry_trebel.insert(0, final_adjustment)                                   

                    else:

                        messagebox.showerror("Error", f"ID: {id_selected}, Nada: {nada_selected} tidak valid untuk Progres dan Mode")

                        return


    except ValueError:

        messagebox.showerror("Error", "Input harus berupa angka yang valid.")

    except IndexError:

        messagebox.showerror("Error", "Indeks data tidak valid, pastikan data yang diakses memiliki cukup karakter.")

    except Exception as e:

        messagebox.showerror("Error", f"Terjadi kesalahan: {str(e)}")                        


    finally:

    # Menghapus status read-only sementara

        entry_id.config(state='normal')


    # Bersihkan atau reset entry dan combobox setelah tombol pilih_nada ditekan

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('')

        mode_combobox.set('')

        nada_combobox.set('')


    # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')


    # Pastikan reset_entries() adalah fungsi valid yang digunakan untuk mereset komponen lainnya

        reset_entries()


# Fungsi untuk menyesuaikan nilai sub trebel berdasarkan progres

def adjust_trebel_value(trebel_value, progres):

    if trebel_value.isdigit():

        adjusted_value = ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)

    else:

        adjusted_value = trebel_value

    return adjusted_value    

        

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    # Pastikan digit pertama dari trebel_value adalah digit

    if trebel_value.isdigit():

        # Modifikasi digit pertama dengan mengurangkan 'pengurang' yang ditentukan

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        # Jika bukan digit, tidak diubah

        digit_pertama = trebel_value

    # Ambil digit kedua dan seterusnya dari new_id_value dan kurangi 2 untuk setiap digit

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 2) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  # Jika bukan digit, tidak diubah

    # Gabungkan digit pertama dengan digit kedua dan seterusnya

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value

    

def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        digit_pertama = trebel_value

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 2) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    # Pastikan digit pertama dari trebel_value adalah digit

    if trebel_value.isdigit():

        # Modifikasi digit pertama dengan mengurangkan 'pengurang' yang ditentukan

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        # Jika bukan digit, tidak diubah

        digit_pertama = trebel_value

    # Ambil digit kedua dan seterusnya dari new_id_value dan kurangi 2 untuk setiap digit

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 3) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  # Jika bukan digit, tidak diubah

    # Gabungkan digit pertama dengan digit kedua dan seterusnya

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value

                    

def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        digit_pertama = str(int(trebel_value[0]) - pengurang)

        print(f"Digit pertama setelah pengurangan: {digit_pertama}")

    else:

        digit_pertama = trebel_value

    if new_id_value.isdigit():

        digit_kedua_dan_seterusnya = ''.join(

            str(int(char) - 3) for char in new_id_value[1:]

        )

        print(f"Digit kedua dan seterusnya setelah pengurangan: {digit_kedua_dan_seterusnya}")

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]  

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    print(f"Nilai akhir: {adjusted_value}")

    return adjusted_value


#label dan entry

label_trebel_gn_cyan_atas = tk.Label(frame_top, text="Trebel Gn_Cyan_Atas:")

label_trebel_gn_cyan_atas.grid(row=10, column=0, padx=0, pady=7)

entry_trebel = tk.Entry(frame_top)

entry_trebel.grid(row=10, column=1, padx=0, pady=7)


label_trebel_sub_gn_cyan_atas = tk.Label(frame_top, text="Sub Trebel Gn_Cyan_Atas:")

label_trebel_sub_gn_cyan_atas.grid(row=11, column=0, padx=0, pady=7)

entry_sub_trebel = tk.Entry(frame_top)

entry_sub_trebel.grid(row=11, column=1, padx=0, pady=7)


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

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


# Tombol untuk menjalankan fungsi pilih_nada

button_pilih_nada = tk.Button(frame_top, text="Pilih Nada", bg="lightgreen", command=pilih_nada)

button_pilih_nada.grid(row=8, column=1, padx=0, pady=7)


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

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


root.mainloop()




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...