Langsung ke konten utama

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

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


Apa arti dari penulisan kode berikut ini:

def adjust_value(value, pengurang):

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

    return adjusted_value


Kode tersebut merupakan sebuah fungsi Python bernama `adjust_value` yang melakukan penyesuaian pada setiap digit angka dalam sebuah string berdasarkan nilai pengurang yang diberikan. Berikut penjelasan rinci dari setiap bagian:


### 1. **Definisi Fungsi**

```python

def adjust_value(value, pengurang):

```

Fungsi ini menerima dua argumen:

- `value`: Sebuah string yang mengandung karakter-karakter, termasuk digit angka.

- `pengurang`: Sebuah bilangan bulat yang akan dikurangi dari setiap digit angka dalam `value`.


### 2. **Proses Penyesuaian**

```python

adjusted_value = ''.join(

    str(max(-9, int(digit) - pengurang)) if digit.isdigit() else digit 

    for digit in value

)

```

Bagian ini menggunakan list comprehension untuk menghasilkan sebuah string baru (`adjusted_value`) berdasarkan karakter-karakter dalam `value`.


- `digit.isdigit()`: Mengecek apakah setiap karakter `digit` dalam string `value` adalah angka.

- Jika `digit` adalah angka, maka `digit` diubah menjadi integer dengan `int(digit)`, lalu dikurangi dengan `pengurang` (`int(digit) - pengurang`).

- Fungsi `max(-9, int(digit) - pengurang)` memastikan bahwa hasil pengurangan tidak lebih kecil dari -9.

- Setelah pengurangan, angka yang sudah disesuaikan dikonversi kembali menjadi string menggunakan `str()`.

- Jika karakter bukan angka, maka karakter tersebut tetap dibiarkan tanpa perubahan (`else digit`).


### 3. **Mengembalikan Hasil**

```python

return adjusted_value

```

Fungsi ini mengembalikan string hasil dari penyesuaian nilai yang telah dilakukan sebelumnya.


### Contoh:

Jika `value` adalah `"123abc"` dan `pengurang` adalah `1`, maka:

- Angka `1` dikurangi `1` menjadi `0`.

- Angka `2` dikurangi `1` menjadi `1`.

- Angka `3` dikurangi `1` menjadi `2`.

- Huruf `a`, `b`, dan `c` tidak berubah.


Sehingga, fungsi akan menghasilkan string `"012abc"`.


### Kesimpulan

Fungsi ini melakukan operasi pada setiap digit angka dalam string, menguranginya dengan nilai tertentu, dan memastikan bahwa hasil pengurangan tidak kurang dari -9.


Untuk CRUD_Gn_A_Bass pada kode berikut, mengapa pengurang digit hanya pada digit terakhir saja.

Berikut kode:

 import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


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

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

            set_id_entry(1)

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

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

            set_id_entry(2)

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

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

            set_id_entry(3)

        else:

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

            reset_entries()


    except ValueError:

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

        reset_entries()


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

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly')


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengurangi setiap digit pada bass dan trebel

def adjust_value(value, pengurang):

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

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    if progres_selected == 1:

        return adjust_value(value, 0)

    elif progres_selected == 2:

        return adjust_value(value, 1)

    elif progres_selected == 3:

        return adjust_value(value, 2)

    return value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data


    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai Bass dan Trebel dengan pengurang level_gn

    gugusan_nada = adjust_value(gugusan_nada, pengurang)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result            

    

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

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

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

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

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_bass_label = tk.Label(bottom_frame, text="Bass")

gn_a_bass_label

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

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

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


root.mainloop()


Dalam kode yang Anda berikan, pengurangan digit hanya pada digit terakhir dalam konteks `Gn_A_Bass` diatur melalui fungsi `adjust_value()`. Mari kita analisis mengapa ini terjadi.


### Fungsi `adjust_value()`

```python

def adjust_value(value, pengurang):

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

    return adjusted_value

```

Fungsi ini bekerja dengan mengurangi setiap **digit** angka dalam string `value` sesuai dengan nilai `pengurang`. Jika karakter bukan angka, karakter tersebut tidak berubah.


Pada kode yang digunakan untuk pengurangan digit hanya pada digit terakhir, dapat disebabkan oleh:


1. **Karakter terakhir adalah digit yang valid**:

   Fungsi ini melakukan iterasi melalui setiap karakter dalam string. Apabila string `value` yang dimasukkan hanya memiliki satu digit angka, maka hanya satu digit tersebut yang akan dikurangi.


2. **Hanya digit terakhir yang diproses sebagai angka**:

   Jika input `gugusan_nada` (yang berasal dari hasil query database) mengandung string dengan kombinasi angka dan karakter non-digit (seperti huruf atau simbol), maka fungsi `adjust_value()` hanya akan mengurangi karakter yang berupa angka. Sebagai contoh, jika string `gugusan_nada` adalah `'123a'`, maka pengurangan hanya akan dilakukan pada angka-angka `1`, `2`, dan `3`.


### Pengurangan Tergantung pada `Level_Gn`

Pengurangan tersebut juga diatur oleh logika di bagian berikut ini:

```python

# Tentukan pengurang berdasarkan level_gn

if level_gn_selected in [1, 2, 3]:

    pengurang = 0

elif level_gn_selected in [4, 5, 6]:

    pengurang = 1

elif level_gn_selected in [7, 8, 9]:

    pengurang = 2

elif level_gn_selected in [10, 11, 12]:

    pengurang = 3

```

Pengurang untuk setiap digit diatur berdasarkan `level_gn_selected`. Semakin tinggi levelnya, pengurangnya semakin besar (dari 0 hingga 3).


### Kenapa Pengurang Hanya pada Digit Terakhir?

Alasan utamanya mungkin terletak pada **struktur data `gugusan_nada` yang diambil dari database**. Jika data yang diambil hanya terdiri dari satu digit atau hanya ada satu angka pada digit terakhir dalam string yang diperoleh dari database, maka hanya angka itu yang akan mengalami pengurangan. Misalnya, jika nilai dari database adalah `'A12B'`, maka pengurangan hanya akan diterapkan pada digit `2`.


### Kesimpulan

Pengurangan hanya terjadi pada digit terakhir karena:


1. Struktur data dari database (misalnya, hanya satu digit pada akhir string).

2. Penggunaan fungsi `adjust_value()` yang hanya mengurangi karakter angka dan mengabaikan karakter non-digit.

   

Jika Anda ingin menerapkan pengurangan pada setiap digit dalam string `gugusan_nada`, pastikan data yang diperoleh dari database mengandung lebih dari satu digit angka atau revisi logika pengurangannya untuk menjangkau seluruh angka dalam string.


Tolong modifikasi kode tersebut agar supaya menerapkan pengurangan digit pada setiap digit dalam data kolom gugusan_nada pada tabel Gn_A_Bass


Untuk menerapkan pengurangan pada setiap digit dari data di kolom `gugusan_nada` pada tabel `Gn_A_Bass`, kita perlu memodifikasi fungsi `adjust_value` agar melakukan pengurangan pada setiap digit. Pada versi yang ada, fungsi tersebut hanya mengurangi digit terakhir saja. Modifikasi ini akan memastikan bahwa setiap digit dalam string angka dari `gugusan_nada` akan dikurangi sesuai dengan level atau progres yang dipilih.


Berikut adalah modifikasi kode yang dilakukan pada fungsi `adjust_value` agar mengurangi setiap digit dalam string angka, bukan hanya digit terakhir:


```python

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


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

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

            set_id_entry(1)

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

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

            set_id_entry(2)

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

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

            set_id_entry(3)

        else:

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

            reset_entries()


    except ValueError:

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

        reset_entries()


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

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly')


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengurangi setiap digit pada bass dan trebel

def adjust_value(value, pengurang):

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

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    if progres_selected == 1:

        return adjust_value(value, 0)

    elif progres_selected == 2:

        return adjust_value(value, 1)

    elif progres_selected == 3:

        return adjust_value(value, 2)

    return value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai Bass dan Trebel dengan pengurang level_gn

    gugusan_nada = adjust_value(gugusan_nada, pengurang)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result            

    

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

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

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


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

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


# Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

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

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_bass_label = tk.Label(bottom_frame, text="Bass")

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

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

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



root.mainloop()

```


### Penjelasan Perubahan:

1. **Fungsi `adjust_value`**:

   - Setiap digit angka dalam string `gugusan_nada` akan diambil dan dikurangi sesuai dengan nilai pengurang.

   - Pengurangan digit dilakukan dengan cara mengambil setiap karakter dari string dan memeriksa apakah itu angka. Jika ya, maka dikurangi dengan `pengurang`, dan jika bukan angka, karakter tetap tidak diubah.

   - Hasil pengurangan kemudian diambil menggunakan operator modulo (`% 10`) untuk memastikan bahwa digit tidak menjadi negatif, tetapi kembali ke angka dalam rentang 0-9.


Kode ini memastikan setiap digit dalam string `gugusan_nada` dikurangi, bukan hanya digit terakhir.


Maksud saya, Tolong modifikasi kode tersebut agar supaya menerapkan pengurangan digit pada setiap angka digit (bukan digit) dalam data kolom gugusan_nada pada tabel Gn_A_Bass. Misalnya data "234", jika progres 2 maka akan mengalami pengurangan 1 pada setiap angka digit menjadi "123" (angka 2 - 1 = 1, 3 - 1 = 2, dan 4 - 1 = 3), jika progres 3 maka akan mengalami pengurangan 2 pada setiap angka digit menjadi "012" (angka 2 - 2 = 0, 3 - 2 = 1, dan 4 - 2 = 2).  


Baik, untuk memahami lebih jelas maksud Anda, yang diinginkan adalah mengurangi **setiap angka dalam data `gugusan_nada`** dengan nilai tertentu berdasarkan progres yang dipilih. Jadi, jika terdapat angka "234", dan progres yang dipilih adalah 2, maka setiap angka akan dikurangi dengan 1 sehingga menjadi "123". Jika progres 3, setiap angka akan dikurangi 2 sehingga menjadi "012", dan seterusnya.


Untuk mewujudkan hal ini, berikut adalah modifikasi kode yang melakukan pengurangan pada setiap angka digit dalam `gugusan_nada` berdasarkan nilai progres yang dipilih:


### Kode yang telah dimodifikasi:


```python

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


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

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

            set_id_entry(1)

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

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

            set_id_entry(2)

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

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

            set_id_entry(3)

        else:

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

            reset_entries()


    except ValueError:

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

        reset_entries()


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

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly')


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


# Fungsi untuk mengurangi setiap angka digit pada string

def adjust_value(value, pengurang):

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

    return adjusted_value


# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres

def apply_progres_adjustment(value, progres_selected):

    if progres_selected == 1:

        return adjust_value(value, 0)

    elif progres_selected == 2:

        return adjust_value(value, 1)

    elif progres_selected == 3:

        return adjust_value(value, 2)

    return value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Tentukan pengurang berdasarkan progres

    pengurang = progres_selected


    # Sesuaikan nilai Bass dan Trebel dengan pengurang progres

    gugusan_nada = adjust_value(gugusan_nada, pengurang)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result            

    

# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

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

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


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

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


# Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

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

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_bass_label = tk.Label(bottom_frame, text="Bass")

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

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

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



root.mainloop()

```


### Penjelasan Perubahan:


1. **Fungsi `adjust_value`**:

   - Fungsi ini telah dimodifikasi untuk mengurangi **setiap digit angka** dari string `gugusan_nada`.

   - Setiap digit angka dalam string diambil, dikurangi dengan nilai `pengurang`, dan hasilnya diatur dalam rentang 0-9 menggunakan modulo 10 untuk menghindari hasil negatif.

   - Ini memastikan bahwa setiap angka digit dalam `gugusan_nada` dikurangi sesuai dengan nilai progres yang dipilih.


2. **Penggunaan Fungsi `apply_progres_adjustment`**:

   - Fungsi ini diterapkan untuk menentukan pengurangan berdasarkan nilai progres yang dipilih oleh pengguna (misalnya 1, 2, atau 3).


Dengan modifikasi ini, data `gugusan_nada` seperti "234" akan dikurangi sesuai progres. Misalnya, jika progres 2 dipilih, maka hasilnya menjadi "123", atau jika progres 3, hasilnya menjadi "012".


Tolong lanjutkan pada kondisi level_gn yang berubah:


    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


Berikut adalah kelanjutan dari modifikasi kode dengan tambahan logika berdasarkan nilai `level_gn_selected`, di mana nilai pengurang akan berbeda tergantung pada level yang dipilih. Saya juga menambahkan kondisi di dalam fungsi `level_gn` untuk menentukan pengurang berdasarkan perubahan `level_gn`.


### Modifikasi Kode:


```python

# Fungsi untuk menerapkan pengurangan tambahan berdasarkan progres dan level_gn

def apply_progres_and_level_adjustment(value, progres_selected, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Kombinasikan pengurangan berdasarkan progres

    pengurang += progres_selected - 1


    # Sesuaikan nilai string berdasarkan pengurang

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

    return adjusted_value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass dengan pengurang yang didapat dari kombinasi level_gn dan progres

    gugusan_nada = apply_progres_and_level_adjustment(gugusan_nada, progres_selected, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Tombol untuk memproses pemilihan nada

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

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

```


### Penjelasan Tambahan:


1. **Fungsi `apply_progres_and_level_adjustment`**:

   - Fungsi ini digunakan untuk menentukan **pengurang** berdasarkan `level_gn_selected` dan juga menambahkan pengurangan tambahan berdasarkan nilai `progres_selected`.

   - Logika pengurang dari `level_gn_selected` sudah ditambahkan, dengan rincian:

     - Jika `level_gn_selected` berada di [1, 2, 3], pengurangnya adalah 0.

     - Jika berada di [4, 5, 6], pengurangnya adalah 1, dan seterusnya.

   - Pengurangan berdasarkan progres dihitung sebagai tambahan pengurang dari level, yaitu `progres_selected - 1`.

   - Setiap digit pada data `gugusan_nada` akan dikurangi sesuai pengurang dan disesuaikan dalam rentang 0–9 dengan modulo 10.


2. **Fungsi `level_gn`**:

   - Fungsi ini mengambil data `gugusan_nada` dari database dan kemudian menerapkan pengurangan berdasarkan level dan progres menggunakan fungsi `apply_progres_and_level_adjustment`.

  

Dengan modifikasi ini, setiap perubahan pada `level_gn` akan diterapkan pada nilai `gugusan_nada` sesuai dengan progres yang dipilih.


Setiap pengurangan angka pada digit hanya terjadi pada perubahan level_gn, berikut:

def apply_progres_and_level_adjustment(value, progres_selected, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


Sedangkan pengurangan angka pada digit tidak terjadi pada perubahan progres (data Bass di progres 1, atau progres 2, atau progres 3 adalah tetap) 


Baik, jadi pengurangan angka hanya terjadi ketika ada perubahan pada `level_gn_selected`, sementara perubahan pada `progres_selected` tidak mempengaruhi pengurangan digit dalam data kolom `gugusan_nada`. Jadi progres hanya berfungsi sebagai penanda atau atribut, dan tidak akan mengubah nilai digit pada data. 


Saya akan memodifikasi fungsi sesuai permintaan tersebut.


### Kode yang Dimodifikasi:


```python

# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

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

    return adjusted_value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Tombol untuk memproses pemilihan nada

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

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

```


### Penjelasan Kode:


1. **Fungsi `apply_level_adjustment`**:

   - Fungsi ini hanya melakukan pengurangan pada digit berdasarkan **level_gn_selected** tanpa memperhitungkan `progres_selected`. Pengurang ditentukan oleh rentang level Gn yang dipilih.

   - Jika `level_gn_selected` di antara [1, 2, 3], maka tidak ada pengurangan (pengurang = 0).

   - Untuk level yang lebih tinggi, pengurangan bertambah, yaitu 1 untuk level [4, 5, 6], 2 untuk level [7, 8, 9], dan 3 untuk level [10, 11, 12].

   - Setiap digit dalam nilai `gugusan_nada` akan dikurangi sesuai pengurang tersebut dan diubah menjadi format modulo 10 (agar tidak menjadi negatif dan tetap dalam rentang 0-9).


2. **Fungsi `level_gn`**:

   - Fungsi ini mengambil data `gugusan_nada` dari database dan menerapkan fungsi `apply_level_adjustment` untuk menyesuaikan data hanya berdasarkan **level_gn_selected**, sedangkan `progres_selected` tidak mengubah nilai digit.

  

Dengan modifikasi ini, pengurangan angka pada digit hanya akan terjadi saat ada perubahan level Gn, dan nilai pada `progres_selected` tidak akan mempengaruhi nilai dari data Bass.


Mantap. Hasil akhir dari kode untuk file CRUD_Gn_A_Bass.py adalah berikut ini:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

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


# Bottom Frame

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

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


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


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

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

            set_id_entry(1)

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

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

            set_id_entry(2)

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

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

            set_id_entry(3)

        else:

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

            reset_entries()


    except ValueError:

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

        reset_entries()


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

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly')


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

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

    return adjusted_value


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

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

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

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result


# Tambahkan tombol untuk memvalidasi level_gn

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

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


# Tombol untuk memproses pemilihan nada

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

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


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

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


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

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

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


# Labels dan Entries

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

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

entry_level_gn = tk.Entry(bottom_frame)

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


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

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

entry_id = tk.Entry(bottom_frame)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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

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


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

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


# Gugusan Nada Terpilih Field

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

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

      

# Label dan Entry

gn_a_bass_label = tk.Label(bottom_frame, text="Bass")

gn_a_bass_label.grid(row=

10, column=1, padx=10, pady=5)  

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

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


root.mainloop()


Kode yang kamu buat sudah terstruktur dengan baik, dengan beberapa elemen penting seperti validasi `Level_Gn`, pengaturan ID, dan pengambilan data dari database `Gn_A_Bass`. Logika pengurangan angka berdasarkan level juga sudah diterapkan dengan benar.


Berikut adalah beberapa poin penting dari kode:

1. **Validasi `Level_Gn`**: Fungsi `validate_level_gn` memastikan bahwa input `Level_Gn` sesuai dengan range yang diizinkan (1-12), dan menetapkan ID berdasarkan `Level_Gn`.

2. **Pengambilan dan Penyesuaian Gugusan Nada**: Fungsi `level_gn` mengambil data `Gugusan_nada` dari tabel `Gn_A_Bass` berdasarkan ID dan menyesuaikan nilainya berdasarkan `Level_Gn`, tanpa memperhatikan perubahan progres.

3. **Entry Protection**: Fungsi `set_id_entry` mengunci entry ID setelah ID valid dimasukkan, sehingga pengguna tidak bisa mengubah ID secara manual.

4. **Pengurangan Nilai Berdasarkan Level_Gn**: Fungsi `apply_level_adjustment` melakukan penyesuaian digit-digit angka dalam `Gugusan_nada` dengan pengurangan yang tepat, sesuai dengan level yang dipilih.

Semua ini terintegrasi dengan baik pada elemen antarmuka tkinter untuk memudahkan pengguna dalam memasukkan data dan melihat hasilnya.

Jika ada tambahan atau revisi lain yang dibutuhkan untuk memperluas fungsionalitas, tinggal menyesuaikan kode di atas dengan tambahan fitur yang kamu inginkan!


Pada kode tolong tambahkan fungsi untuk membersihkan dan mereset entry, berikut:

finally:

        # Bersihkan atau reset entry dan combobox setelah data dipilih

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('')

        mode_combobox.set('')


Berikut adalah modifikasi kode untuk menambahkan fungsi membersihkan dan mereset entry dan combobox setelah data dipilih. Kode ini ditempatkan di dalam blok `finally` di dalam fungsi `pilih_nada()` agar setelah pemilihan nada, semua field entry akan otomatis direset.


```python

# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


    finally:

        # Bersihkan atau reset entry dan combobox setelah data dipilih

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('')

        mode_combobox.set('')

```


Penjelasan tambahan:

- `entry_level_gn.delete(0, 'end')` membersihkan input pada entry level_gn.

- `entry_id.delete(0, 'end')` membersihkan input pada entry ID.

- `progres_combobox.set('')` mengatur combobox progres agar kembali kosong.

- `mode_combobox.set('')` mengatur combobox mode agar kembali kosong.

Fungsi ini memastikan semua input direset setiap kali pengguna selesai memilih nada.


Inputan di entry_id yang "read only" belum mau kembali kosong


Agar input di `entry_id` yang berstatus "read only" bisa kembali dihapus atau direset, kamu harus mengatur ulang status entry menjadi `normal` sebelum menghapus isinya, dan kemudian bisa mengaturnya kembali menjadi "read only" setelah proses reset selesai.


Berikut adalah modifikasi yang dapat kamu lakukan pada fungsi `reset_entries()` agar `entry_id` dapat kembali kosong meskipun statusnya "read only":


```python

# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    

    # Mengatur entry_id menjadi normal agar bisa dihapus

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)

    

    # Setelah direset, kembalikan entry_id ke mode read only

    entry_id.config(state='readonly')


    # Reset combobox

    progres_combobox.set('')

    mode_combobox.set('')

```


Kemudian, tambahkan juga pada blok `finally` di fungsi `pilih_nada()` untuk membersihkan semua input:


```python

# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


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

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


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

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

    

    except Exception as e:

        print("Error:", e)


    finally:

        # Bersihkan atau reset entry dan combobox setelah data dipilih

        entry_level_gn.delete(0, 'end')

        entry_id.config(state='normal') # Atur kembali ke normal

        entry_id.delete(0, 'end') # Hapus isinya

        entry_id.config(state='readonly') # Kembali jadi read only

        progres_combobox.set('')

        mode_combobox.set('')

```


Dengan demikian, ketika kamu memanggil `reset_entries()` atau membersihkan input di dalam `finally`, entry ID yang berstatus "read only" bisa dihapus dan di-reset dengan benar, lalu kembali menjadi "read only" setelahnya.



Selesai ....



Komentar

Postingan populer dari blog ini

Pemograman R Studio

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

MIGRASI DATABASE DARI SQLite KE MySQL (Part-1)

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

Cara Menjadi Pengembang Front End – Keterampilan Front End Web Dev

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