Langsung ke konten utama

MENGAMBIL DAN MENAMPILKAN DATA DARI KOLOM TREBEL BIASA DARI TABEL Gn_Cyan_Bawah DI DATABASE DATAMUSIK.db

MENGAMBIL DAN MENAMPILKAN DATA DARI KOLOM TREBEL BIASA DARI TABEL Gn_Cyan_Bawah DI DATABASE DATAMUSIK.db


Untuk data trebel_biasa dari tabel Gn_Cyan_Bawah hanya ada 3 id karena baris ke empat di kolom Trebel_Biasa adalah kosong. Untuk data Trebel_biasa dari tabel Sub_Gn_Cyan_Bawah adalah kosong karena baris ke satu di kolom Trebel_Biasa adalah kosong.

Tolong buat kode untuk fungsi yang cocok untuk def adjust_trebel_value(), sehingga data nada Trebel terpilih dari kolom Trebel_Biasa dari tabel Gn_Cyan_Bawah dapat ditampilkan pada entry_trebel berdasarkan level_gn, id, progres, dan mode, sesuai logika yang cocok diterapkan berikut ini:

Jika data gugus nada yang terpilih dari kolom Trebel_Biasa pada Gn_Cyan_Bawah:

1a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 1, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1

1b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 1,, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2

1c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 1, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3.

1d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini)

2a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 2, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1 yang setiap karakter angka datanya dikurang 1.

2b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 2,, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2 yang setiap karakter angka datanya dikurang 1.

2c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 2, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3 yang setiap karakter angka datanya dikurang 1. 

2d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini)

3a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 3, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1 yang setiap karakter angka datanya dikurang 2.

3b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 3,, dan jika mode Naik atau Turun,

maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2 yang setiap karakter angka datanya dikurang 2.

3c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 3, dan jika mode Naik atau Turun:

maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3 yang setiap karakter angka datanya dikurang 2. 

3d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini).


Berikut kode yang butuh di perbaiki:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

from tkinter import Tk, Label, Entry, Button, Frame, StringVar

import os

# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik")    

# Fungsi untuk mengambil data Trebel_Biasa dari Gn_Cyan_Bawah berdasarkan ID dan Level_Gn

def get_data_gn_cyan_bawah_from_db():

    id_selected = entry_id.get()

    if not id_selected:

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

        return 

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

    cursor = conn.cursor()

    cursor.execute("SELECT Trebel_Biasa FROM Gn_Cyan_Bawah WHERE ID=?", (id_selected,))

    result = cursor.fetchone()   

    if result:

        entry_trebel.delete(0, 'end')

        entry_trebel.insert(0, result[0])

    else:

        messagebox.showerror("Error", "Data tidak ditemukan!")  

    conn.close()

# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres

def adjust_trebel_value(trebel_value, progres):

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

def adjust_trebel_value(trebel_biasa_value, adjustment):

    # Implementasi logika untuk menyesuaikan nilai Trebel

    try:

        adjusted_value = str(int(trebel_biasa_value) + adjustment)

    except ValueError:

        adjusted_value = trebel_biasa_value # Jika nilai trebel_biasa bukan angka, biarkan tetap sama

    return adjusted_value ''

# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan nada

def pilih_nada():

    try:

    # Ambil nilai ID yang dipilih dari entry_id dan level_gn                  

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

        nada_selected = nada_var.get() 

        

        id_selected, id_selected_sub = level_gn()

        if id_selected is None or id_selected_sub is None:

             return # Hentikan eksekusi jika ID tidak valid                               

# Fungsi untuk memilih nada berdasarkan logika yang diterapkan       

        level_gn_selected = level_gn()

        if level_gn_selected is None:

         messagebox.showerror("Error", "Data sesuaikan dengan id = level_gm")

         return                 

        

        data_gn_cyan_bawah = get_data_gn_cyan_bawah_from_db()

        return             

        # Hapus data sebelumnya di EntryBox      

        entry_trebel.delete(0, tk.END)        

        # Ambil nilai Trebel_Biasa 

        trebel_value = data_gn_cyan_bawah[3]

        

        # Tampilkan data pada entry_trebel dan entry_sub_trebel

        entry_trebel.delete(0, 'end')

        entry_trebel.insert(0, data_gn_cyan_bawah['Trebel_Biasa'])                              

# Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, level_gn, Progres, Mode, dan nada

        if id_selected == 1:

            level_gn_selected = 1 or 5 or 9         

            if progres_selected == 1 and progres_selected == "naik":

                # Progres 1, Mode Naik

                entry_trebel_biasa.insert(0, trebel_biasa_value)

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

                entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))

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

                entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))                     

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

               # Progres 1, Mode Turun

               entry_trebel_biasa.insert(0, trebel_biasa_value)                

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

                entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))

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

                entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))                  

        if id_selected == 2:   

            level_gn_selected =2 or 6 or 10     

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

                # Progres 1, Mode Naik

                entry_trebel_biasa.insert(0, trebel_biasa_value)

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))                

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))                        

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

               # Progres 1, Mode Turun

               entry_trebel_biasa.insert(0, trebel_biasa_value)                 

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))       

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))

        if id_selected == 3:  

            level_gn_selected =3 or 7 or 11     

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

                # Progres 1, Mode Naik

                entry_trebel_biasa.insert(0, trebel_biasa_value)

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))                      

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

                    # Progres 1, Mode Turun

               entry_trebel_biasa.insert(0, trebel_biasa_value)                

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

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))  

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

                 entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))                                                      

        if id_selected == 4:  

            level_gn_selected = 4 or 8 or 12

            if progres_selected == 1 or progres_selected == 2 or progres_selected == 3:             

                messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")          

            elif mode_selected == "naik" or mode_selected == "turun":   

                messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")                                             

        else:

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

            return

        messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")

    except ValueError:

        messagebox.showerror("Error", "ID dan progres harus berupa angka")

    finally:      

    # Bersihkan atau reset entry dan combobox setelah data dipilih  

        entry_level_gn.delete(0, 'end')

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('') # Kosongkan combobox

        mode_combobox.set('') # Kosongkan combobox

        nada_combobox.set('') # Kosongkan combobox     

# Fungsi untuk memastikan urutan Level_Gn dan ID

def level_gn():

    try:  

        # Kondisi untuk Gn_Cyan_Bawah     

        level_gn_selected = int(entry_level_gn.get())       

        if level_gn_selected in [1, 5, 9]:

            id_selected = 1

        elif level_gn_selected in [2, 6, 10]:

            id_selected = 2

        elif level_gn_selected in [3, 7, 11]:

            id_selected = 3

        elif level_gn_selected in [4, 8, 12]:

            id_selected = 4

        else:

            messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")

            return None       

        # Memasukkan id_selected ke entry_id

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))

        # Kondisi untuk Sub_Gn_Cyan_Bawah

        if level_gn_selected in range(1, 13):

            id_selected_sub = 1

        return id_selected, id_selected_sub

    except ValueError:

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

        return None, None

# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah

Gn_Cyan_Bawah = True

Sub_Gn_Cyan_Bawah = False                     

frame_top = tk.Frame(root)

frame_top.pack()

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

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

entry_level_gn = tk.Entry(frame_top)

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

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

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

entry_id = tk.Entry(frame_top)

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

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

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

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=5, pady=5)

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

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

mode_var = tk.StringVar()

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

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

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

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

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

nada_var = tk.StringVar()

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

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

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

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

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

# Hapus label, entry field, dan combobox untuk Progres dan Mode yang tidak digunakan lagi

# label_progres.grid_forget()

# progres_combobox.grid_forget()

# label_mode.grid_forget()

# mode_combobox.grid_forget() 

# Bottom Frame

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

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

#Label dan Entry Ambil Gugusan nada Teroilih

label_trebel = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")

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

entry_trebel = tk.Entry(bottom_frame)

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

label_sub_trebel = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")

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

entry_sub_trebel = tk.

Entry(bottom_frame)

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

# Tombol untuk memilih nada

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

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

root.mainloop()


Untuk memperbaiki fungsi `adjust_trebel_value` dan `pilih_nada`, kita perlu memastikan bahwa logika yang diterapkan sesuai dengan ketentuan yang Anda jelaskan. Berikut adalah versi yang diperbarui dari kedua fungsi tersebut:


### Fungsi `adjust_trebel_value`

```python

def adjust_trebel_value(trebel_biasa_value, progres):

    if trebel_biasa_value.isdigit():

        # Kurangi nilai berdasarkan progres

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

    else:

        # Jika bukan digit, biarkan nilainya tetap sama

        adjusted_value = trebel_biasa_value

    return adjusted_value

```


### Fungsi `pilih_nada`

```python

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

        nada_selected = nada_var.get()


        if id_selected not in [1, 2, 3] or level_gn_selected not in [1, 2, 3, 5, 6, 7, 9, 10, 11]:

            messagebox.showerror("Error", "ID atau Level_Gn tidak valid!")

            return


        # Dapatkan data Trebel_Biasa dari database

        data_gn_cyan_bawah = get_data_gn_cyan_bawah_from_db()

        trebel_biasa_value = data_gn_cyan_bawah[0]


        if id_selected == 1 and level_gn_selected in [1, 5, 9]:

            if progres_selected == 1:

                # Progres 1, Mode Naik atau Turun

                adjusted_trebel = trebel_biasa_value

            elif progres_selected == 2:

                # Progres 2, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)

            elif progres_selected == 3:

                # Progres 3, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)


        elif id_selected == 2 and level_gn_selected in [2, 6, 10]:

            if progres_selected == 1:

                # Progres 1, Mode Naik atau Turun

                adjusted_trebel = trebel_biasa_value

            elif progres_selected == 2:

                # Progres 2, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)

            elif progres_selected == 3:

                # Progres 3, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)


        elif id_selected == 3 and level_gn_selected in [3, 7, 11]:

            if progres_selected == 1:

                # Progres 1, Mode Naik atau Turun

                adjusted_trebel = trebel_biasa_value

            elif progres_selected == 2:

                # Progres 2, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)

            elif progres_selected == 3:

                # Progres 3, Mode Naik atau Turun

                adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)


        else:

            messagebox.showerror("Error", "ID atau Level_Gn tidak sesuai dengan logika yang diterapkan!")

            return


        # Tampilkan hasil pada entry_trebel

        entry_trebel.delete(0, 'end')

        entry_trebel.insert(0, adjusted_trebel)


    except Exception as e:

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

```

### Penjelasan

1. **Fungsi `adjust_trebel_value`:** Fungsi ini mengurangi nilai karakter angka dalam `trebel_biasa_value` berdasarkan nilai `progres`. Jika karakter bukan angka, nilai akan tetap sama. 

2. **Fungsi `pilih_nada`:** Fungsi ini mengambil input dari `entry_id`, `entry_level_gn`, `progres_var`, dan `mode_var`, kemudian menyesuaikan nilai `Trebel_Biasa` berdasarkan ID, Level_Gn, Progres, dan Mode yang dipilih. Hasilnya ditampilkan di `entry_trebel`.

3. **Logika Pengisian**:

   - **ID 1:** Jika Level_Gn adalah 1, 5, atau 9, maka nilai `Trebel_Biasa` disesuaikan berdasarkan progres.

   - **ID 2:** Jika Level_Gn adalah 2, 6, atau 10, nilai `Trebel_Biasa` disesuaikan berdasarkan progres.

   - **ID 3:** Jika Level_Gn adalah 3, 7, atau 11, nilai `Trebel_Biasa` juga disesuaikan berdasarkan progres.

Dengan modifikasi ini, nilai `Trebel_Biasa` akan disesuaikan dengan logika yang Anda berikan dan ditampilkan di `entry_trebel`. Pastikan juga untuk menguji kode ini pada kondisi yang berbeda untuk memastikan bahwa hasilnya sesuai dengan yang diharapkan.


Muncul pesan error':


Exception in Tkinter callback

Traceback (most recent call last):

  File "/storage/emulated/0/NadaPL/KGNS-NPL/CRUD_Gn_Cyan_Bawah_Trebel.py", line 49, in pilih_nada

    level_gn_selected = int(entry_level_gn.get())

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

ValueError: invalid literal for int() with base 10: ''

During handling of the above exception, another exception occurred:

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/CRUD_Gn_Cyan_Bawah_Trebel.py", line 83, in pilih_nada

    if id_selected == 1 and level_gn_selected in [1, 5, 9]:

       ^^^^^^^^^^^

UnboundLocalError: cannot access local variable 'id_selected' where it is not associa

ted with a value.


Error yang muncul disebabkan oleh dua masalah dalam kode:

1. **ValueError**: Kesalahan ini terjadi saat program mencoba mengonversi nilai dari `entry_level_gn.get()` menjadi integer (`int`). Pesan error menunjukkan bahwa `entry_level_gn.get()` mengembalikan string kosong (`''`), yang tidak dapat dikonversi menjadi integer. 

2. **UnboundLocalError**: Kesalahan ini muncul karena `id_selected` diakses dalam blok kode setelah terjadinya kesalahan dalam blok `try`, sehingga variabel tersebut tidak pernah diinisialisasi.

### Cara Mengatasi

1. **Cek Input yang Kosong:**

   Sebelum mencoba mengonversi nilai dari `entry_level_gn` menjadi integer, pastikan bahwa inputnya tidak kosong. Anda bisa menambahkan pengecekan untuk memastikan input sudah benar.

2. **Inisialisasi Variabel dengan Default:**

   Untuk menghindari `UnboundLocalError`, Anda dapat menginisialisasi variabel `id_selected` dan `level_gn_selected` dengan nilai default di luar blok `try`.

Berikut adalah kode yang sudah diperbaiki:


```python

def pilih_nada():

    # Inisialisasi variabel default

    id_selected = None

    level_gn_selected = None

    try:

        # Cek apakah entry ID dan Level_Gn tidak kosong

        if entry_id.get().strip() == '' or entry_level_gn.get().strip() == '':

            raise ValueError("Entry ID dan Level_Gn tidak boleh kosong")

        id_selected = int(entry_id.get())

        level_gn_selected = int(entry_level_gn.get())   

    except ValueError as ve:

        print(f"Error: {ve}")

        return 

    # Lanjutkan logika setelah try-except

    if id_selected == 1 and level_gn_selected in [1, 5, 9]:

        # Logika untuk ID 1 dan Level 1, 5, 9

        pass

    # Tambahkan kondisi lainnya sesuai dengan logika yang diinginkan

    # Logika selanjutnya

```

### Penjelasan:

1. **Pengecekan Input**: Kode menambahkan pengecekan apakah `entry_id` atau `entry_level_gn` kosong sebelum mencoba mengonversinya menjadi integer.

2. **Inisialisasi Awal**: Variabel `id_selected` dan `level_gn_selected` diinisialisasi di luar blok `try` untuk menghindari `UnboundLocalError` jika terjadi kesalahan di dalam blok `try`.

Dengan perbaikan ini, program akan lebih tangguh dalam menangani kasus input yang kosong dan akan menghindari kesalahan akses variabel yang belum diinisialisasi.


Masalah unboumdLocalError, dan ValueError sudah beres dapat teratasi. Masalah penyesuaian data Trebel yang ditampilkan pada entry_trebel belum dapat teratasi agar sesuai dengan progres dan mode, ini mungkin karena data yang diambil dari kolom Trebel_Biasa adalah data angka hasil dari otomatisasi perhitungan formula dari data pada kolom Bass_1 di tabel Gn_Cyan_Atas untuk menjadi data pada kolom Trebel_Biasa di tabel Gn_Cyan_Bawah yaitu hanya karakter angka pertama saja yang ditampilkan di kolom Trebel_Biasa di tabel Gn_Cyan_Bawah, sedangkan karakter kedua dan seterusnya adalah inputan dari user. Jadi misalnya jika user meneruskan memperbanyak angka data pada kolom Trebel_Biasa, tentunya harus dipastikan bahwa data yang diinput user tersebut seharusnya tidak kembali menjadi hanya karakter angka pertama saja yang tampil di kolom Trebel_Biasa di tabel Gn_Cyan_Bawah oleh karena adanya kode untuk otomatisasi perhitungan formula tersebut.


Untuk menangani masalah ini, Anda perlu memastikan bahwa saat data otomatis dimasukkan ke dalam kolom `Trebel_Biasa` pada tabel `Gn_Cyan_Bawah`, sistem hanya mengotomatiskan pengisian karakter pertama, sementara karakter kedua dan seterusnya harus tetap sesuai dengan input yang diberikan oleh pengguna.

### Langkah Penyelesaian:

1. **Pisahkan Pengisian Otomatis dan Input Pengguna:**

   Buat logika yang membedakan antara pengisian otomatis dari karakter pertama dengan input manual dari karakter-karakter selanjutnya. Ini bisa dilakukan dengan menggabungkan kedua bagian tersebut menjadi satu string.

2. **Pertahankan Input Pengguna:**

   Pastikan bahwa setelah input otomatis dilakukan, input manual yang dilakukan oleh pengguna tetap dipertahankan dan tidak diubah oleh sistem.

### Implementasi Logika:

Berikut adalah contoh bagaimana Anda bisa menyesuaikan kode untuk memastikan bahwa hanya karakter pertama yang diisi secara otomatis, dan karakter kedua serta seterusnya adalah input dari pengguna:

```

python

def isi_trebel_biasa():

    # Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas

    bass_data = ambil_data_bass_1()   

    # Hanya ambil karakter pertama dari hasil otomatisasi

    otomatis_angka_pertama = bass_data[0]  # Mengambil karakter pertama saja

    # Ambil input dari pengguna

    inputan_pengguna = entry_trebel.get()  # Mengambil keseluruhan input dari pengguna

    # Gabungkan hasil otomatis dengan input pengguna

    if len(inputan_pengguna) > 1:

        data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:]  # Gabungkan otomatis dan input pengguna

    else:

        data_trebel_biasa = otomatis_angka_pertama  # Hanya gunakan otomatis jika tidak ada input lain  

    # Masukkan data_trebel_biasa ke Entry

    entry_trebel.delete(0, tk.END)

    entry_trebel.insert(0, data_trebel_biasa)

    # Update data ke tabel Gn_Cyan_Bawah

   update_data_trebel_biasa_ke_tabel(data_trebel_biasa)

def ambil_data_bass_1():

    # Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas

    # Misalnya:

    return "123"  # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas

def update_data_trebel_biasa_ke_tabel(data):

    # Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah

    pass

```

### Penjelasan:

1. **Pisahkan Otomatisasi dan Input Pengguna:**

   Kode mengambil karakter pertama dari `bass_data` dan kemudian menggabungkannya dengan sisa input dari pengguna (`inputan_pengguna[1:]`).

2. **Pertahankan Input Pengguna:**

   Jika pengguna menambahkan lebih dari satu karakter, kode mempertahankan karakter kedua dan seterusnya yang diinput oleh pengguna.

3. **Update Entry dan Tabel:**

   Setelah penggabungan selesai, kode memperbarui `entry_trebel` dan menyimpan hasilnya ke tabel `Gn_Cyan_Bawah`.

### Penggunaan Fungsi:

Anda bisa memanggil fungsi `isi_trebel_biasa()` di bagian kode di mana otomatisasi pengisian `Trebel_Biasa` diperlukan, seperti dalam callback untuk tombol atau event tertentu.

Dengan implementasi ini, input manual dari pengguna akan tetap dipertahankan setelah pengisian otomatis karakter pertama dilakukan. Sistem akan menggabungkan hasil otomatisasi dengan input manual sehingga hasil akhir sesuai dengan yang diharapkan.


Sudah saya periksa tabel Gn_Cyan_Bawah, dan isian data pada kolom Trebel_Biasa sudah saya buat secara manual untuk menguji fungsi def adjust_trebel_value() agar data Trebel terpilih yang tampil pada entry_trebel apakah benar atau tidak berdasarkan progres dan mode, dan ternyata masih salah dan kesalahan ada pada kode perintah adjust_trebel_value() yaitu penyesuaian nilai data Trebel yang didapat adalah tidak tepat. Untuk tolong beri arti dari kode berikut:

        elif id_selected == 2 and level_gn_selected in [2, 6, 10]: 

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

               adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)


Kemudian perbaiki kode kembali ya.


Baik, mari kita analisis dan berikan arti dari kode berikut:

```

python

elif id_selected == 2 and level_gn_selected in [2, 6, 10]: 

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

        adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)

```

### Penjelasan Kode:

1. **`elif id_selected == 2 and level_gn_selected in [2, 6, 10]`:**

   - Kode ini memeriksa apakah `id_selected` memiliki nilai `2` dan apakah `level_gn_selected` termasuk dalam daftar [2, 6, 10]. 

   - Jika kondisi ini benar, maka blok kode berikutnya akan dijalankan.

2. **`if progres_selected == 2 and mode_selected == "naik":`:**

   - Kode ini memeriksa dua kondisi:

     - `progres_selected` harus sama dengan `2`.

     - `mode_selected` harus sama dengan `"naik"`.

   - Jika kedua kondisi ini benar, maka kode dalam blok ini akan dieksekusi.

3. **`adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)`:**

   - Fungsi `adjust_trebel_value()` dipanggil dengan dua argumen:

     - `trebel_biasa_value`: Ini adalah nilai yang ada di kolom `Trebel_Biasa` yang diambil dari tabel `Gn_Cyan_Bawah`.

     - `1`: Ini adalah nilai yang akan ditambahkan atau diubah pada `trebel_biasa_value` untuk menghasilkan `adjusted_trebel`.

   - Hasil dari fungsi `adjust_trebel_value()` akan disimpan ke dalam variabel `adjusted_trebel`.

### Arti dari Kode:

Kode di atas digunakan untuk menyesuaikan nilai `Trebel_Biasa` berdasarkan `id_selected`, `level_gn_selected`, `progres_selected`, dan `mode_selected`. Jika `id_selected` adalah `2`, `level_gn_selected` adalah salah satu dari [2, 6, 10], `progres_selected` adalah `2`, dan `mode_selected` adalah `"naik"`, maka nilai `Trebel_Biasa` akan disesuaikan dengan menambahkan (atau mengubah) nilai sebesar `1` menggunakan fungsi `adjust_trebel_value()`.

### Perbaikan Kode:

Jika penyesuaian nilai Trebel tidak tepat, maka Anda mungkin perlu mengubah logika di dalam fungsi `adjust_trebel_value()` atau memeriksa kembali nilai yang digunakan dalam kondisi `if`.

#### Contoh Perbaikan Fungsi `adjust_trebel_value()`:

Misalnya, jika fungsi `adjust_trebel_value()` saat ini hanya menambahkan angka tanpa mempertimbangkan konteks lain, Anda mungkin ingin menyesuaikan fungsi tersebut agar lebih dinamis.

```

python

def adjust_trebel_value(trebel_biasa_value, adjustment):

    # Pastikan trebel_biasa_value adalah string yang valid

    if trebel_biasa_value.isdigit():

        # Ambil karakter pertama untuk penyesuaian

        first_char = int(trebel_biasa_value[0])       

        # Lakukan penyesuaian pada karakter pertama

        adjusted_first_char = first_char + adjustment    

        # Pertahankan karakter lainnya (input pengguna)

        remaining_chars = trebel_biasa_value[1:]     

        # Gabungkan hasil penyesuaian dengan sisa input pengguna

        return str(adjusted_first_char) + remaining_chars

    else:

        # Jika nilai tidak valid, kembalikan tanpa perubahan atau log error

        return trebel_biasa_value

```

### Penjelasan Perbaikan:

- Fungsi `adjust_trebel_value()` di atas hanya menyesuaikan karakter pertama, sementara karakter kedua dan seterusnya tetap dipertahankan dari input pengguna.

- Logika ini bisa disesuaikan berdasarkan kebutuhan Anda. Misalnya, jika Anda ingin karakter kedua dan seterusnya juga diubah, Anda dapat memperluas logika ini.

### Integrasi dengan Kode yang Ada:

Jika `adjust_trebel_value()` telah diperbaiki, pastikan juga untuk mengecek apakah `id_selected`, `level_gn_selected`, `progres_selected`, dan `mode_selected` sudah benar sesuai dengan logika yang diinginkan.

Pastikan juga bahwa nilai yang diterima oleh `trebel_biasa_value` adalah nilai yang sesuai dan dapat diolah oleh fungsi `adjust_trebel_value()`.

Jika masih ada kesalahan atau tidak sesuai, kita bisa memperbaiki lebih lanjut berdasarkan masalah yang muncul.


Apa arti dari kode berikut:


            elif progres == 2 and mode == "naik":

                entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))

                                

Kode tersebut yang dipakai pada fungsi berikut:

 def adjust_trebel_value(trebel_value, progres):

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


Apakah fungsi tersebut bisa dipakai cocok untuk mendapatkan data trebel_biasa yang sesuai menurut progres, dan mode


Mari kita analisis arti dari kode yang Anda berikan.

### Kode:

```python

elif progres == 2 and mode == "naik":

    entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))

```

### Penjelasan Kode:

1. **`elif progres == 2 and mode == "naik":`**

   - Kode ini memeriksa apakah nilai `progres` adalah `2` dan `mode` adalah `"naik"`. 

   - Jika kedua kondisi ini benar, maka blok kode berikutnya akan dijalankan.

2. **`get_data_from_db(3)[3]`:**

   - Fungsi `get_data_from_db(3)` kemungkinan mengembalikan data dari database berdasarkan argumen `3`.

   - `[3]` berarti mengambil elemen ke-4 dari hasil yang dikembalikan oleh `get_data_from_db(3)`.

   - Dengan demikian, `get_data_from_db(3)[3]` adalah nilai yang diambil dari database.

3. **`adjust_trebel_value(get_data_from_db(3)[3], 1)`:**

   - Fungsi `adjust_trebel_value()` dipanggil dengan dua argumen:

     - Argumen pertama adalah nilai `trebel_value`, yang diperoleh dari `get_data_from_db(3)[3]`.

     - Argumen kedua adalah `progres`, dalam hal ini bernilai `1`.

   - Fungsi ini menyesuaikan `trebel_value` sesuai dengan logika yang ada dalam `adjust_trebel_value()`.

4. **`entry_trebel_1.insert(0, ...)`**

   - Setelah nilai `trebel_value` disesuaikan oleh fungsi `adjust_trebel_value()`, hasilnya dimasukkan ke dalam `entry_trebel_1` pada posisi pertama (`index 0`).

### Fungsi `adjust_trebel_value()`:


```python

def adjust_trebel_value(trebel_value, progres):

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

```

### Cara Kerja Fungsi:


1. **`''.join(...)`**:

   - Menggabungkan hasil dari setiap elemen dalam generator menjadi satu string.


2. **`for char in trebel_value`**:

   - Looping melalui setiap karakter (`char`) dalam `trebel_value`.


3. **`if char.isdigit()`:**

   - Memeriksa apakah `char` adalah digit (angka).

   - Jika `char` adalah digit, maka:


     ```python

     str(int(char) - progres)

     ```

     - `char` diubah menjadi integer, kemudian dikurangi dengan nilai `progres`, lalu diubah kembali menjadi string.

   - Jika `char` bukan digit, karakter tersebut tetap dimasukkan tanpa perubahan.

### Cocok atau Tidak?

- **Cocok untuk Mengurangi Nilai Digit:**

  - Fungsi `adjust_trebel_value()` cocok jika Anda ingin mengurangi nilai digit dalam `trebel_value` dengan nilai `progres`. Misalnya, jika `trebel_value` adalah "53" dan `progres` adalah `1`, maka hasilnya akan menjadi "42".

- **Tidak Cocok untuk Menambah Nilai Digit:**

  - Jika tujuan Anda adalah untuk **menambah** nilai digit berdasarkan progres, maka fungsi ini tidak cocok karena hanya mengurangi nilai digit.

### Kesimpulan:

- **Fungsi `adjust_trebel_value()`** cocok untuk mendapatkan data `trebel_biasa` jika Anda ingin mengurangi nilai digit dalam string `trebel_value` sesuai dengan `progres`.

- Jika Anda perlu menambahkan nilai atau mengubah logika lainnya, Anda perlu memodifikasi fungsi tersebut.

Jika Anda ingin menambah nilai digit atau menyesuaikan dengan logika lain, berikut adalah modifikasi fungsi:

### Modifikasi untuk Menambah Nilai:

```

python

def adjust_trebel_value(trebel_value, progres):

    return ''.join(str(int(char) + progres) if char.isdigit() else char for char in trebel_value)

```

- Fungsi ini akan **menambahkan** nilai `progres` ke setiap digit dalam `trebel_value`.

Jika ini sesuai dengan kebutuhan Anda, Anda bisa menggunakan modifikasi tersebut untuk mendapatkan data `trebel_biasa` yang sesuai menurut `progres` dan `mode`.


Nilai data Trebel_Biasa yang tampil di entry_trebel masih tetap dalam progres 1, data Trebel yang diharapkan seharusnya sesuai dengan progres, bila progres 2 maka digit data Trebel_Biasa harus berkurang 1, dan bila progres 3 maka digit data Trebel_Biasa harus berkurang 2. Lagi pula pada kode yang dieksekusi, muncul pesan di message_box: "None Type: object is not subscriptable


Dari penjelasan Anda, tampaknya ada dua masalah yang perlu diatasi:

1. **Data `Trebel_Biasa` yang Tampil Tidak Berubah Sesuai dengan Progres:**

   - Anda mengharapkan nilai `Trebel_Biasa` yang tampil di `entry_trebel` untuk disesuaikan berdasarkan `progres`, di mana setiap progres seharusnya mengurangi nilai digit dari `Trebel_Biasa`.

2. **Pesan Error "NoneType: object is not subscriptable":**

   - Error ini mengindikasikan bahwa Anda mencoba mengakses elemen dari objek yang bernilai `None`, yang tidak bisa diakses seperti sebuah list atau string.

Mari kita coba atasi kedua masalah ini.

### 1. Mengatasi Masalah Data `Trebel_Biasa` yang Tidak Berubah Sesuai Progres

Pastikan bahwa fungsi `adjust_trebel_value()` dipanggil dengan benar dan nilai `trebel_value` disesuaikan dengan progres. Berikut adalah fungsi yang mungkin Anda butuhkan:


```python

def adjust_trebel_value(trebel_value, progres):

    # Mengurangi nilai digit sesuai progres

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

```

Lalu, saat menampilkan data di `entry_trebel`, pastikan Anda menyesuaikan dengan progres, misalnya:


```python

def update_trebel_entry():

    # Asumsi get_data_from_db mengembalikan nilai yang benar

    trebel_biasa_value = get_data_from_db(id_selected)[index_trebel_biasa]

    if progres == 1:

        entry_trebel.insert(0, trebel_biasa_value)

    elif progres == 2:

        entry_trebel.insert(0, adjust_trebel_value(trebel_biasa_value, 1))

    elif progres == 3:

        entry_trebel.insert(0, adjust_trebel_value(trebel_biasa_value, 2))

```

### 2. Mengatasi Error "NoneType: object is not subscriptable"

Error ini mungkin muncul dari fungsi `get_data_from_db()` yang mengembalikan `None` atau dari proses di mana Anda mengakses nilai yang seharusnya berupa list atau string, tetapi ternyata `None`.

Untuk mengatasi ini, Anda bisa menambahkan pengecekan pada nilai yang diambil dari `get_data_from_db()`:


```python

def get_data_from_db(id):

    # Fungsi untuk mengambil data dari database

    # Misal, data diambil dalam bentuk tuple/list

    # Jika tidak ditemukan data, kembalikan tuple/list kosong atau default value

    data = ... # Ambil data dari database

    return data if data is not None else []

# Kemudian dalam fungsi Anda

trebel_biasa_value = get_data_from_db(id_selected)

if trebel_biasa_value:

    trebel_biasa_value = trebel_biasa_value[index_trebel_biasa]

else:

    messagebox.showerror("Error", "Data not found for ID selected")

    return

```

Penting untuk memastikan bahwa `get_data_from_db()` selalu mengembalikan nilai yang valid, atau setidaknya menangani kasus di mana tidak ada data yang ditemukan.

### Kesimpulan:

- Pastikan fungsi `adjust_trebel_value()` digunakan dengan benar untuk mengurangi nilai digit sesuai dengan `progres`.

- Tangani kasus di mana `get_data_from_db()` mungkin mengembalikan `None`, dan pastikan bahwa nilai yang diambil dari database adalah valid sebelum digunakan. Jika tidak, berikan pesan kesalahan yang informatif kepada pengguna.

Coba implementasi perubahan ini, dan lihat apakah masalahnya teratasi.


Saya rasa yang cocok kita pakai untuk menampilkan data Trebel_Biasa pada entry_trebel yang telah sesuai menurut progres dan dengan mode adalah dengan memakai fungsi def adjust_trebel_value(trebel_value, progres):

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

Kemudian untuk memasukkan data Trebel_Biasa yang telah sesuai ke dalam entry_trebel adalah dengan memakai kode berikut (sebagai contoh) adalah:

            elif progres == 1 and mode == "naik":

                entry_trebel.insert(0, data_gn_cyan_bawah[2])               

             elif progres == 2 and mode == "naik": entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))

             elif progres == 3 and mode == "naik": entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))

    

Penerapan fungsi `adjust_trebel_value()` seperti yang Anda sebutkan sudah tepat untuk menampilkan data `Trebel_Biasa` pada `entry_trebel` sesuai dengan progres dan mode. Fungsi tersebut secara efektif mengurangi nilai digit dalam string `Trebel_Biasa` sesuai dengan progres yang dipilih. Berikut adalah penjelasan lebih lanjut untuk memastikan kode tersebut bekerja sesuai harapan:

### Fungsi `adjust_trebel_value`

Fungsi ini bekerja dengan cara mengurangi setiap karakter angka dalam string `Trebel_Biasa` sesuai dengan nilai `progres`. Jika karakter tersebut bukan angka, karakter tersebut akan tetap tidak berubah.

### Kode untuk Menampilkan Data `Trebel_Biasa`

Anda telah memberikan contoh kode yang menampilkan data `Trebel_Biasa` pada `entry_trebel`. Mari kita tinjau kembali dan pastikan semuanya berfungsi dengan baik:

```python

# Misal get_data_from_db(1)[3] adalah Trebel_Biasa yang ingin diambil

# Pada progres 1, tidak ada penyesuaian pada nilai Trebel_Biasa

elif progres == 1 and mode == "naik":

    entry_trebel.insert(0, data_gn_cyan_bawah[2])    

# Pada progres 2, kurangi digit pada Trebel_Biasa sebanyak 1

elif progres == 2 and mode == "naik":

    entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))

# Pada progres 3, kurangi digit pada Trebel_Biasa sebanyak 2

elif progres == 3 and mode == "naik":

    entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))

```

### Penjelasan Kode

1. **Progres 1:** 

   - Nilai `Trebel_Biasa` ditampilkan langsung tanpa perubahan karena progres 1 berarti tidak ada penyesuaian yang diperlukan.

2. **Progres 2:**

   - Fungsi `adjust_trebel_value()` digunakan untuk mengurangi setiap digit angka dalam `Trebel_Biasa` sebanyak 1.

3. **Progres 3:**

   - Fungsi `adjust_trebel_value()` digunakan untuk mengurangi setiap digit angka dalam `Trebel_Biasa` sebanyak 2.

### Catatan Tambahan:

- Pastikan bahwa `get_data_from_db(1)[3]` mengembalikan nilai yang benar, yaitu nilai `Trebel_Biasa` yang diinginkan.

- Pastikan tidak ada kesalahan pada pengindeksan `data_gn_cyan_bawah[2]` dan `get_data_from_db(1)[3]`.

- Jika terjadi error seperti `NoneType: object is not subscriptable`, pastikan `get_data_from_db` benar-benar mengembalikan nilai yang diharapkan.

Dengan penyesuaian ini, data `Trebel_Biasa` yang ditampilkan di `entry_trebel` akan disesuaikan berdasarkan progres dan mode, sesuai yang Anda harapkan. Coba implementasikan ini dan periksa hasilnya untuk memastikan apakah sudah sesuai dengan kebutuhan Anda.        


Untuk progres 2 dan Progres 3 sudah saya dapatkan. Tolong perbaiki kode dibawah ini untuk mendapatkan nilai data Trebel_Biasa di progres 1 yang hasilnya ditampilkan pada entry_trebel.

Berikut kode:


import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

from tkinter import Tk, Label, Entry, Button, Frame, StringVar

import os


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik")    


def isi_trebel_biasa():

    # Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas

    bass_data = ambil_data_bass_1()    

    # Hanya ambil karakter pertama dari hasil otomatisasi

    otomatis_angka_pertama = bass_data[0] # Mengambil karakter pertama saja

    # Ambil input dari pengguna

    inputan_pengguna = entry_trebel.get() # Mengambil keseluruhan input dari pengguna

    # Gabungkan hasil otomatis dengan input pengguna

    if len(inputan_pengguna) > 1:

        data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:] # Gabungkan otomatis dan input pengguna

    else:

        data_trebel_biasa = otomatis_angka_pertama # Hanya gunakan otomatis jika tidak ada input lain

    

    # Masukkan data_trebel_biasa ke Entry

    entry_trebel.delete(0, tk.END)

    entry_trebel.insert(0, data_trebel_biasa)


    # Update data ke tabel Gn_Cyan_Bawah

    update_data_trebel_biasa_ke_tabel(data_trebel_biasa)


def ambil_data_bass_1():

    # Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas

    # Misalnya:

    return "123" # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas


def update_data_trebel_biasa_ke_tabel(data):

    # Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah

    pass

    

# Fungsi untuk mengambil data Trebel_Biasa dari Gn_Cyan_Bawah berdasarkan ID dan Level_Gn

# Fungsi untuk mengambil data dari database berdasarkan ID

def get_data_from_db(id_selected):

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

    cursor = conn.cursor()

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

    data = cursor.fetchone()

    conn.close()

    return data


# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres


def adjust_trebel_value(trebel_biasa_value, progres):

    if trebel_biasa_value.isdigit():

        # Kurangi nilai berdasarkan progres

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

    else:

        # Jika bukan digit, biarkan nilainya tetap sama

        adjusted_value = trebel_biasa_value

    return adjusted_value


# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan 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()

        nada_selected = nada_var.get().lower()


        # Dapatkan data dari database

        data_gn_cyan_bawah = get_data_from_db(id_selected)

        if not data_gn_cyan_bawah:

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

            return

            

        # Hapus data sebelumnya di EntryBox       

        entry_trebel.delete(0, tk.END)        

                              

# Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, Level_gn, Progres, Mode, dan Nada

        if id_selected == 1 and level_gn_selected in [1, 5, 9]:

            if progres_selected == 1 and progres_selected == "naik":

                # Progres 1, Mode Naik

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 0))  

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))

                          

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

               # Progres 1, Mode Turun

               entry_trebel.insert(0, trebel_biasa_value)      

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))

                    

        elif id_selected == 2 and level_gn_selected in [2, 6, 10]: 

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

                # Progres 1, Mode Naik

                entry_trebel.insert(0, trebel_biasa_value)     

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))

                           

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

               # Progres 1, Mode Turun

               entry_trebel.insert(0, trebel_biasa_value)     

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))


        elif id_selected == 3 and level_gn_selected in [3, 7, 11]:

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

                # Progres 1, Mode Naik

                entry_trebel.insert(0, trebel_biasa_value)     

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))

                           

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

                    # Progres 1, Mode Turun

               entry_trebel.insert(0, trebel_biasa_value)      

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))

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

               entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))

                                                        

        elif id_selected == 4 and level_gn_selected in [4, 8, 12]:

            if progres_selected == 1 or progres_selected == 2 or progres_selected == 3:             

                messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")          

            elif mode_selected == "naik" or mode_selected == "turun":   

                messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")          

                                                                      

        else:

            messagebox.showerror("Error", "ID dan Level_Gn tidak sesuai dengan logika")

            return

        messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")

    except ValueError:

        messagebox.showerror("Error", "ID dan progres harus berupa angka")


    finally:      

    # Bersihkan atau reset entry dan combobox setelah data dipilih  

        entry_level_gn.delete(0, 'end')

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('') # Kosongkan combobox

        mode_combobox.set('') # Kosongkan combobox

        nada_combobox.set('') # Kosongkan combobox     


# Fungsi untuk memastikan urutan Level_Gn dan ID

def level_gn():

    try:  

        # Kondisi untuk Gn_Cyan_Bawah     

        level_gn_selected = int(entry_level_gn.get())       

        if level_gn_selected in [1, 5, 9]:

            id_selected = 1

        elif level_gn_selected in [2, 6, 10]:

            id_selected = 2

        elif level_gn_selected in [3, 7, 11]:

            id_selected = 3

        elif level_gn_selected in [4, 8, 12]:

            id_selected = 4

        else:

            messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")

            return None

        

        # Memasukkan id_selected ke entry_id

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))


        # Kondisi untuk Sub_Gn_Cyan_Bawah

        if level_gn_selected in range(1, 13):

            id_selected_sub = 1


        return id_selected, id_selected_sub


    except ValueError:

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

        return None, None

# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah

Gn_Cyan_Bawah = True

Sub_Gn_Cyan_Bawah = False                

        

frame_top = tk.Frame(root)

frame_top.pack()

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

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

entry_level_gn = tk.Entry(frame_top)

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


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

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

entry_id = tk.Entry(frame_top)

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


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

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

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=5, pady=5)


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

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

mode_var = tk.StringVar()

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

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

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


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

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

nada_var = tk.StringVar()

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

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

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

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

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

# Hapus label, entry field, dan combobox untuk Progres dan Mode yang tidak digunakan lagi

# label_progres.grid_forget()

# progres_combobox.grid_forget()

# label_mode.grid_forget()

# mode_combobox.grid_forget() 

# Bottom Frame

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

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

#Label dan Entry Ambil Gugusan nada Teroilih

label_trebel = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")

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

entry_trebel = tk.Entry(bottom_frame)

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

label_sub_trebel = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")

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

entry_sub_trebel = tk.Entry(bottom_frame)

entry_sub_trebel.grid

(row=8, column=4, padx=5, pady=5)

# Tombol untuk memilih nada

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

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

root.mainloop()


Untuk memperbaiki kode di bawah ini agar dapat memperoleh nilai `Trebel_Biasa` pada progres 1 dan menampilkannya di `entry_trebel`, beberapa perbaikan diperlukan, terutama pada logika di dalam fungsi `pilih_nada()`. Berikut adalah beberapa perubahan yang dilakukan:

1. **Memperbaiki Logika Pengisian `entry_trebel`:** Logika untuk pengisian `entry_trebel` di progres 1 diatur agar sesuai dengan logika pada tabel `Gn_Cyan_Bawah`.

2. **Menghapus Duplikasi Kode:** Menghindari pengulangan kode yang tidak perlu dengan menyederhanakan fungsi `pilih_nada()`.

Berikut adalah kode yang sudah diperbaiki:


```python

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

from tkinter import Tk, Label, Entry, Button, Frame, StringVar

import os


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik")


def isi_trebel_biasa():

    # Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas

    bass_data = ambil_data_bass_1()

    

    # Hanya ambil karakter pertama dari hasil otomatisasi

    otomatis_angka_pertama = bass_data[0] # Mengambil karakter pertama saja


    # Ambil input dari pengguna

    inputan_pengguna = entry_trebel.get() # Mengambil keseluruhan input dari pengguna


    # Gabungkan hasil otomatis dengan input pengguna

    if len(inputan_pengguna) > 1:

        data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:] # Gabungkan otomatis dan input pengguna

    else:

        data_trebel_biasa = otomatis_angka_pertama # Hanya gunakan otomatis jika tidak ada input lain

    

    # Masukkan data_trebel_biasa ke Entry

    entry_trebel.delete(0, tk.END)

    entry_trebel.insert(0, data_trebel_biasa)


    # Update data ke tabel Gn_Cyan_Bawah

    update_data_trebel_biasa_ke_tabel(data_trebel_biasa)


def ambil_data_bass_1():

    # Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas

    # Misalnya:

    return "123" # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas


def update_data_trebel_biasa_ke_tabel(data):

    # Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah

    pass


# Fungsi untuk mengambil data dari database berdasarkan ID

def get_data_from_db(id_selected):

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

    cursor = conn.cursor()

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

    data = cursor.fetchone()

    conn.close()

    return data


# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres

def adjust_trebel_value(trebel_biasa_value, progres):

    if trebel_biasa_value.isdigit():

        # Kurangi nilai berdasarkan progres

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

    else:

        # Jika bukan digit, biarkan nilainya tetap sama

        adjusted_value = trebel_biasa_value

    return adjusted_value


# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan 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()

        nada_selected = nada_var.get().lower()


        # Dapatkan data dari database

        data_gn_cyan_bawah = get_data_from_db(id_selected)

        if not data_gn_cyan_bawah:

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

            return


        # Hapus data sebelumnya di EntryBox       

        entry_trebel.delete(0, tk.END)


        # Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, Level_gn, Progres, Mode, dan Nada

        if progres_selected == 1:

            # Progres 1 untuk Mode Naik dan Turun

            entry_trebel.insert(0, data_gn_cyan_bawah[3])

        else:

            if id_selected == 1 and level_gn_selected in [1, 5, 9]:

                entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))

            elif id_selected == 2 and level_gn_selected in [2, 6, 10]:

                entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))

            elif id_selected == 3 and level_gn_selected in [3, 7, 11]:

                entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))

            elif id_selected == 4 and level_gn_selected in [4, 8, 12]:

                messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")

                return

            else:

                messagebox.showerror("Error", "ID dan Level_Gn tidak sesuai dengan logika")

                return


        messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")

    except ValueError:

        messagebox.showerror("Error", "ID dan progres harus berupa angka")


    finally:

        # Bersihkan atau reset entry dan combobox setelah data dipilih  

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('') # Kosongkan combobox

        mode_combobox.set('') # Kosongkan combobox

        nada_combobox.set('') # Kosongkan combobox


# Fungsi untuk memastikan urutan Level_Gn dan ID

def level_gn():

    try:

        # Kondisi untuk Gn_Cyan_Bawah     

        level_gn_selected = int(entry_level_gn.get())

        if level_gn_selected in [1, 5, 9]:

            id_selected = 1

        elif level_gn_selected in [2, 6, 10]:

            id_selected = 2

        elif level_gn_selected in [3, 7, 11]:

            id_selected = 3

        elif level_gn_selected in [4, 8, 12]:

            id_selected = 4

        else:

            messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")

            return None


        # Memasukkan id_selected ke entry_id

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))


        # Kondisi untuk Sub_Gn_Cyan_Bawah

        if level_gn_selected in range(1, 13):

            id_selected_sub = 1


        return id_selected, id_selected_sub


    except ValueError:

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

        return None, None


# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah

Gn_Cyan_Bawah = True

Sub_Gn_Cyan_Bawah = False


frame_top = tk.Frame(root)

frame_top.pack()


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

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

entry_level_gn = tk.Entry(frame_top)

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


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

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

entry_id = tk.Entry(frame_top)

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


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

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

progres_combobox = ttk.Combobox(frame_top, textvariable=StringVar(), values=[1, 2, 3])

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


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

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

mode_combobox = ttk.Combobox(frame_top, textvariable=StringVar(), values=["nai

k", "turun"])

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


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

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



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