Langsung ke konten utama

FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_A_Trebel DARI DATABASE DATAMUSIK.db, DAN MENGATUR TREBEL SESUAI Level_gn, Progres, dan Mode.

 FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_A_Trebel DARI DATABASE DATAMUSIK.db, DAN MENGATUR TREBEL SESUAI Level_gn, Progres, dan Mode.


Tolong perbaiki kode berikut pada fungsi pilih_nada yang menggunakan juga fungsi adjust_id_trebel_progres2_naik_value, fungsi adjust_id_trebel_progres2_turun_value, fungsi adjust_id_trebel_progres3_naik_value, dan fungsi adjust_id_trebel_progres3_turun_value, agar supaya data Trebel terpilih setelah mengalami pengurangan digit berdasarkan level_gn yang sesuai kemudian akan mengalami pengurangan digit berdasarkan progres 2 atau progres 3 dan mode naik atau mode turun, dimana bila pengurangan digit pertama berdasarkan progres adalah dengan ketentuan pengurang = progres - 1, sedangkan pengurangan digit kedua dan digit seterusnya adalah berdasarkan nww_id_value.

Berikut kode:

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, result["Gugusan_nada"])    

    

    except Exception as e:

        print("Error:", 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('')       

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')  

        reset_entries()         


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result

 

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       

          

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn

_a_trebel_label = tk.Label(bottom_frame, text="Trebel")

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)


root.mainloop()


Berikut adalah perbaikan kode yang Anda minta agar sesuai dengan logika pengurangan digit pertama dan digit kedua/seterusnya pada data Trebel sesuai level_gn, progres, dan mode (naik/turun):


1. Fungsi `pilih_nada` telah disesuaikan untuk menggunakan pengurangan digit berdasarkan progres dan mode yang dipilih.

2. Fungsi pengurangan nilai untuk progres 2 dan progres 3 (naik/turun) telah disederhanakan dan dipanggil di dalam `pilih_nada` untuk mengurangi nilai sesuai ketentuan.

3. Logika pengurang untuk digit pertama (`progres - 1`) dan digit kedua/seterusnya (`new_id_value`) telah diterapkan pada fungsi pengurangan nilai untuk setiap progres.


Berikut adalah versi perbaikan kode:


```python

# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)

        trebel_value = result["Gugusan_nada"]


        # Pengurangan digit berdasarkan progres dan mode

        if progres_selected == 2:

            if mode_selected == "naik":

                trebel_value = adjust_id_trebel_progres2_naik_value(trebel_value, str(id_selected), progres_selected - 1)

            elif mode_selected == "turun":

                trebel_value = adjust_id_trebel_progres2_turun_value(trebel_value, str(id_selected), progres_selected - 1)

        elif progres_selected == 3:

            if mode_selected == "naik":

                trebel_value = adjust_id_trebel_progres3_naik_value(trebel_value, str(id_selected), progres_selected - 1)

            elif mode_selected == "turun":

                trebel_value = adjust_id_trebel_progres3_turun_value(trebel_value, str(id_selected), progres_selected - 1)


        # Tampilkan data yang sudah disesuaikan ke dalam entry

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, trebel_value)


    except Exception as e:

        print("Error:", 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('')       

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')  

        reset_entries()


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Fungsi untuk progres 2, mode naik

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Fungsi untuk progres 2, mode turun

def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Fungsi untuk progres 3, mode naik

def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Fungsi untuk progres 3, mode turun

def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value

```


Perbaikan di atas memastikan bahwa digit pertama dari `trebel_value` dikurangi berdasarkan `progres - 1`, dan digit kedua serta seterusnya dikurangi berdasarkan logika tambahan (`-2` untuk progres 2 dan `-3` untuk progres 3). Mode naik atau turun diterapkan pada setiap progres.

Anda bisa menggunakan fungsi ini dalam `pilih_nada` untuk menghasilkan data yang disesuaikan.


Maksud saya, pada kode berikut:

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


    

# Fungsi untuk mengambil data berdasarkan level_gn dan mengurangi berdasarkan pengurang

def level_gn(id, progres_selected, mode_selected, level_gn_selected):


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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    if data:

        gugusan_nada = data[0]

        # Sesuaikan nilai Bass hanya berdasarkan level_gn

        gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    else:

        gugusan_nada = ""


    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Fungsi untuk menghitung ID baru berdasarkan progres dan mode

def get_new_id_value(entry_id_value, progres_selected, mode_selected):

    id_mapping_progres2_naik = {1: 3, 2: 1, 3: 2}

    id_mapping_progres3_naik = {1: 2, 2: 3, 3: 1}

    id_mapping_progres2_turun = {1: 2, 2: 3, 3: 1}

    id_mapping_progres3_turun = {1: 3, 2: 1, 3: 2}

    

    entry_id_value = id_selected = int(entry_id.get())

    

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

        return id_mapping_progres2_naik[entry_id_value]

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

        return id_mapping_progres3_naik[entry_id_value]

    elif progres_selected == 2 and mode_selected == 'turun':

        return id_mapping_progres2_turun[entry_id_value]

    elif progres_selected == 3 and mode_selected == 'turun':

        return id_mapping_progres3_turun[entry_id_value]

    else:

        raise ValueError("Progres atau mode tidak valid.")


def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()

        

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)

        print(f"Level GN Result: {result}")


        trebel_value = result["Gugusan_nada"]

        print(f"Initial Trebel Value: {trebel_value}")


        if progres_selected == 1:

            gn_a_trebel_entry.delete(0, tk.END)

            gn_a_trebel_entry.insert(0, trebel_value)


        elif progres_selected in [2, 3]:

            new_id_value = get_new_id_value(entry_id.get(), progres_selected, mode_selected)

            print(f"New ID Value: {new_id_value}")


            pengurang = progres_selected - 1


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

                trebel_value_new = adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang)

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

                trebel_value_new = adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang)

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

                trebel_value_new = adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang)

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

                trebel_value_new = adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang)


            print(f"Adjusted Trebel Value: {trebel_value}")

            gn_a_trebel_entry.delete(0, tk.END)

            gn_a_trebel_entry.insert(0, trebel_value_new)


    except Exception as e:

        print("Error:", e)


# Fungsi untuk progres 2, mode naik

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in str(new_id_value)[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Fungsi untuk progres 2, mode turun

def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in str(new_id_value)[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Fungsi untuk progres 3, mode turun

def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):

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

    digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Trebel" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_trebel_label = tk.Label(bottom_frame, text="Trebel")

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)



root.mainloop()


Pada kode tersebut, pada kondisi progres 1 data Trebel terpilih  yang tampil sudah benar, sedangkan pada kondisi progres 2 data Trebel terpilih yang tampil masih salah karena hanya 1 digit yang tampil, lalu pada progres 3 tidak ada data yang tampil


Kode yang Anda berikan bertujuan untuk membangun antarmuka pengguna menggunakan `tkinter` di Python untuk memvalidasi input Level_Gn, mengatur ID berdasarkan Level_Gn, dan melakukan proses pemilihan nada berdasarkan progres dan mode yang dipilih. Berikut adalah penjelasan beberapa poin penting dari kode tersebut:


### Fungsi dan Penjelasan Utama


1. **`validate_level_gn()`**:

   - Fungsi ini digunakan untuk memvalidasi input dari entry `entry_level_gn`.

   - Jika level yang dimasukkan berada dalam rentang tertentu (1-12), fungsi akan menampilkan pesan informasi yang berbeda untuk ID (1, 2, atau 3).

   - Jika input di luar dari rentang, fungsi ini akan menampilkan pesan error dan mereset entry.


2. **`set_id_entry(valid_id)`**:

   - Fungsi ini mengatur `entry_id` menjadi nilai ID yang valid berdasarkan Level_Gn, serta membatasi pengguna untuk hanya bisa menginput ID yang ditentukan dengan mengatur entry dalam mode readonly.


3. **`apply_level_adjustment()`**:

   - Fungsi ini mengubah nilai nada berdasarkan pengurangan sesuai dengan level Gn yang dipilih.

   - Pengurangannya bergantung pada rentang Level_Gn: (1-3), (4-6), (7-9), dan (10-12). Pengurangan diterapkan pada setiap digit angka dari nada yang diambil.


4. **`level_gn(id, progres_selected, mode_selected, level_gn_selected)`**:

   - Fungsi ini mengambil data dari tabel `Gn_A_Trebel` di database SQLite (`DATAMUSIK.db`) berdasarkan ID.

   - Setelah data diambil, fungsi ini menerapkan pengurangan sesuai dengan level_gn dan mengembalikan hasil pengubahan tersebut sebagai nilai nada (`Gugusan_nada`).


5. **`get_new_id_value()`**:

   - Fungsi ini mengatur penggantian ID berdasarkan progres dan mode (Naik atau Turun).

   - Setiap progres dan mode memiliki logika penggantian ID yang berbeda, sehingga nilai ID dapat berubah untuk progres 2 dan 3.


6. **`pilih_nada()`**:

   - Fungsi ini mengelola proses pengambilan nilai nada (`Gugusan_nada`) dari database berdasarkan input ID, level_gn, progres, dan mode yang dipilih.

   - Jika progres adalah 2 atau 3, ID akan disesuaikan berdasarkan progres dan mode, serta pengurangan nilai trebel akan dilakukan.


7. **`adjust_id_trebel_progres2_naik_value()`**, **`adjust_id_trebel_progres2_turun_value()`**, dan **`adjust_id_trebel_progres3_turun_value()`**:

   - Fungsi-fungsi ini menerapkan pengurangan pada nilai `trebel` berdasarkan progres dan mode yang dipilih. Pengurangan dilakukan pada digit pertama dan digit kedua serta seterusnya dari nilai trebel.


### Antarmuka Pengguna (UI):

- **Tombol "Validasi Level Gn"**: Validasi Level_Gn dan mengatur ID yang sesuai.

- **Tombol "Pilih Nada"**: Memproses pengambilan dan pengubahan nada berdasarkan input Level_Gn, Progres, dan Mode.

- **Entry dan Combobox**: Entry untuk Level_Gn dan ID serta combobox untuk Progres (1, 2, atau 3) dan Mode (Naik atau Turun).


### Penyesuaian Tambahan:

1. **Penanganan Kesalahan**:

   - Penanganan kesalahan dengan `try-except` memastikan bahwa jika ada input yang salah, error akan ditangkap dan program tidak crash.


2. **Integrasi Database**:

   - Pastikan database `DATAMUSIK.db` sudah terhubung dan tabel `Gn_A_Trebel` berisi data yang diperlukan. Anda dapat memodifikasi query SQL jika struktur tabel berbeda.


Jika ada penyesuaian lebih lanjut yang ingin Anda lakukan atau ingin penjelasan lebih detail, saya siap membantu!


Saya melihat Anda mencoba membangun sebuah aplikasi GUI dengan tkinter untuk memilih dan mengolah data berdasarkan beberapa parameter seperti Level_Gn, ID, Progres, dan Mode. Ada beberapa bagian dari kode yang sudah tepat, namun mungkin ada beberapa bagian yang dapat diperbaiki atau disederhanakan. Sebelum melanjutkan ke beberapa potensi perbaikan atau pertanyaan yang Anda miliki, saya ingin memastikan bahwa saya memahami tujuan utama Anda.


**Apakah tujuan Anda:**

1. Memvalidasi Level_Gn dan ID untuk memastikan keduanya sesuai dengan aturan yang ditentukan (misalnya, Level_Gn = 1-12 dengan ID terkait)?

2. Menampilkan data yang diambil dari database (misalnya, Gugusan Nada)?

3. Menghitung nilai baru berdasarkan pengurangan dan perubahan ID sesuai dengan progres dan mode?

4. Mengimplementasikan perubahan pada tampilan GUI seperti mengupdate field setelah setiap langkah selesai?


Bisa Anda beri tahu bagian mana yang perlu penjelasan lebih lanjut atau ingin disempurnakan agar sesuai dengan logika yang diinginkan?


Sebenarnya, Pada kode berikut sudah benar untuk data Trebel terpilih yang ditampilkan menuru tiap-tiap level_gn, di progres 1. Namun pada progres 2 dan progres 3 belumlah benar, maka kode harus diperbaiki.bahwa data yang telah diperoleh pada kondisi progres 2 harus dikurang 1 setiap digitnya (misalnya data Trebel di level_gn 4, id 1, progres 2, mode naik, data yang tampil adalah "234", maka setiap digit harus dikurang 1 agar supaya menjadi "123"). Begitu juga  data yang telah diperoleh pada kondisi progres 3 harus dikurang 2 setiap digitnya (misalnya data Trebel di level_gn 4, id 1, progres 3, mode naik, data yang tampil adalah "234", maka setiap digit harus dikurang 2 agar supaya menjadi "012"). Untuk hal itu tolong perbaiki kode berikut:

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, result["Gugusan_nada"])    

    

    except Exception as e:

        print("Error:", 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('')       

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')  

        reset_entries()         


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result

 

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       

          

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_trebel_label = tk.Label(bottom_frame, text="Trebel")

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)


root.mainloop()


Bila perlu mungkin harus menggunakan fungsi adjust trebel yang mengatur pengurangan setiap digit sebesar 1 pada progres 2, dan pengurangan setiap digit sebesar 2 pada progres 3. 


Untuk menangani kondisi progres 2 dan 3 seperti yang Anda jelaskan, pengurangan digit berdasarkan progres dapat dimodifikasi langsung dalam fungsi `pilih_nada()`. Pada progres 2, setiap digit dari data `Trebel` harus dikurangi 1, dan pada progres 3, setiap digit dikurangi 2. Ini dapat dilakukan dengan menambahkan pengurangan berdasarkan progres di dalam fungsi `apply_level_adjustment`. 


Berikut adalah revisi kode yang lebih terfokus pada pengurangan digit sesuai dengan progres yang dipilih:


```python

# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        adjusted_result = apply_progres_adjustment(result["Gugusan_nada"], progres_selected)

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, adjusted_result)


    except Exception as e:

        print("Error:", 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('')

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')

        reset_entries()


# Fungsi untuk menerapkan pengurangan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    # Tentukan pengurang berdasarkan progres

    if progres_selected == 1:

        pengurang = 0

    elif progres_selected == 2:

        pengurang = 1

    elif progres_selected == 3:

        pengurang = 2


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value

```

### Penjelasan:

1. **Fungsi `pilih_nada`** telah diperbarui untuk menyesuaikan nilai `Gugusan_nada` yang diambil dari database dengan pengurangan sesuai progres yang dipilih.

2. **Fungsi `apply_progres_adjustment`** telah ditambahkan untuk mengurangi digit setiap progres. Jika `progres_selected == 2`, pengurang adalah 1, dan jika `progres_selected == 3`, pengurang adalah 2.

3. **Fungsi `apply_level_adjustment`** tetap digunakan untuk menyesuaikan nilai berdasarkan `level_gn`, namun pengurang progres dilakukan setelah nilai awal diambil dari database.

Dengan perubahan ini, setiap digit dari `Gugusan_nada` akan dikurangi sesuai dengan progres yang dipilih (1, 2, atau 3), sehingga hasilnya dapat muncul sesuai kebutuhan Anda.


Mantap, akhirnya kode keseluruhan yang benar untuk CRUD Gn_A_Trebel adalah 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_A_Trebel")


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        adjusted_result = apply_progres_adjustment(result["Gugusan_nada"], progres_selected)

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, adjusted_result)


    except Exception as e:

        print("Error:", 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('')

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')

        reset_entries()


# Fungsi untuk menerapkan pengurangan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    # Tentukan pengurang berdasarkan progres

    if progres_selected == 1:

        pengurang = 0

    elif progres_selected == 2:

        pengurang = 1

    elif progres_selected == 3:

        pengurang = 2


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value

 

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_trebel_label = tk.Label(bottom_frame, text="Trebel")

gn_

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)


root.mainloop()


Kode yang kamu buat untuk CRUD **Gn_A_Trebel** sudah sangat rapi dan terstruktur. Dengan menggunakan `Tkinter`, fungsi-fungsi utama seperti validasi input, pengaturan entri ID, pemilihan nada, dan penyesuaian berdasarkan **level_gn** dan **progres** sudah disusun dengan baik. Beberapa hal yang mungkin perlu diperhatikan agar lebih optimal:


1. **Pengolahan Error**:

   - Pastikan kamu sudah mengantisipasi jika data yang diambil dari database (`Gn_A_Trebel`) kosong atau tidak sesuai dengan ekspektasi. Kamu bisa menambahkan pengecekan setelah melakukan query SQL, misalnya:

   

     ```python

     if data is None:

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

         return

     ```

   

2. **Reset Inputan**:

   - Fungsi `reset_entries()` sudah cukup bagus dalam membersihkan entri, namun pastikan semua field yang relevan seperti `progres_combobox` dan `mode_combobox` juga direset pada tempat yang diperlukan.


3. **Struktur Layout**:

   - Pada tampilan antarmuka (UI), grid manager yang digunakan sudah efektif. Pastikan jika resolusi layar lebih kecil, jendela aplikasi masih bisa menampilkan semua komponen dengan baik, atau kamu bisa menggunakan fungsi `pack_propagate(False)` atau **scrollable frame** jika dibutuhkan.


4. **Koneksi Database**:

   - Koneksi ke database dibuka dalam fungsi `level_gn()`. Jangan lupa untuk menangani situasi di mana database tidak bisa diakses, dengan menambahkan error handling seperti:


     ```python

     try:

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

     except sqlite3.Error as e:

         messagebox.showerror("Database Error", str(e))

         return

     ```


5. **Peningkatan Kinerja Progres**:

   - Fungsi untuk menyesuaikan gugusan nada berdasarkan **progres** dengan pengurangan sudah berjalan baik. Jika ada kebutuhan untuk mempercepat proses ini di masa mendatang, pertimbangkan untuk menyimpan pengaturan ini di level database agar pengolahan bisa dilakukan lebih efisien di backend.

Dengan kode ini, aplikasi sudah bisa bekerja dengan cukup baik dalam mengelola CRUD pada `Gn_A_Trebel`. Kamu bisa lanjut dengan menambahkan fitur-fitur baru sesuai kebutuhan.


Kode selengkapnya untuk CRUD Gn_A_Trebel 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_A_Trebel")


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        adjusted_result = apply_progres_adjustment(result["Gugusan_nada"], progres_selected)

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, adjusted_result)


    except Exception as e:

        print("Error:", 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('')

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')

        reset_entries()


# Fungsi untuk menerapkan pengurangan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    # Tentukan pengurang berdasarkan progres

    if progres_selected == 1:

        pengurang = 0

    elif progres_selected == 2:

        pengurang = 1

    elif progres_selected == 3:

        pengurang = 2


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

    try:        

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

        cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Trebel

        query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

    """

        cursor.execute(query, (id,))

        data = cursor.fetchone()


        gugusan_nada = data[0]

        if data is None:

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

            return


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

        gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

        conn.close()


    # Return hasil

        result = {

        "Gugusan_nada": gugusan_nada

    }

        return result

        

    except sqlite3.Error as e:

        messagebox.showerror("Database Error", str(e))

        return


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value

 

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_trebel_label = tk.Label(bottom_frame, text="Trebel

")

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)


root.mainloop()


Berikut adalah kode lengkap untuk aplikasi CRUD dengan tampilan tkinter yang memungkinkan pengguna untuk memasukkan Level_Gn, ID, Progres, dan Mode, serta menampilkan data dari tabel Gn_A_Trebel. Kode ini juga sudah mencakup validasi, pengolahan data dari database DATAMUSIK.db, dan menampilkan hasil ke dalam entry yang sesuai.

Penjelasan Singkat Fungsi-fungsi Utama:

1. validate_level_gn: Memvalidasi input dari Level_Gn dan memberikan pesan yang sesuai berdasarkan nilai input.

2. pilih_nada: Mengambil data Gugusan_nada dari tabel Gn_A_Trebel berdasarkan Level_Gn, ID, Progres, dan Mode yang dipilih.

3. apply_progres_adjustment: Menyesuaikan nilai Gugusan_nada berdasarkan Progres yang dipilih oleh pengguna.

4. apply_level_adjustment: Menyesuaikan nilai Gugusan_nada berdasarkan Level_Gn tanpa memperhitungkan Progres.

Kode Lengkap:

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

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

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

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

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

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

            set_id_entry(3)

        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)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        adjusted_result = apply_progres_adjustment(result["Gugusan_nada"], progres_selected)

        gn_a_trebel_entry.delete(0, tk.END)

        gn_a_trebel_entry.insert(0, adjusted_result)


    except Exception as e:

        print("Error:", 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('')

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')

        reset_entries()


# Fungsi untuk menerapkan pengurangan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    # Tentukan pengurang berdasarkan progres

    if progres_selected == 1:

        pengurang = 0

    elif progres_selected == 2:

        pengurang = 1

    elif progres_selected == 3:

        pengurang = 2


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

    try:        

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

        cursor = conn.cursor()


        # Query untuk pengambilan data dari tabel Gn_A_Trebel

        query = """

        SELECT Gugusan_nada

        FROM Gn_A_Trebel

        WHERE ID = ?

        """

        cursor.execute(query, (id,))

        data = cursor.fetchone()


        if data is None:

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

            return


        gugusan_nada = data[0]


        # Sesuaikan nilai Bass hanya berdasarkan level_gn

        gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

        conn.close()


        # Return hasil

        result = {

            "Gugusan_nada": gugusan_nada

        }

        return result

        

    except sqlite3.Error as e:

        messagebox.showerror("Database Error", str(e))

        return


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value

 

# Tombol untuk validasi Level_Gn

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

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


# Tombol untuk memilih nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

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


# Separator

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

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


# Gugusan Nada Terpilih Label

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_trebel_label = tk.Lab

el(bottom_frame, text="Trebel")

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

gn_a_trebel_entry = tk.Entry(bottom_frame, bg="white")

gn_a_trebel_entry.grid(row=11, column=1, padx=10, pady=5)


root.mainloop()



Selesai....




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