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

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


Tolong perbaiki kode berikut pada bagian pengaturan validate level_gn, sebab muncul pesan error': 

Exception in Tkinter callback

Traceback (most recent call last):

  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/tkinter/__init__.py", line 1948, in __call__

    return self.func(*args)

           ^^^^^^^^^^^^^^^^

  File "/storage/emulated/0/NadaPL/KGNS-NPL/coba gn biru Bass trebel1.py", line 20, in validate_level_gn

    # Tampilkan data ke dalam entry

        ^^^^^^^^^^

NameError: name 'messagebox' is not

defined


Berikut kode yang butuh diperbaiki:

import tkinter as tk

from tkinter import ttk

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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn == 1:

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

            set_id_entry(3)

        elif level_gn == 2:

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

            set_id_entry(2)

        elif level_gn == 3:

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

            set_id_entry(1)

        elif level_gn == 4:

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

            set_id_entry(3)

        elif level_gn == 5:

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

            set_id_entry(2)

        elif level_gn == 6:

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

            set_id_entry(1)

        elif level_gn == 7:

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

            set_id_entry(3)

        elif level_gn == 8:

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

            set_id_entry(2)

        elif level_gn == 9:

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

            set_id_entry(1)

        elif level_gn == 10:

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

            set_id_entry(3)

        elif level_gn == 11:

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

            set_id_entry(2)

        elif level_gn == 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

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

    cursor = conn.cursor()


    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # 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_trebel_progres2_naik(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)

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

        elif mode == "turun":

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

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

    elif progres == 3:

        if mode == "naik":

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

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

        elif mode == "turun":

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

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


    conn.close()


    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_trebel_progres2_naik(trebel_value, new_id_value, pengurang):

    return adjust_trebel(trebel_value, new_id_value, pengurang, -2)


def adjust_trebel_progres2_turun(trebel_value, new_id_value, pengurang):

    return adjust_trebel(trebel_value, new_id_value, pengurang, -2)


def adjust_trebel_progres3_naik(trebel_value, new_id_value, pengurang):

    return adjust_trebel(trebel_value, new_id_value, pengurang, -3)


def adjust_trebel_progres3_turun(trebel_value, new_id_value, pengurang):

    return adjust_trebel(trebel_value, new_id_value, pengurang, -3)


# Fungsi umum untuk penyesuaian trebel

def adjust_trebel(trebel_value, new_id_value, pengurang, adjustment_value):

    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) + adjustment_value) 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


# Fungsi untuk mengambil data Trebel dari ID lain

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 untuk memastikan urutan Level_Gn berdsarkan ID dan kolom

def level_gn(table_name):

    try:

        level_gn_selected = int(entry_level_gn.get()) # Mendapatkan Level_Gn dari input

        

        # Variabel awal untuk ID, kolom, dan modifikasi angka 

        id_selected = None

        kolom_selected = None

        modifikasi_angka = 0 # Default 0, tidak ada pengurangan


        if table_name == 'Gn_Biru':

            # Logika untuk tabel Gn_Biru

            if level_gn_selected == 1:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'

            elif level_gn_selected == 4:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 7:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 10:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 2:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 5:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 8:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 11:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 3:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 6:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 9:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                     

            elif level_gn_selected == 12:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                     

                messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")

                return None, None

                

            else:

                messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")

                return None, None, None


        else:

            messagebox.showerror("Error", "Nama tabel tidak valid!")

            return None, None, None


        # Menyisipkan ID dan kolom yang dipilih ke dalam entry box

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))


        entry_kolom.delete(0, 'end')

        entry_kolom.insert(0, kolom_selected)


        if table_name == 'Gn_Biru':

            return id_selected, kolom_selected


    except ValueError:

        messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")

        return None, None, None             


# Labels dan Entries

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

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

entry_level_gn = tk.Entry(frame_top)

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


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

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

entry_id = tk.Entry(frame_top)

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


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

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

progres_var = tk.StringVar()

progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var, values=(1, 2, 3))

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


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

label_mode.grid(row=4, column=0, padx=5, 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=5, pady=7)


# Frame untuk hasil input

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=15, 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

labels = ["Bass_1", "Trebel_1", "Bass_2", "Trebel_2", "Bass_3"]

entries = []


for i, label in enumerate(labels, start=7):

    lbl = tk.Labe

l(frame_bottom, text=label)

    lbl.grid(row=7, column=i-6, padx=5, pady=5)

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

    entry.grid(row=8, column=i-6, padx=5, pady=5)

    entries.append(entry)


entry_bass_1, entry_trebel_1, entry_bass_2, entry_trebel_2, entry_bass_3 = entries


root.mainloop()


Error yang terjadi di kode Anda adalah karena `messagebox` belum diimpor. Anda menggunakan `messagebox.showinfo()` dan `messagebox.showerror()`, tetapi `messagebox` belum dideklarasikan sebelumnya. Untuk memperbaiki masalah ini, tambahkan impor `messagebox` dari modul `tkinter`.


Berikut adalah kode yang telah diperbaiki dengan menambahkan impor `messagebox` dan beberapa perbaikan lain jika diperlukan:


```python

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox # Tambahkan ini untuk mengimpor 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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn == 1:

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

            set_id_entry(3)

        elif level_gn == 2:

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

            set_id_entry(2)

        elif level_gn == 3:

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

            set_id_entry(1)

        elif level_gn == 4:

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

            set_id_entry(3)

        elif level_gn == 5:

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

            set_id_entry(2)

        elif level_gn == 6:

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

            set_id_entry(1)

        elif level_gn == 7:

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

            set_id_entry(3)

        elif level_gn == 8:

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

            set_id_entry(2)

        elif level_gn == 9:

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

            set_id_entry(1)

        elif level_gn == 10:

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

            set_id_entry(3)

        elif level_gn == 11:

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

            set_id_entry(2)

        elif level_gn == 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

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

    cursor = conn.cursor()


    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # Pengaturan Trebel berdasarkan progres dan mode

    if progres == 1:

        trebel_1 = data[1]

        trebel_2 = data[3]

    elif progres == 2:

        if mode == "naik":

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

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

        elif mode == "turun":

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

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

    elif progres == 3:

        if mode == "naik":

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

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

        elif mode == "turun":

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

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


    conn.close()


    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }

    return result


# Fungsi-fungsi lain (adjust_trebel, ambil_data_trebel, dll.) tetap sama seperti sebelumnya.

```

Perubahan utama adalah impor `messagebox` dari `tkinter`. Jika pesan kesalahan lain muncul, pastikan untuk mengecek apakah setiap variabel dan fungsi sudah diinisialisasi dengan benar.


Maksud. saya, Beberapa kode berikut ini: def get_data_by_id(id): # Contoh data dari tabel gn_biru data_bass_trebel = { 1: {'Bass': '3456', 'Trebel': '7890'}, # Data ID 1 2: {'Bass': '2345', 'Trebel': '6789'}, # Data ID 2 3: {'Bass': '1234', 'Trebel': '5678'} # Data ID 3 }return data_bass_trebel.get(id)def reduce_digits(data, reduction): bass = data['Bass'] trebel = data['Trebel']# Kurangi setiap digit

reduced_bass = ''.join([str(max(int(digit) - reduction, 0)) for digit in bass])

reduced_trebel = ''.join([str(max(int(digit) - reduction, 0)) for digit in trebel])


return {'Bass': reduced_bass, 'Trebel': reduced_trebel}def apply_level_gn_logic(level_gn): # Aturan level_gn sesuai dengan ID level_gn_to_id_map = { 1: 3, 2: 2, 3: 1, # Level_gn 1-3 (ID asli) 4: 3, 5: 2, 6: 1, # Level_gn 4-6 (Kurangi 1) 7: 3, 8: 2, 9: 1, # Level_gn 7-9 (Kurangi 2) 10: 3, 11: 2, 12: 1 # Level_gn 10-12 (Kurangi 3) }# Tentukan pengurangan digit berdasarkan level_gn

reduction_map = {

    1: 0, 2: 0, 3: 0, # Level_gn 1-3 (tidak ada pengurangan)

    4: 1, 5: 1, 6: 1, # Level_gn 4-6 (kurangi 1)

    7: 2, 8: 2, 9: 2, # Level_gn 7-9 (kurangi 2)

    10: 3, 11: 3, 12: 3 # Level_gn 10-12 (kurangi 3)

}


# Ambil ID berdasarkan level_gn

id = level_gn_to_id_map.get(level_gn)


if id is None:

    return None # Jika level_gn tidak valid


# Ambil data dari tabel berdasarkan ID

data = get_data_by_id(id)


# Kurangi data sesuai aturan

reduction = reduction_map.get(level_gn, 0)

modified_data = reduce_digits(data, reduction)


return modified_datadef on_level_gn_selected(event): level_gn = int(entry_level_gn.get())modified_data = apply_level_gn_logic(level_gn)


if modified_data:

    # Tampilkan hasil modifikasi

    print(f"Level_gn {level_gn}: Bass = {modified_data['Bass']}, Trebel = {modified_data['Trebel']}")

else:

    print("Data tidak ditemukan.")Entry untuk level_gn dengan event bindingentry_level_gn = ttk.Combobox(frame, values=list(range(1, 13)), state="readonly") entry_level_gn.grid(row=1, column=0) entry_level_gn.bind("<>", on_level_gn_selected)Tolong ditambahkan ke kode yang 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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn == 1:

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

            set_id_entry(3)

        elif level_gn == 2:

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

            set_id_entry(2)

        elif level_gn == 3:

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

            set_id_entry(1)

        elif level_gn == 4:

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

            set_id_entry(3)

        elif level_gn == 5:

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

            set_id_entry(2)

        elif level_gn == 6:

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

            set_id_entry(1)

        elif level_gn == 7:

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

            set_id_entry(3)

        elif level_gn == 8:

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

            set_id_entry(2)

        elif level_gn == 9:

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

            set_id_entry(1)

        elif level_gn == 10:

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

            set_id_entry(3)

        elif level_gn == 11:

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

            set_id_entry(2)

        elif level_gn == 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


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


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


# Fungsi untuk memastikan urutan Level_Gn berdsarkan ID dan kolom

def level_gn(table_name):

    try:

        level_gn_selected = int(entry_level_gn.get()) # Mendapatkan Level_Gn dari input

        

        # Variabel awal untuk ID, kolom, dan modifikasi angka 

        id_selected = None

        kolom_selected = None

        modifikasi_angka = 0 # Default 0, tidak ada pengurangan


        if table_name == 'Gn_Biru':

            # Logika untuk tabel Gn_Biru

            if level_gn_selected == 1:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'

            elif level_gn_selected == 4:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 7:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 10:

                id_selected = 3

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 2:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 5:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 8:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 11:

                id_selected = 2

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 3:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 6:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                

            elif level_gn_selected == 9:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                     

            elif level_gn_selected == 12:

                id_selected = 1

                kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'                     

                messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")

                return None, None

                

            else:

                messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")

                return None, None, None


        else:

            messagebox.showerror("Error", "Nama tabel tidak valid!")

            return None, None, None


        # Menyisipkan ID dan kolom yang dipilih ke dalam entry box

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))


        entry_kolom.delete(0, 'end')

        entry_kolom.insert(0, kolom_selected)


        if table_name == 'Gn_Biru':

            return id_selected, kolom_selected


    except ValueError:

        messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")

        return None, None, None          


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

 

Untuk menambahkan kode `apply_level_gn_logic` ke dalam kode tkinter Anda, kita perlu mengintegrasikan fungsionalitas yang sudah Anda sebutkan sebelumnya, yaitu logika Level_Gn, ke dalam fungsi event binding dan sistem entry tkinter yang sudah Anda buat. Berikut adalah integrasi tersebut:


### Modifikasi Kode:

1. **Panggil `apply_level_gn_logic` setelah pemilihan Level_Gn.**

2. **Tampilkan hasil `Bass` dan `Trebel` di EntryBox.**

3. **Event binding untuk `entry_level_gn` akan memicu logika Level_Gn dan menampilkan hasilnya.**


Berikut adalah kode yang sudah diperbarui dengan integrasi `apply_level_gn_logic`:


```python

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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Fungsi untuk mendapatkan data Bass dan Trebel dari ID

def get_data_by_id(id):

    # Contoh data dari tabel gn_biru

    data_bass_trebel = {

        1: {'Bass': '3456', 'Trebel': '7890'}, # Data ID 1

        2: {'Bass': '2345', 'Trebel': '6789'}, # Data ID 2

        3: {'Bass': '1234', 'Trebel': '5678'} # Data ID 3

    }

    return data_bass_trebel.get(id)


# Fungsi untuk mengurangi setiap digit dari data Bass dan Trebel

def reduce_digits(data, reduction):

    bass = data['Bass']

    trebel = data['Trebel']

    reduced_bass = ''.join([str(max(int(digit) - reduction, 0)) for digit in bass])

    reduced_trebel = ''.join([str(max(int(digit) - reduction, 0)) for digit in trebel])

    return {'Bass': reduced_bass, 'Trebel': reduced_trebel}


# Fungsi untuk logika Level_Gn

def apply_level_gn_logic(level_gn):

    level_gn_to_id_map = {

        1: 3, 2: 2, 3: 1, # Level_gn 1-3 (ID asli)

        4: 3, 5: 2, 6: 1, # Level_gn 4-6 (Kurangi 1)

        7: 3, 8: 2, 9: 1, # Level_gn 7-9 (Kurangi 2)

        10: 3, 11: 2, 12: 1 # Level_gn 10-12 (Kurangi 3)

    }


    # Tentukan pengurangan digit berdasarkan level_gn

    reduction_map = {

        1: 0, 2: 0, 3: 0, # Level_gn 1-3 (tidak ada pengurangan)

        4: 1, 5: 1, 6: 1, # Level_gn 4-6 (kurangi 1)

        7: 2, 8: 2, 9: 2, # Level_gn 7-9 (kurangi 2)

        10: 3, 11: 3, 12: 3 # Level_gn 10-12 (kurangi 3)

    }


    # Ambil ID berdasarkan level_gn

    id = level_gn_to_id_map.get(level_gn)

    if id is None:

        return None # Jika level_gn tidak valid


    # Ambil data dari tabel berdasarkan ID

    data = get_data_by_id(id)


    # Kurangi data sesuai aturan

    reduction = reduction_map.get(level_gn, 0)

    modified_data = reduce_digits(data, reduction)

    return modified_data


# Fungsi untuk event binding pada pemilihan Level_Gn

def on_level_gn_selected(event):

    try:

        level_gn = int(entry_level_gn.get())

        modified_data = apply_level_gn_logic(level_gn)


        if modified_data:

            entry_bass_1.delete(0, tk.END)

            entry_bass_1.insert(0, modified_data['Bass'])


            entry_trebel_1.delete(0, tk.END)

            entry_trebel_1.insert(0, modified_data['Trebel'])

        else:

            messagebox.showerror("Error", "Data tidak ditemukan untuk Level Gn yang dipilih.")


    except ValueError:

        messagebox.showerror("Error", "Masukkan Level Gn yang valid.")


# Entry untuk level_gn dengan event binding

entry_level_gn = ttk.Combobox(frame_top, values=list(range(1, 13)), state="readonly")

entry_level_gn.grid(row=1, column=0)

entry_level_gn.bind("<<ComboboxSelected>>", on_level_gn_selected)


# Tambahkan entry untuk Bass dan Trebel

entry_bass_1 = tk.Entry(frame_top)

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


entry_trebel_1 = tk.Entry(frame_top)

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


# Tambahkan tombol untuk memvalidasi level_gn

validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=lambda: on_level_gn_selected(None))

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


root.mainloop()

```


### Penjelasan:

1. **Logika Level_Gn**: Saat Level_Gn dipilih dari `Combobox`, fungsi `on_level_gn_selected` akan dipanggil. Ini akan mengakses logika Level_Gn (`apply_level_gn_logic`) dan menampilkan hasilnya pada EntryBox (`entry_bass_1` dan `entry_trebel_1`).

2. **Event Binding**: `entry_level_gn.bind("<<ComboboxSelected>>", on_level_gn_selected)` memastikan bahwa ketika pengguna memilih Level_Gn dari `Combobox`, data yang sesuai akan otomatis ditampilkan.

3. **Validasi**: Jika data Level_Gn tidak valid atau kosong, maka akan muncul pesan error.


Dengan kode ini, aplikasi Anda akan dapat secara otomatis mengambil dan memodifikasi data sesuai dengan Level_Gn yang dipilih, lalu menampilkannya di EntryBox.


Maksud saya kode yang ini, perbaiki kode agar supaya:

pada level_gn 1 maka data Bass dan Trebel yang di id 3 akan mengalami tanpa pengurangan digit data. Pada level_gn 4 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 1. Pada level_gn 7 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 2. Pada level_gn 10 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 3. Kemudian pada level_gn 2 maka data Bass dan Trebel yang di id 2 akan mengalami tanpa pengurangan digit data. Pada level_gn 5 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 1. Pada level_gn 8 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 2. Pada level_gn 11 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 3. Kemudian pada level_gn 3 maka data Bass dan Trebel yang di id 1 akan mengalami tanpa pengurangan digit data. Pada level_gn 6 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 1. Pada level_gn 9 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 2. Pada level_gn 12 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 3. 

Berikut kode yang butuh diperbaiki:

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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


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


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

 

Untuk memenuhi kebutuhan Anda yang menginginkan pengurangan digit pada data Bass dan Trebel sesuai dengan Level Gn yang berbeda, berikut adalah penjelasan modifikasi yang akan saya lakukan pada kode Anda:

1. **Pada Level Gn 1, 2, 3:**

   - Tidak ada pengurangan digit pada data Bass dan Trebel untuk ID yang relevan (3, 2, 1).

2. **Pada Level Gn 4, 5, 6:**

   - Data Bass dan Trebel akan mengalami pengurangan 1 digit untuk ID yang relevan.

3. **Pada Level Gn 7, 8, 9:**

   - Data Bass dan Trebel akan mengalami pengurangan 2 digit untuk ID yang relevan.

4. **Pada Level Gn 10, 11, 12:**

   - Data Bass dan Trebel akan mengalami pengurangan 3 digit untuk ID yang relevan.

Kode yang dimodifikasi untuk mencakup aturan ini:


```python

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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # Tentukan pengurang berdasarkan level_gn

    pengurang = 0

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

        if value.isdigit():

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

            return adjusted_value

        return 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(data[1], pengurang)

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

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(data[3], pengurang)

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

        bass_3 = adjust_value(bass_3, 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

```

Penjelasan:

- **Fungsi `adjust_value`**: Mengambil setiap digit dalam string dan mengurangi nilainya sesuai dengan `pengurang` yang dihitung berdasarkan Level Gn.

- **Logika Level Gn**: Setiap Level Gn dari 1 hingga 12 akan mengatur ID yang relevan dan menentukan apakah akan mengurangi nilai digit atau tidak.

Dengan modifikasi ini, aturan pengurangan digit berdasarkan Level Gn akan diterapkan secara otomatis pada data Bass dan Trebel sesuai dengan ID yang telah diatur.


Tolong applikasikan kode berikut:

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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # Tentukan pengurang berdasarkan level_gn

    pengurang = 0

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

        if value.isdigit():

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

            return adjusted_value

        return 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(data[1], pengurang)

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

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(data[3], pengurang)

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

        bass_3 = adjust_value(bass_3, 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


Terhadap kode yang 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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


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


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


Agar supaya untuk Bass, setiap digit data Bass yang terpilih akan berkurang hanya bila menurut level_gn dan id yang sesuai saja, tapi bila menurut progres dan mode maka data Bass terpilih akan tanpa pengurangan digit data. 

Kemudian untuk Trebel, setiap digit data Trebel yang terpilih akan berkurang menurut level_gn dan id yang sesuai, dan juga berlanjut berkurang lagi digitnya menurut progres dan mode yang sesuai (data Trebel mengalami dua kali proses pengurangan digit data).


Berikut adalah pengintegrasian kode yang diinginkan dengan modifikasi yang telah diminta. Kode ini menggabungkan logika validasi **level_gn**, pengambilan data dari database, serta logika pengurangan pada **Bass** dan **Trebel** sesuai dengan progres dan mode yang dipilih.


```python

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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # Tentukan pengurang berdasarkan level_gn

    pengurang = 0

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

        if value.isdigit():

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

            return adjusted_value

        return 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(data[1], pengurang)

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

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(data[3], pengurang)

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

        bass_3 = adjust_value(bass_3, 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


# Entry untuk level_gn dan ID

entry_level_gn = tk.Entry(frame_top)

entry_level_gn.grid(row=0, column=1)

entry_id = tk.Entry(frame_top)

entry_id.grid(row=1, column=1)


# Entry untuk bass dan trebel

entry_bass_1 = tk.Entry(frame_top)

entry_bass_1.grid(row=2, column=1)


entry_trebel_1 = tk.Entry(frame_top)

entry_trebel_1.grid(row=2, column=2)


entry_bass_2 = tk.Entry(frame_top)

entry_bass_2.grid(row=3, column=1)


entry_trebel_2 = tk.Entry(frame_top)

entry_trebel_2.grid(row=3, column=2)


entry_bass_3 = tk.Entry(frame_top)

entry_bass_3.grid(row=4, column=1)


# Dropdown untuk progres dan mode

progres_var = tk.IntVar()

progres_dropdown = ttk.Combobox(frame_top, textvariable=progres_var, values=[1, 2, 3])

progres_dropdown.grid(row=5, column=1)


mode_var = tk.StringVar()

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

mode_dropdown.grid(row=5, column=2)


# Tombol untuk memilih nada

pilih_button = tk.Button(frame_top, text="Pilih Nada", command=pilih_nada)

pilih_button.grid(row=6, column=1)


root.mainloop()

```


Kode di atas akan melakukan hal berikut:

1. Validasi `level_gn` dan mengatur ID yang sesuai.

2. Mengambil data dari tabel **Gn_Biru** di dalam database `DATAMUSIK.db`.

3. Mengurangi nilai pada kolom **Bass** dan **Trebel** berdasarkan `level_gn`, progres, dan mode yang dipilih.

4. Menampilkan hasilnya di dalam form input (entry).


Jika ada yang masih perlu diperbaiki atau disesuaikan, silakan beritahu!


Tolong perbaiki kode berikut:

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) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# 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') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Tambahkan tombol untuk memvalidasi level_gn

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

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


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


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

    # Koneksi ke database

    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 = data[0]

    bass_2 = data[2]

    bass_3 = data[4]


    # Tentukan pengurang berdasarkan level_gn

    pengurang = 0

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

        if value.isdigit():

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

            return adjusted_value

        return 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(data[1], 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)

                

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

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(data[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)

                 

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

        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]


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


Agar supaya applikasi dapat berjalan dengan baik dan tanpa error, di mana setiap digit data Bass yang terpilih akan berkurang hanya bila menurut level_gn dan id yang sesuai saja, tapi bila menurut progres dan mode maka data Bass terpilih akan tanpa pengurangan digit data. Kemudian untuk Trebel, setiap digit data Trebel yang terpilih akan berkurang menurut level_gn dan id yang sesuai, dan juga berlanjut berkurang lagi digitnya menurut progres dan mode yang sesuai (data Trebel mengalami dua kali proses pengurangan digit data).


Berikut adalah perbaikan kode Anda, dengan beberapa penyesuaian untuk menjaga logika tetap konsisten dan menghindari kesalahan. Saya menyarankan beberapa perubahan untuk menyederhanakan logika, terutama dalam bagian yang mengatur trebel dan bass:


### Perubahan Kunci:

1. **`level_gn_selected`** perlu diambil sebagai parameter dalam fungsi `level_gn()`.

2. Fungsi `adjust_value()` telah diperbaiki agar menangani nilai angka secara benar.

3. Struktur logika pengisian data trebel disederhanakan.

4. Logika yang berulang untuk menangani progres dan mode sekarang lebih modular.


### Kode yang Diperbaiki:


```python

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

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

        bass_2 = adjust_value(bass_2, pengurang)

        trebel_2 = adjust_value(trebel_2, pengurang)

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

        bass_3 = adjust_value(bass_3, pengurang)


    # Sesuaikan trebel dengan progres dan mode

    if progres == 1:

        trebel_1, trebel_2 = data[1], data[3]

    elif progres == 2:

        if mode == "naik":

            trebel_1 = adjust_value(data[1], 1)

            trebel_2 = adjust_value(data[3], 1)

        elif mode == "turun":

            trebel_1 = adjust_value(data[1], -1)

            trebel_2 = adjust_value(data[3], -1)

    elif progres == 3:

        if mode == "naik":

            trebel_1 = adjust_value(data[1], 2)

            trebel_2 = adjust_value(data[3], 2)

        elif mode == "turun":

            trebel_1 = adjust_value(data[1], -2)

            trebel_2 = adjust_value(data[3], -2)


    result = {

        "Bass_1": bass_1,

        "Trebel_1": trebel_1,

        "Bass_2": bass_2,

        "Trebel_2": trebel_2,

        "Bass_3": bass_3

    }


    conn.close()

    return result


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


# Entry dan widget lainnya (progress, mode, dll.) di sini...

# ...


root.mainloop()

```


### Penjelasan Perubahan:

1. **Struktur Pengaturan Trebel dan Bass**: Saya menyesuaikan logika untuk mengurangi pengulangan, sehingga pengaturan nilai trebel dan bass lebih modular.

2. **Fungsi `adjust_value()`**: Fungsi ini sekarang menangani pengurangan digit dengan aman, menghindari nilai negatif, dan hanya mengubah karakter numerik.

3. **Penggunaan Mode**: Mode dan progres sekarang lebih terstruktur, mengurangi kompleksitas kode yang tidak perlu.


Dengan perubahan ini, kode akan menjadi lebih modular dan mudah di-maintain.



Bersambung ke...

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




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