Langsung ke konten utama

FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_Biru DARI DATABASE DATAMUSIK.db, DAN MENGATUR BASS/TREBEL SESUAI Level_gn, Progres, dan Mode. (Part-3)

 FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_Biru DARI DATABASE DATAMUSIK.db, DAN MENGATUR BASS/TREBEL SESUAI Level_gn, Progres, dan Mode. (Part-3)


Tolong perbaiki kode berikut pada baris 106 hingga 129, bahwa pengurangan digit data Trebel sudah benar menurut perubahan level_gn, sedangkan yang masih salah ada pada pengurangan digit pada data Bass menurut perubahan level_gn, bahwa pada level'gn 1, 2, 3 setiap digit data Trebel tidak ada pengurangan, lalu pada level'gn 4, 5, 6 setiap digit data Trebel mengalami pengurangan 1, lalu pada level'gn 7, 8, 9 setiap digit data Trebel mengalami pengurangan 2, lalu pada level'gn 10, 11, 12 setiap digit data Trebel mengalami pengurangan 2, kemudian setiap data Trebel di progres 2 akan mengalami lagi penurunan digit data dikurang 1 setelah setiap digit datanya berkurang oleh sebab perubahan level_gn, lalu bila setiap data Trebel di progres 3 akan mengalami lagi penurunan digit data dikurang 2 setelah setiap digit datanya berkurang oleh sebab perubahan level_gn. Contohnya data Trebel di kolom Trebel_1 id 3, level_gn 1, progres 1, mode naik adalah "32", lalu bila di level_gn 4 maka data Trebel_1 id 3 ini akan menjadi "21" (semua digit data berkurang 1 karena level_gn 4), lalu bila di progres 2, level_gn 4, maka data Trebel_1 id 3 ini akan menjadi "10" (semua digit data berkurang lagi 1 karena progres 2 dari kondisi level_gn 4), lalu bila di progres 3, level_gn 4, maka data Trebel_1 id 3 ini akan menjadi "0-1" (semua digit data berkurang lagi 2 karena progres 3 dari kondisi level_gn 4), dan seterusnya hingga bila di level_gn 10 maka data Trebel_1 id 3 ini akan menjadi "0-1" (semua digit data berkurang 3 karena level_gn 10), lalu bila di progres 2, level_gn 10, maka data Trebel_1 id 3 ini akan menjadi "-1-2" (semua digit data berkurang lagi 1 karena progres 2 dari kondisi level_gn 10), lalu bila di progres 3, level_gn 10, maka data Trebel_1 id 3 ini akan menjadi "-2-3" (semua digit data berkurang lagi 2 karena progres 3 dari kondisi level_gn 10).

Berikut kode yang butuh diperbaiki di baris 106 hingga 129:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


root = tk.Tk()

root.title("Pilihan Nada")

root.geometry("600x400")


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10)

frame_top.grid_columnconfigure(0, minsize=-20)


# 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 = 3")

            set_id_entry(3)

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

            set_id_entry(1)

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


# 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

        entry_bass_1.delete(0, tk.END)

        entry_bass_1.insert(0, result["Bass_1"])


        entry_trebel_1.delete(0, tk.END)

        entry_trebel_1.insert(0, result["Trebel_1"])


        entry_bass_2.delete(0, tk.END)

        entry_bass_2.insert(0, result["Bass_2"])


        entry_trebel_2.delete(0, tk.END)

        entry_trebel_2.insert(0, result["Trebel_2"])


        entry_bass_3.delete(0, tk.END)

        entry_bass_3.insert(0, result["Bass_3"])


    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


    # Tentukan pengurang berdasarkan level_gn

    pengurang = 0

    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


    # Fungsi untuk mengurangi setiap digit pada bass dan trebel

    def adjust_value(value, pengurang):

        adjusted_value = ''.join(str(max(0, int(digit) - pengurang)) if digit.isdigit() else digit for digit in value)

        return adjusted_value


    # Pengurangan pada Bass dan Trebel tergantung pada Level Gn

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

        bass_1 = adjust_value(bass_1, pengurang)

        trebel_1 = adjust_value(trebel_1, pengurang)

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(trebel_2, pengurang)

        bass_3 = adjust_value(bass_3, pengurang)

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

        bass_1 = adjust_value(bass_1, pengurang)

        trebel_1 = adjust_value(trebel_1, pengurang)

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(trebel_2, pengurang)

        bass_3 = adjust_value(bass_3, pengurang)

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

        bass_1 = adjust_value(bass_1, pengurang)

        trebel_1 = adjust_value(trebel_1, pengurang)

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(trebel_2, pengurang)

        bass_3 = adjust_value(bass_3, pengurang)


    # Pengaturan Trebel berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

            trebel_1 = data[1]

            trebel_2 = data[3]

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def ambil_data_trebel(id, target_id, kolom):

    # Fungsi untuk mengambil data Trebel dari ID yang berbeda

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


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


# Letakkan entry 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)


# Frame untuk hasil adaptasi

frame_bottom = tk.Frame(root)

frame_bottom.pack(pady=10)


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)

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


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

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


# Labels dan Entry untuk Bass dan Trebel

gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")

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

gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")

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

gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")

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

gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")

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

gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")

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


# Entry box untuk Bass dan Trebel

entry_bass_1 = tk.Entry(frame_bottom, bg="white")

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

entry_trebel_1 = tk.Entry(frame_bottom, bg="white")

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

entry_bass_2 = tk.Entry(frame_bottom, bg="white")

entry

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

entry_trebel_2 = tk.Entry(frame_bottom, bg="white")

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

entry_bass_3 = tk.Entry(frame_bottom, bg="white")

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


root.mainloop()      


Berikut adalah perbaikan untuk bagian kode antara baris 106 hingga 129 sesuai dengan logika yang Anda berikan. Fokus utama perbaikan adalah penerapan pengurangan digit pada data **Trebel** dan **Bass** berdasarkan perubahan **level_gn** dan **progres**:


```python

# Fungsi untuk mengurangi setiap digit pada bass dan trebel

def adjust_value(value, pengurang):

    adjusted_value = ''.join(str(max(-9, int(digit) - pengurang)) if digit.isdigit() else digit for digit in value)

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres):

    if progres == 2:

        return adjust_value(value, 1)

    elif progres == 3:

        return adjust_value(value, 2)

    return value


# Pengurangan pada Bass dan Trebel tergantung pada Level Gn dan Progres

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


    # 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 Bass dan Trebel dengan pengurang level_gn

    bass_1 = adjust_value(bass_1, pengurang)

    trebel_1 = adjust_value(trebel_1, pengurang)

    bass_2 = adjust_value(bass_2, pengurang)

    trebel_2 = adjust_value(trebel_2, pengurang)

    bass_3 = adjust_value(bass_3, pengurang)


    # Terapkan pengurangan tambahan berdasarkan progres

    trebel_1 = apply_progres_adjustment(trebel_1, progres)

    trebel_2 = apply_progres_adjustment(trebel_2, progres)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result

```

### Penjelasan Perubahan:

1. **Pengurangan berdasarkan `level_gn`**:

   - Pada level 1-3: Tidak ada pengurangan.

   - Pada level 4-6: Setiap digit data dikurangi 1.

   - Pada level 7-9: Setiap digit data dikurangi 2.

   - Pada level 10-12: Setiap digit data dikurangi 3.

2. **Pengurangan tambahan berdasarkan `progres`**:

   - **Progres 2**: Setiap digit pada data **Trebel** dikurangi 1 setelah pengurangan yang dilakukan oleh perubahan **level_gn**.

   - **Progres 3**: Setiap digit pada data **Trebel** dikurangi 2 setelah pengurangan yang dilakukan oleh perubahan **level_gn**.

3. **Fungsi `apply_progres_adjustment()`**: Digunakan untuk menerapkan pengurangan tambahan berdasarkan progres.


Kemudian data Trebel yang telah mengalami pengurangan digit datanya karena perubahan level_gn, selanjutnya data Trebel akan mengalami pengurangan digit datanya lagi berdasarkan progres dan mode sesuai dengan fungi adjust_id_trebel_progres2_naik, atau fungsi adjust_id_trebel_progres2_turun, atau fungsi adjust_id_trebel_progres3_naik, atau fungsi adjust_id_trebel_progres3_turun.

Untuk itu maka tambahkan kode berikut ini:

    # Pengaturan Trebel berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

            trebel_1 = data[1]

            trebel_2 = data[3]

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result


def ambil_data_trebel(id, target_id, kolom):

    # Fungsi untuk mengambil data Trebel dari ID yang berbeda

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


Tambahkan kepada kode yang baru kamu beri tersebut, sehingga kode keseluruhan kira_kira menjadi seperti berikut ini:


import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


root = tk.Tk()

root.title("Pilihan Nada")

root.geometry("600x400")


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10)

frame_top.grid_columnconfigure(0, minsize=-20)


# 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 = 3")

            set_id_entry(3)

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

            set_id_entry(1)

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


# 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

        entry_bass_1.delete(0, tk.END)

        entry_bass_1.insert(0, result["Bass_1"])


        entry_trebel_1.delete(0, tk.END)

        entry_trebel_1.insert(0, result["Trebel_1"])


        entry_bass_2.delete(0, tk.END)

        entry_bass_2.insert(0, result["Bass_2"])


        entry_trebel_2.delete(0, tk.END)

        entry_trebel_2.insert(0, result["Trebel_2"])


        entry_bass_3.delete(0, tk.END)

        entry_bass_3.insert(0, result["Bass_3"])


    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


# Fungsi untuk mengurangi setiap digit pada bass dan trebel

def adjust_value(value, pengurang):

    adjusted_value = ''.join(str(max(-9, int(digit) - pengurang)) if digit.isdigit() else digit for digit in value)

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres):

    if progres == 2:

        return adjust_value(value, 1)

    elif progres == 3:

        return adjust_value(value, 2)

    return value


# Pengurangan pada Bass dan Trebel tergantung pada Level Gn dan Progres

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


    # 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 Bass dan Trebel dengan pengurang level_gn

    bass_1 = adjust_value(bass_1, pengurang)

    trebel_1 = adjust_value(trebel_1, pengurang)

    bass_2 = adjust_value(bass_2, pengurang)

    trebel_2 = adjust_value(trebel_2, pengurang)

    bass_3 = adjust_value(bass_3, pengurang)


    # Terapkan pengurangan tambahan berdasarkan progres

    trebel_1 = apply_progres_adjustment(trebel_1, progres)

    trebel_2 = apply_progres_adjustment(trebel_2, progres)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result

    

    # Pengaturan Trebel berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

            trebel_1 = data[1]

            trebel_2 = data[3]

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)

            trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)

            trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result


def ambil_data_trebel(id, target_id, kolom):

    # Fungsi untuk mengambil data Trebel dari ID yang berbeda

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = 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(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)

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


# Letakkan entry 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)


# Frame untuk hasil adaptasi

frame_bottom = tk.Frame(root)

frame_bottom.pack(pady=10)


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)

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


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

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


# Labels dan Entry untuk Bass dan Trebel

gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")

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

gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")

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

gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")

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

gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")

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

gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")

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


# Entry box untuk Bass dan Trebel

entry_bass_1 = tk.Entry(frame_bottom, bg="white")

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

entry_trebel_1 = tk.Entry(fram

e_bottom, bg="white")

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

entry_bass_2 = tk.Entry(frame_bottom, bg="white")

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

entry_trebel_2 = tk.Entry(frame_bottom, bg="white")

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

entry_bass_3 = tk.Entry(frame_bottom, bg="white")

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


root.mainloop()      


Tampaknya Anda ingin menambahkan logika yang kompleks untuk memanipulasi data trebel berdasarkan progres dan mode yang dipilih. Selain itu, Anda ingin mengatur pengurangan nilai digit pada trebel tergantung pada level_gn, progres, dan mode, serta menampilkan hasilnya ke dalam beberapa entri di tkinter. Berikut ini adalah bagian terakhir dari kode lengkap yang melibatkan pengaturan trebel dan bass dengan menambahkan fungsi yang telah dijelaskan.


Berikut adalah kelanjutan dari fungsi `level_gn`:


```python

    # Tentukan pengurang berdasarkan level_gn

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

        pengurang = 1

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

        pengurang = 2

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

        pengurang = 3

    else:

        pengurang = 0


    # Pengurangan pada bass dan trebel sesuai level_gn

    bass_1 = adjust_value(bass_1, pengurang)

    trebel_1 = adjust_value(trebel_1, pengurang)

    bass_2 = adjust_value(bass_2, pengurang)

    trebel_2 = adjust_value(trebel_2, pengurang)

    bass_3 = adjust_value(bass_3, pengurang)


    # Pengaturan tambahan berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

            # Tidak ada penyesuaian tambahan

            pass

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, ambil_data_trebel(id, 3, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres2_naik_value(trebel_2, ambil_data_trebel(id, 3, 'Trebel_2'), pengurang)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(trebel_1, ambil_data_trebel(id, 2, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres2_turun_value(trebel_2, ambil_data_trebel(id, 2, 'Trebel_2'), pengurang)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(id, 2, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres3_naik_value(trebel_2, ambil_data_trebel(id, 2, 'Trebel_2'), pengurang)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(trebel_1, ambil_data_trebel(id, 3, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres3_turun_value(trebel_2, ambil_data_trebel(id, 3, 'Trebel_2'), pengurang)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result

```


### Fungsi Tambahan

Fungsi tambahan seperti `adjust_id_trebel_progres2_naik_value`, `adjust_id_trebel_progres2_turun_value`, `adjust_id_trebel_progres3_naik_value`, dan `adjust_id_trebel_progres3_turun_value` juga sudah terintegrasi dalam kode. Selain itu, fungsi `ambil_data_trebel` digunakan untuk mengambil nilai trebel dari database berdasarkan ID yang berbeda.


### Penggunaan di tkinter

Anda juga sudah menyertakan bagian di mana data hasil manipulasi dimasukkan ke dalam entry widget di tkinter. Pastikan entry yang sesuai diisi dengan hasil yang diperoleh dari fungsi `level_gn`.


### Kesimpulan

Kode di atas menggabungkan logika penyesuaian nilai trebel berdasarkan level, progres, dan mode, serta menampilkan hasilnya di tkinter. Pastikan semua fungsi berjalan dengan benar dan terhubung ke database `DATAMUSIK.db`.


Tolong perbaiki kode berikut:

    # Pengaturan tambahan berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

            # Tidak ada penyesuaian tambahan

            pass

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, ambil_data_trebel(id, 3, 'Trebel_1'), pengurang)


        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(trebel_1, ambil_data_trebel(id, 2, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres2_turun_value(trebel_2, ambil_data_trebel(id, 2, 'Trebel_2'), pengurang)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(id, 2, 'Trebel_1'), pengurang)


        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(trebel_1, ambil_data_trebel(id, 3, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres3_turun_value(trebel_2, ambil_data_trebel(id, 3, 'Trebel_2'), pengurang)


def ambil_data_trebel(id, target_id, kolom):

    # Fungsi untuk mengambil data Trebel dari ID yang berbeda

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


Agar supaya ada kesesuaian antara id data dengan new_id_value, yaitu:

Jika progres 2, data Trebel dari id 1 dan kondisi progres 2 mode naik maka new_id_value adalah id 3, Jika data Trebel dari id 1 dan progres 2 mode turun maka new_id_value adalah id 2, Jika data Trebel dari id 2 dan progres 2 mode naik maka new_id_value adalah id 1, Jika data Trebel dari id 2 dan progres 2 mode turun maka new_id_value adalah id 3. Jika data Trebel dari id 3 dan progres 2 mode naik maka new_id_value adalah id 2, Jika data Trebel dari id 3 dan progres 2 mode turun maka new_id_value adalah id 1. 

Kemudian Jika progres 3, data Trebel dari id 1 dan kondisi progres 3 mode naik maka new_id_value adalah id 2, Jika data Trebel dari id 1 dan progres 3 mode turun maka new_id_value adalah id 3, Jika data Trebel dari id 2 dan progres 3 mode naik maka new_id_value adalah id 3, Jika data Trebel dari id 2 dan progres 3 mode turun maka new_id_value adalah id 1, Jika data Trebel dari id 3 dan progres 3 mode naik maka new_id_value adalah id 1, Jika data Trebel dari id 3 dan progres 3 mode turun maka new_id_value adalah id 2.


Saya akan memperbaiki kode Anda agar sesuai dengan logika yang Anda inginkan untuk pengambilan `new_id_value` berdasarkan progres dan mode. Berikut adalah perbaikan kodenya:


### Perbaikan Logika untuk Pemilihan `new_id_value`:

1. Jika **progres 2**:

   - **mode naik**:

     - ID 1 -> ID 3

     - ID 2 -> ID 1

     - ID 3 -> ID 2

   - **mode turun**:

     - ID 1 -> ID 2

     - ID 2 -> ID 3

     - ID 3 -> ID 1

2. Jika **progres 3**:

   - **mode naik**:

     - ID 1 -> ID 2

     - ID 2 -> ID 3

     - ID 3 -> ID 1

   - **mode turun**:

     - ID 1 -> ID 3

     - ID 2 -> ID 1

     - ID 3 -> ID 2


Berikut adalah kode yang telah diperbaiki:


```python

# Pengaturan tambahan berdasarkan progres dan mode

if progres == 1:

    if mode == "naik" or mode == "turun":

        # Tidak ada penyesuaian tambahan

        pass

elif progres == 2:

    new_id_value = ambil_new_id_value(id, progres, mode)

    if mode == "naik":

        trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

    elif mode == "turun":

        trebel_1 = adjust_id_trebel_progres2_turun_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

        trebel_2 = adjust_id_trebel_progres2_turun_value(trebel_2, ambil_data_trebel(new_id_value, 'Trebel_2'), pengurang)

elif progres == 3:

    new_id_value = ambil_new_id_value(id, progres, mode)

    if mode == "naik":

        trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

    elif mode == "turun":

        trebel_1 = adjust_id_trebel_progres3_turun_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

        trebel_2 = adjust_id_trebel_progres3_turun_value(trebel_2, ambil_data_trebel(new_id_value, 'Trebel_2'), pengurang)


# Fungsi untuk mengambil ID target berdasarkan progres dan mode

def ambil_new_id_value(id, progres, mode):

    if progres == 2:

        if mode == "naik":

            if id == 1:

                return 3

            elif id == 2:

                return 1

            elif id == 3:

                return 2

        elif mode == "turun":

            if id == 1:

                return 2

            elif id == 2:

                return 3

            elif id == 3:

                return 1

    elif progres == 3:

        if mode == "naik":

            if id == 1:

                return 2

            elif id == 2:

                return 3

            elif id == 3:

                return 1

        elif mode == "turun":

            if id == 1:

                return 3

            elif id == 2:

                return 1

            elif id == 3:

                return 2


# Fungsi untuk mengambil data Trebel dari ID yang berbeda

def ambil_data_trebel(target_id, kolom):

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value

```


### Penjelasan Perbaikan:

1. Saya menambahkan fungsi `ambil_new_id_value()` yang akan memilih `new_id_value` berdasarkan logika yang telah Anda tentukan untuk progres 2 dan 3 serta mode naik dan turun.

2. Saya mengubah pemanggilan `ambil_data_trebel()` agar menggunakan `new_id_value` yang sesuai dengan kondisi `id`, `progres`, dan `mode`.

3. Fungsi-fungsi `adjust_id_trebel_*` tetap digunakan untuk memodifikasi nilai `trebel` sesuai aturan yang Anda berikan.


Apa arti dari penulisan kode berikut:

    if progres == 3:

        new_id_value = ambil_new_id_value(id, progres, mode)

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(id, new_id_value, 'Trebel_1'), pengurang)


Kode berikut memiliki tujuan untuk memodifikasi nilai **trebel_1** berdasarkan **progres** (dalam hal ini progres 3) dan **mode** (dalam hal ini mode "naik"). Berikut adalah penjelasan setiap bagian dari kode:


1. **`if progres == 3:`**

   - Kondisi ini mengecek apakah nilai **progres** sama dengan 3. Jika benar, blok kode di bawahnya akan dijalankan.


2. **`new_id_value = ambil_new_id_value(id, progres, mode)`**

   - Fungsi **`ambil_new_id_value()`** digunakan untuk mengambil nilai **new_id_value** yang sesuai berdasarkan **id**, **progres**, dan **mode**. Ini digunakan untuk menentukan ID baru yang akan digunakan dalam pengambilan data Trebel.


3. **`if mode == "naik":`**

   - Mengecek apakah **mode** adalah "naik". Jika benar, blok kode di bawah ini dijalankan. Dalam kasus ini, kode bertujuan memproses data untuk mode naik.


4. **`trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(id, new_id_value, 'Trebel_1'), pengurang)`**

   - **`ambil_data_trebel(id, new_id_value, 'Trebel_1')`** mengambil data **Trebel_1** dari tabel berdasarkan **id** dan **new_id_value**.

   - Fungsi **`adjust_id_trebel_progres3_naik_value()`** kemudian dipanggil untuk menyesuaikan nilai **trebel_1** dengan data yang diambil, mengurangi beberapa nilai sesuai dengan aturan yang telah ditentukan (misalnya, pengurangan digit angka), serta nilai **pengurang** yang disediakan.


Secara keseluruhan, kode ini digunakan untuk mengambil data **Trebel_1** dari database berdasarkan **id** dan **new_id_value**, kemudian memodifikasi (mengatur) nilai tersebut jika kondisi **progres == 3** dan **mode == "naik"**.


Nilai pengurang yang dimaksud di sini apakah nilai pengurang pada fungsi adjust_value(value, pengurang) ataukah pada salah satu dari fungsi adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang, atau adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang), atau adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang), atau adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang)       


Nilai **pengurang** yang dimaksud dalam konteks kode tersebut merujuk pada **pengurang** yang digunakan dalam fungsi **adjust_id_trebel_progres3_naik_value()** atau fungsi-fungsi serupa, seperti **adjust_id_trebel_progres2_naik_value()**, **adjust_id_trebel_progres2_turun_value()**, **adjust_id_trebel_progres3_naik_value()**, dan **adjust_id_trebel_progres3_turun_value()**.


Fungsi-fungsi ini menggunakan **pengurang** untuk mengurangi nilai dari karakter angka pertama pada **trebel_value** atau **new_id_value**. Dalam hal ini, **pengurang** merupakan parameter yang dimasukkan ke dalam fungsi-fungsi tersebut untuk menentukan seberapa besar angka pertama dari nilai **trebel_value** harus dikurangi.


Dengan kata lain, **pengurang** di sini adalah parameter yang dikirim ke fungsi **adjust_id_trebel_progres3_naik_value()**, bukan dari fungsi **adjust_value(value, pengurang)** (kecuali jika **adjust_value()** juga digunakan di dalam salah satu dari fungsi-fungsi tersebut).


Jadi, dalam kode:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(id, new_id_value, 'Trebel_1'), pengurang)

```


nilai **pengurang** yang digunakan adalah parameter yang dikirim ke **adjust_id_trebel_progres3_naik_value()**.


Bagaimana dengan pengaturan pengurangan digit kedua dan digit seterusnya, apakah sudah diatur


Ya, pengaturan untuk **pengurangan digit kedua dan seterusnya** sudah diatur di dalam fungsi-fungsi penyesuaian seperti **adjust_id_trebel_progres2_naik_value()**, **adjust_id_trebel_progres2_turun_value()**, **adjust_id_trebel_progres3_naik_value()**, dan **adjust_id_trebel_progres3_turun_value()**. Pada fungsi-fungsi ini, setelah melakukan pengurangan pada digit pertama, digit kedua dan seterusnya juga diproses.


Berikut adalah logika yang mengatur pengurangan untuk digit kedua dan seterusnya pada contoh fungsi:


### Contoh pada fungsi **adjust_id_trebel_progres2_naik_value()**:

```python

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        # Pengurangan untuk digit pertama

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

    else:

        digit_pertama = trebel_value

    

    if new_id_value.isdigit():

        # Pengaturan pengurangan untuk digit kedua dan seterusnya

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

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    

    # Menggabungkan digit pertama dan digit kedua hingga terakhir

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value

```


### Analisis:

- **Digit pertama** dari **trebel_value** dikurangi dengan **pengurang** yang diberikan sebagai parameter.

- **Digit kedua dan seterusnya** dari **new_id_value** (bukan **trebel_value**) diambil dan setiap karakter dikurangi dengan nilai 2. Ini diatur dengan logika **''.join(str(int(char) - 2) for char in new_id_value[1:])**. Pengurangan ini diterapkan ke semua karakter digit setelah karakter pertama.


### Pengaturan untuk digit kedua dan seterusnya:

1. **Digit pertama**: Selalu diproses dengan **pengurang** yang dikirimkan ke fungsi (berbeda untuk tiap progres dan mode).

2. **Digit kedua dan seterusnya**: Diatur dengan pengurangan tetap (misalnya, -2 atau -3) tergantung pada progres dan mode. Pada contoh fungsi di atas, pengurangan **-2** diterapkan untuk digit kedua dan seterusnya, yang bisa berbeda untuk progres lainnya.


### Variasi untuk fungsi lainnya:

Fungsi seperti **adjust_id_trebel_progres3_naik_value()** dan **adjust_id_trebel_progres3_turun_value()** juga mengikuti pola yang sama, hanya perbedaan ada pada nilai pengurang untuk digit kedua dan seterusnya, seperti **-3** pada progres 3.


Jika ingin pengaturan lain untuk digit kedua dan seterusnya, Anda bisa mengubah angka dalam logika ini:

```python

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

```

Menjadi pengurang sesuai kebutuhan, misalnya -3 atau lainnya.


Pada kode berikut ini:

    if progres == 3:

        new_id_value = ambil_new_id_value(id, progres, mode)

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)


Pada bagian kode mana yang menyatakan pengaturan digit kedua dan seterusnya


Pada kode berikut:


```python

if progres == 3:

    new_id_value = ambil_new_id_value(id, progres, mode)

    if mode == "naik":

        trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

```


Pengaturan untuk **digit kedua dan seterusnya** dilakukan di dalam fungsi **adjust_id_trebel_progres3_naik_value()**, bukan pada bagian kode di atas. Berikut adalah penjelasannya:


### Letak pengaturan digit kedua dan seterusnya:

Pengaturan untuk digit kedua dan seterusnya dapat dilihat dalam fungsi **adjust_id_trebel_progres3_naik_value()**, seperti ini:


```python

def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

        # Pengaturan untuk digit pertama

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

    else:

        digit_pertama = trebel_value

    

    if new_id_value.isdigit():

        # Pengaturan untuk digit kedua dan seterusnya

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

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    

    # Menggabungkan digit pertama dan digit kedua hingga terakhir

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value

```


### Analisis:

- **Digit pertama** dari **trebel_value** dikurangi dengan **pengurang** yang diberikan (contohnya pada kode progres 3, pengurangnya bisa -3).

- **Digit kedua dan seterusnya** dari **new_id_value** dikurangi dengan nilai **3** dalam fungsi ini. Pengaturan ini berada pada bagian berikut:


    ```python

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

    ```


    Artinya, untuk **setiap digit kedua dan seterusnya** dari **new_id_value**, fungsi akan mengambil setiap digit, menguranginya dengan **3**, dan kemudian menggabungkannya kembali menjadi satu string.


### Kesimpulan:

Pengaturan **digit kedua dan seterusnya** tidak diatur pada kode **if progres == 3** atau saat memanggil fungsi **adjust_id_trebel_progres3_naik_value()**, melainkan diatur di dalam fungsi **adjust_id_trebel_progres3_naik_value()** itu sendiri, khususnya pada bagian yang menangani pengurangan digit kedua dan seterusnya:

```python

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

```


Apakah penulisan kode:

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1, pengurang=2))


bisa dilakukan pada kode: if progres == 3:

        new_id_value = ambil_new_id_value(id, progres, mode)

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)


Apa bedanya dengan penulisan kode yang ini:

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)


Penulisan kode berikut:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

```


mengandung kesalahan sintaks karena Python tidak memungkinkan penulisan **keyword argument** (seperti `pengurang=2`) di dalam pemanggilan fungsi yang sudah menjadi parameter fungsi lainnya.


Mari kita lihat lebih jelas perbedaannya dan kenapa kode yang pertama tidak valid.


### 1. Penulisan yang salah (tidak valid):


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

```


Di sini, kita memiliki pemanggilan fungsi:


```python

adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

```


Perhatikan bahwa **`pengurang=2`** berada di dalam pemanggilan fungsi **`adjust_id_trebel_progres3_naik_value`**, tetapi nilai tersebut harus dilewatkan melalui parameter. Karena **`adjust_id_trebel_progres3_naik_value`** memerlukan tiga argumen positional, tidak ada cara langsung untuk menambahkan **`pengurang=2`** di dalam pemanggilan ini. Python tidak memperbolehkan kita untuk meletakkan **keyword argument** di posisi seperti ini.


### 2. Penulisan yang benar:


Jika Anda ingin memberikan nilai **`pengurang`** dengan **nilai 2**, penulisan kode harus seperti ini:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), 2)

```


Atau, jika fungsi mendukung **keyword argument**, penulisannya harus seperti ini:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

```


Ini memberikan nilai **2** ke parameter **pengurang** dengan jelas dan tanpa kesalahan.


### Kesimpulan:


- **Penulisan pertama salah** karena mencoba meletakkan **keyword argument** (yaitu **`pengurang=2`**) di tempat yang tidak diperbolehkan oleh Python.

- **Penulisan kedua benar** asalkan fungsi mendukung **keyword argument** atau **pengurang** adalah argumen positional yang ditempatkan pada urutan ketiga.


Jika fungsi **`adjust_id_trebel_progres3_naik_value()`** mendukung **keyword argument**, maka penulisan yang benar adalah:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

```


Jika tidak, gunakan penulisan:


```python

trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), 2)

```


Kalau penulisan kode yang ini:

trebel_1 = adjust_id_trebel_progres2_naik_value((trebel_1, new_id_value, 2), ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=1)


Penulisan kode ini:


```python

trebel_1 = adjust_id_trebel_progres2_naik_value((trebel_1, new_id_value, 2), ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=1)

```


mengandung beberapa kesalahan dan tidak akan berfungsi seperti yang diharapkan.


### Penjelasan Kesalahan:


1. **Kesalahan dalam Penggunaan Tuple:**

   - Bagian `(trebel_1, new_id_value, 2)` membuat **tuple**. Tuple ini digunakan sebagai **argumen pertama** untuk fungsi `adjust_id_trebel_progres2_naik_value`.

   - Jika fungsi **`adjust_id_trebel_progres2_naik_value`** tidak mengharapkan sebuah tuple, maka ini akan menyebabkan kesalahan, karena ia mengharapkan argumen individual, bukan dalam bentuk tuple. Kecuali memang fungsi tersebut ditulis untuk menerima tuple, maka penulisan seperti ini tidak benar.


2. **Penulisan `pengurang=1`:**

   - Sama seperti kasus sebelumnya, **`pengurang=1`** ditulis sebagai **keyword argument**, yang berarti nilai ini diberikan secara spesifik ke parameter **`pengurang`**.

   - Jika fungsi **`adjust_id_trebel_progres2_naik_value`** mendukung **keyword arguments**, ini tidak akan menjadi masalah. Namun jika tidak, ini akan menyebabkan kesalahan.


3. **Argumen Berlebihan:**

   - Jika **`adjust_id_trebel_progres2_naik_value`** hanya mengharapkan dua atau tiga argumen, menambahkan tuple dan keyword argument bisa menyebabkan kesalahan **"too many arguments"**, karena Python menganggap Anda mengirimkan terlalu banyak parameter untuk fungsi tersebut.


### Penulisan yang Benar:


Jika **`adjust_id_trebel_progres2_naik_value`** diharapkan menerima argumen **`trebel_1`, `new_id_value`, dan `pengurang`**, maka penulisan yang benar adalah:


```python

trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, new_id_value, 2, pengurang=1)

```


Atau, jika tidak mendukung **keyword arguments** untuk **`pengurang`**, maka harus ditulis seperti ini:


```python

trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, new_id_value, 2, 1)

```


### Kesimpulan:

Penulisan kode yang Anda tunjukkan salah karena penggunaan tuple `(trebel_1, new_id_value, 2)` tidak sesuai jika fungsi tidak mengharapkan tuple. Selain itu, penulisan keyword argument **`pengurang=1`** juga perlu disesuaikan dengan apakah fungsi tersebut mendukung keyword argument atau tidak.


Okelah, melakukan CRUD pada data tabel Gn_Biru sudah selesai. Jadi kode keseluruhan untuk CRUD data gn_biru adalah menjadi berikut ini:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


root = tk.Tk()

root.title("Pilihan Nada")

root.geometry("600x400")


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10)

frame_top.grid_columnconfigure(0, minsize=-20)


# 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 = 3")

            set_id_entry(3)

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

            set_id_entry(1)

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


# 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

        entry_bass_1.delete(0, tk.END)

        entry_bass_1.insert(0, result["Bass_1"])


        entry_trebel_1.delete(0, tk.END)

        entry_trebel_1.insert(0, result["Trebel_1"])


        entry_bass_2.delete(0, tk.END)

        entry_bass_2.insert(0, result["Bass_2"])


        entry_trebel_2.delete(0, tk.END)

        entry_trebel_2.insert(0, result["Trebel_2"])


        entry_bass_3.delete(0, tk.END)

        entry_bass_3.insert(0, result["Bass_3"])


    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


# Fungsi untuk mengurangi setiap digit pada bass dan trebel

def adjust_value(value, pengurang):

    adjusted_value = ''.join(str(max(-9, int(digit) - pengurang)) if digit.isdigit() else digit for digit in value)

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres):

    if progres == 2:

        return adjust_value(value, 1)

    elif progres == 3:

        return adjust_value(value, 2)

    return value


# Pengurangan pada Bass dan Trebel tergantung pada Level Gn dan Progres

def level_gn(id, progres, mode, level_gn_selected):

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_Biru

    query = """

        SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    bass_1, trebel_1, bass_2, trebel_2, bass_3 = data


    # 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 Bass dan Trebel dengan pengurang level_gn

    bass_1 = adjust_value(bass_1, pengurang)

    trebel_1 = adjust_value(trebel_1, pengurang)

    bass_2 = adjust_value(bass_2, pengurang)

    trebel_2 = adjust_value(trebel_2, pengurang)

    bass_3 = adjust_value(bass_3, pengurang)


    # Terapkan pengurangan tambahan berdasarkan progres

    trebel_1 = apply_progres_adjustment(trebel_1, progres)

    trebel_2 = apply_progres_adjustment(trebel_2, progres)


    conn.close()


    # Return hasil

    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result

    

    # Pengaturan tambahan berdasarkan progres dan mode

    if progres == 1:

        if mode == "naik" or mode == "turun":

        # Tidak ada penyesuaian tambahan

            pass

    elif progres == 2:

        new_id_value = ambil_new_id_value(id, progres, mode)

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres2_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=1)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres2_turun_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=1)

            trebel_2 = adjust_id_trebel_progres2_turun_value(trebel_2, ambil_data_trebel(new_id_value, 'Trebel_2'), pengurang=1)

    elif progres == 3:

        new_id_value = ambil_new_id_value(id, progres, mode)

        if mode == "naik":

            trebel_1 = adjust_id_trebel_progres3_naik_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang=2)

        elif mode == "turun":

            trebel_1 = adjust_id_trebel_progres3_turun_value(trebel_1, ambil_data_trebel(new_id_value, 'Trebel_1'), pengurang)

            trebel_2 = adjust_id_trebel_progres3_turun_value(trebel_2, ambil_data_trebel(new_id_value, 'Trebel_2'), pengurang=2)


# Fungsi untuk mengambil ID target berdasarkan progres dan mode

def ambil_new_id_value(id, progres, mode):

    if progres == 2:

        if mode == "naik":

            if id == 1:

                return 3

            elif id == 2:

                return 1

            elif id == 3:

                return 2

        elif mode == "turun":

            if id == 1:

                return 2

            elif id == 2:

                return 3

            elif id == 3:

                return 1

    elif progres == 3:

        if mode == "naik":

            if id == 1:

                return 2

            elif id == 2:

                return 3

            elif id == 3:

                return 1

        elif mode == "turun":

            if id == 1:

                return 3

            elif id == 2:

                return 1

            elif id == 3:

                return 2


# Fungsi untuk mengambil data Trebel dari ID yang berbeda

def ambil_data_trebel(id, target_id, kolom):

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

    cursor = conn.cursor()


    query = f"""

        SELECT {kolom}

        FROM Gn_Biru

        WHERE ID = ?

    """

    cursor.execute(query, (target_id,))

    data = cursor.fetchone()

    conn.close()

    return data[0]


# Fungsi adjust untuk berbagai progres dan mode

def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    return adjusted_value


def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):

    if trebel_value.isdigit():

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

    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:])

    else:

        digit_kedua_dan_seterusnya = new_id_value[1:]

    adjusted_value = digit_pertama + digit_kedua_dan_seterusnya

    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)

    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:])

    else:

        digit_kedua_dan_seterusnya = 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(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)

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


# Letakkan entry 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)


# Frame untuk hasil adaptasi

frame_bottom = tk.Frame(root)

frame_bottom.pack(pady=10)


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)

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


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

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


# Labels dan Entry untuk Bass dan Trebel

gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")

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

gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")

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

gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")

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

gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")

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

gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")

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


# Entry box untuk Bass dan Trebel

entry_bass_1 = tk.Entry(frame_bottom, bg="white")

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

entry_trebel_1 = tk.Entry(frame_bottom, bg="white")

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

en

try_bass_2 = tk.Entry(frame_bottom, bg="white")

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

entry_trebel_2 = tk.Entry(frame_bottom, bg="white")

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

entry_bass_3 = tk.Entry(frame_bottom, bg="white")

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


root.mainloop()      


Kode yang Anda bagikan tampaknya sudah komprehensif dan mencakup berbagai fungsi CRUD yang dibutuhkan untuk mengelola tabel `Gn_Biru`. Setiap fungsi menangani aspek yang spesifik dari aplikasi, termasuk validasi, pengambilan data dari database, dan pengaturan data sesuai dengan progres dan mode. Berikut ini adalah langkah-langkah penting yang telah diimplementasikan:


### Fitur Utama Kode:

1. **Validasi Input Level_Gn**: Menggunakan `validate_level_gn()` untuk memvalidasi input dan menentukan ID berdasarkan nilai Level_Gn.

2. **Pengambilan Data dari Database**: Fungsi `level_gn()` menangani pengambilan data dari tabel `Gn_Biru` berdasarkan ID dan Level_Gn yang dipilih.

3. **Pengolahan Data Bass dan Trebel**: Ada fungsi-fungsi untuk melakukan penyesuaian pada data Bass dan Trebel berdasarkan Level_Gn, progres, dan mode, serta logika tambahan yang memperhitungkan perbedaan progres (`apply_progres_adjustment()` dan `adjust_value()`).

4. **Logika Progres dan Mode**: Kode ini sudah mencakup logika untuk menangani perubahan data Trebel berdasarkan progres dan mode (naik/turun) dengan menggunakan berbagai fungsi penyesuaian (`adjust_id_trebel_progres2_naik_value()`, `adjust_id_trebel_progres2_turun_value()`, dll.).


### Saran Perbaikan:

1. **Penutupan Koneksi Database**: Pastikan bahwa koneksi ke database selalu ditutup setelah query selesai untuk menghindari kebocoran memori. Ini sudah dilakukan di beberapa bagian, namun perlu diperiksa apakah ada tempat lain yang perlu ditambahkan.

   

2. **Efisiensi Kode**: Fungsi untuk mengubah nilai Trebel berdasarkan progres dan mode dapat lebih disederhanakan atau digabungkan jika memungkinkan, agar kode lebih mudah dibaca dan dipelihara.


3. **Penanganan Error yang Lebih Baik**: Saat pengambilan data dari database, jika `fetchone()` mengembalikan `None` (data tidak ditemukan), tambahkan pengecekan untuk menghindari kesalahan saat mencoba mengakses hasil query yang kosong.


4. **Antarmuka Pengguna**: Dalam hal UI, pastikan penggunaan `messagebox` digunakan dengan tepat untuk memberikan umpan balik kepada pengguna terkait status input atau hasil proses, serta mempertimbangkan pengalaman pengguna (UX) agar lebih baik.


Jika kode ini sudah berjalan sesuai dengan harapan, Anda bisa melanjutkan pengujian di lingkungan produksi dan memastikan semua fitur CRUD berfungsi dengan baik. Jika ada pertanyaan lebih lanjut atau bagian yang memerlukan penjelasan, saya siap membantu lebih lanjut.


Terakhir, pada kode tersebut tolong tambahkan perlakuan khusus pada data kolom Trebel_2:

Jika progres 2, mode naik, maka data Trebel_2 id 1 akan mengalami pengurangan digit menurut fungsi adjust_value(value, pengurang) dan fungsi apply_progres_adjustment(value, progres), dan jika progres 2, mode turun, maka data Trebel_2 id 3 akan mengalami pengurangan digit menurut fungsi adjust_value(value, pengurang) dan fungsi apply_progres_adjustment(value, progres) 


Untuk menambahkan perlakuan khusus pada data kolom `Trebel_2` berdasarkan kondisi progres dan mode yang telah dijelaskan, kita perlu menerapkan dua fungsi, yaitu `adjust_value(value, pengurang)` dan `apply_progres_adjustment(value, progres)`, kemudian melakukan pengurangan digit sesuai dengan kondisinya.


Berikut adalah langkah-langkah yang bisa kamu tambahkan pada kode yang sudah ada:


1. **Buat Fungsi `adjust_value(value, pengurang)` dan `apply_progres_adjustment(value, progres)`**  

2. **Modifikasi Perlakuan Khusus untuk `Trebel_2`**


Kode-nya dapat diperluas sebagai berikut:


### 1. Tambahkan Fungsi `adjust_value` dan `apply_progres_adjustment`:


```python

def adjust_value(value, pengurang):

    """Fungsi untuk mengurangi nilai setiap digit angka"""

    return ''.join(str(int(char) - pengurang) if char.isdigit() else char for char in value)


def apply_progres_adjustment(value, progres):

    """Fungsi untuk menyesuaikan nilai berdasarkan progres tertentu"""

    pengurang = progres # Pengurang bisa berbeda tergantung dari progres

    return adjust_value(value, pengurang)

```


### 2. Implementasikan Perlakuan Khusus pada Kolom `Trebel_2`:


Setelah memastikan kedua fungsi di atas bekerja, kita tambahkan logika untuk `Trebel_2` berdasarkan `progres` dan `mode`:


```python

# Contoh penanganan data Trebel_2

if progres == 2:

    if mode == 'naik':

        # Ambil data Trebel_2 ID 1

        trebel_2_id_1 = get_trebel_2_data(id=1) # Asumsikan fungsi ini untuk mengambil data

        # Lakukan pengurangan digit sesuai dengan fungsi adjust_value dan apply_progres_adjustment

        trebel_2_id_1 = apply_progres_adjustment(trebel_2_id_1, progres)

        # Simpan perubahan ke database atau update GUI

        update_trebel_2_data(id=1, new_value=trebel_2_id_1)


    elif mode == 'turun':

        # Ambil data Trebel_2 ID 3

        trebel_2_id_3 = get_trebel_2_data(id=3) # Asumsikan fungsi ini untuk mengambil data

        # Lakukan pengurangan digit sesuai dengan fungsi adjust_value dan apply_progres_adjustment

        trebel_2_id_3 = apply_progres_adjustment(trebel_2_id_3, progres)

        # Simpan perubahan ke database atau update GUI

        update_trebel_2_data(id=3, new_value=trebel_2_id_3)

```


### Penjelasan:

- **Fungsi `adjust_value(value, pengurang)`** akan mengurangi setiap digit angka dalam `value` sesuai dengan nilai `pengurang`.

- **Fungsi `apply_progres_adjustment(value, progres)`** akan menyesuaikan nilai `value` berdasarkan progres yang diberikan.

- Pada saat `progres == 2`, jika mode adalah `naik`, maka nilai `Trebel_2` pada ID 1 akan diproses, sedangkan jika mode adalah `turun`, maka nilai `Trebel_2` pada ID 3 akan diproses.


Dengan cara ini, kamu dapat memanipulasi data `Trebel_2` sesuai dengan kondisi yang diinginkan. Jangan lupa untuk menambahkan fungsi yang mengelola pengambilan dan penyimpanan data (`get_trebel_2_data` dan `update_trebel_2_data`) sesuai dengan arsitektur aplikasi atau database yang digunakan.



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