Langsung ke konten utama

PENGATURAN ISI KOLOM Trebel_Biasa, dan Trebel_Aneh PADA TABEL Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah

 PENGATURAN ISI KOLOM Trebel_Biasa, dan Trebel_Aneh PADA TABEL Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah pada file DATA_Gn_Cyan_Bawah(gabung).py


Ada kekeliruan, maksud saya.pada file DATA_Gn_Cyan_Bawah(gabung).py (bukan pada file CRUD_Gn_Cyan_Bawah(gabung).py yang kode isi file DATA_Gn_Cyan_Bawah(gabung).py ini butuh di modifikasi kodenya pada bagian tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, di bagian data Trebel_Biasa dan Trebel_Aneh yang isian sel-nya harus diisi secara otomatis, atur data isian sel Trebel_Biasa di id 1 adalah sama dengan isian sel Bass_1 id 3 dari data Gn_Cyan_Atas. Data isian sel Trebel_Biasa di id 2 sama dengan isian sel Bass_1 id 2 data Gn_Cyan_Atas. Data isian sel Trebel_Biasa di id 3 sama dengan isian sel Bass_1 id 1 data Gn_Cyan_Atas. Data isian sel Trebel_Biasa di id 4 adalah kosong (tidak diperbolehkan menginput data di sel tersebut), 


Data Isian sel Trebel_Aneh di id 1 adalah sama dengan isian sel Trebel_Biasa id 1 Gn_Cyan_Bawah, Data Isian sel Trebel_Aneh di id 2 adalah sama dengan isian sel Trebel_Biasa id 2 Gn_Cyan_Bawah yang setiap karakter angkanya dikurangi 1. Data Isian sel Trebel_Aneh di id 3 adalah sama dengan isian sel Trebel_Biasa id 3 Gn_Cyan_Bawah yang setiap karakter angkanya dikurangi 1. Data Isian sel Trebel_Aneh di id 4 adalah sama dengan isian sel Bass_2 id 3 data Gn_Cyan_Atas yang setiap karakter angkanya dikurangi 1. 

Kemudian pada tabel Sub_Gn_Cyan_Bawah, Data isian Trebel_Biasa di sub_id 1 adalah kosong (tidak diperbolehkan menginput data di sel tersebut), Data isian Trebel_Aneh di sub_id 1 sama dengan isian sel Bass_1 sub_id 1 data Sub_Gn_Cyan_Atas yang setiap karakter angkanya dikurangi 1. Kemudian data yang ditampilkan pada kolom Trebel_Biasa, dan kolom Trebel_Aneh yang di tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah adalah hanya karakter angka pertama saja, sebab karakter angka kedua dan seterusnya adalah inputan dari users


Berikut adalah modifikasi kode pada file `DATA_Gn_Cyan_Bawah(gabung).py` yang sesuai dengan spesifikasi yang Anda berikan:


1. **Trebel_Biasa (Gn_Cyan_Bawah):**

   - ID 1: Sama dengan `Bass_1` ID 3 dari `Gn_Cyan_Atas`.

   - ID 2: Sama dengan `Bass_1` ID 2 dari `Gn_Cyan_Atas`.

   - ID 3: Sama dengan `Bass_1` ID 1 dari `Gn_Cyan_Atas`.

   - ID 4: Kosong (tidak diperbolehkan menginput data).


2. **Trebel_Aneh (Gn_Cyan_Bawah):**

   - ID 1: Sama dengan `Trebel_Biasa` ID 1 dari `Gn_Cyan_Bawah`.

   - ID 2: Sama dengan `Trebel_Biasa` ID 2 dari `Gn_Cyan_Bawah`, dengan setiap karakter angka dikurangi 1.

   - ID 3: Sama dengan `Trebel_Biasa` ID 3 dari `Gn_Cyan_Bawah`, dengan setiap karakter angka dikurangi 1.

   - ID 4: Sama dengan `Bass_2` ID 3 dari `Gn_Cyan_Atas`, dengan setiap karakter angka dikurangi 1.


3. **Trebel_Biasa (Sub_Gn_Cyan_Bawah):**

   - Sub_ID 1: Kosong (tidak diperbolehkan menginput data).


4. **Trebel_Aneh (Sub_Gn_Cyan_Bawah):**

   - Sub_ID 1: Sama dengan `Bass_1` Sub_ID 1 dari `Sub_Gn_Cyan_Atas`, dengan setiap karakter angka dikurangi 1.


5. **Hanya Karakter Angka Pertama Ditampilkan:** Karakter angka pertama diambil dari data yang sudah ditentukan, dan karakter angka kedua dan seterusnya adalah inputan dari pengguna.


```python

def isi_trebel_biasa_aneh():

    # Ambil data dari Gn_Cyan_Atas

    bass_1_id3 = ambil_data('Gn_Cyan_Atas', 'Bass_1', 3)

    bass_1_id2 = ambil_data('Gn_Cyan_Atas', 'Bass_1', 2)

    bass_1_id1 = ambil_data('Gn_Cyan_Atas', 'Bass_1', 1)

    bass_2_id3 = ambil_data('Gn_Cyan_Atas', 'Bass_2', 3)


    # Gn_Cyan_Bawah: Trebel_Biasa

    update_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 1, bass_1_id3[0]) # Hanya karakter angka pertama

    update_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 2, bass_1_id2[0])

    update_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 3, bass_1_id1[0])

    update_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 4, '')


    # Gn_Cyan_Bawah: Trebel_Aneh

    trebel_biasa_id1 = ambil_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 1)

    trebel_biasa_id2 = ambil_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 2)

    trebel_biasa_id3 = ambil_data('Gn_Cyan_Bawah', 'Trebel_Biasa', 3)


    trebel_aneh_id2 = kurangi_angka(trebel_biasa_id2[0])

    trebel_aneh_id3 = kurangi_angka(trebel_biasa_id3[0])

    trebel_aneh_id4 = kurangi_angka(bass_2_id3[0])


    update_data('Gn_Cyan_Bawah', 'Trebel_Aneh', 1, trebel_biasa_id1[0])

    update_data('Gn_Cyan_Bawah', 'Trebel_Aneh', 2, trebel_aneh_id2)

    update_data('Gn_Cyan_Bawah', 'Trebel_Aneh', 3, trebel_aneh_id3)

    update_data('Gn_Cyan_Bawah', 'Trebel_Aneh', 4, trebel_aneh_id4)


    # Sub_Gn_Cyan_Bawah: Trebel_Biasa

    update_data('Sub_Gn_Cyan_Bawah', 'Trebel_Biasa', 1, '')


    # Sub_Gn_Cyan_Bawah: Trebel_Aneh

    bass_1_subid1 = ambil_data('Sub_Gn_Cyan_Atas', 'Bass_1', 1)

    trebel_aneh_subid1 = kurangi_angka(bass_1_subid1[0])


    update_data('Sub_Gn_Cyan_Bawah', 'Trebel_Aneh', 1, trebel_aneh_subid1)


def ambil_data(tabel, kolom, id):

    # Logika untuk mengambil data dari tabel tertentu

    return [f"Data_{kolom}_{id}"] # Contoh hasil


def update_data(tabel, kolom, id, nilai):

    # Logika untuk memperbarui data di tabel tertentu

    print(f"Update {tabel} - {kolom} ID {id}: {nilai}")


def kurangi_angka(nilai):

    # Logika untuk mengurangi setiap karakter angka sebesar 1

    return str(int(nilai) - 1)


# Panggil fungsi untuk mengisi data secara otomatis

isi_trebel_biasa_aneh()

```


Penjelasan:

- Fungsi `ambil_data` digunakan untuk mengambil data dari tabel tertentu.

- Fungsi `update_data` digunakan untuk memperbarui data di tabel.

- Fungsi `kurangi_angka` digunakan untuk mengurangi setiap karakter angka sebesar 1.

- Data yang ditampilkan pada kolom `Trebel_Biasa` dan `Trebel_Aneh` hanya menampilkan karakter angka pertama. Karakter angka kedua dan seterusnya akan diinput oleh pengguna.


Jika ada perubahan lebih lanjut yang diperlukan, silakan beri tahu.


Berikut ini kode isi file Logika_Gn_Cyan_Bawah.py yang dapat di impor fungsi fungsinya oleh file CRUD_Gn_Cyan_Bawah(gabung).py. Tolong modifikasi kode dengan menambahkan fungsi urutan Level_Gn pada Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, dengan urutan sebagai berikut:

def Level_Gn():

    if Gn_Cyan_Bawah:

Level_Gn ==

1. Bass id 1,

2. Bass id 2,

3. Bass id 3,      

4. Bass id 4,

5. Bass id 1,

6. Bass id 2,         

7. Bass id 3,

8. Bass id 4,

9. Bass id 1,

10. Bass id 2,    

11. Bass id 3,

12. Bass id 4,                             

   elif Sub_Gn_Cyan_Bawah:

Level_Gn ==

1. Bass sub_id 1,

2. Bass sub_id 1,

3. Bass sub_id 1,

4. Bass sub_id 1,

5. Bass sub_id 1,

6. Bass sub_id 1,     

7. Bass sub_id 1,

8. Bass sub_id 1,

9. Bass sub_id 1,

10. Bass sub_id 1,

11. Bass sub_id 1,

12. Bass sub_id 1,  

Berikut ini adalah modifikasi kode untuk Logika_Gn_Cyan_Bawah.py dengan penambahan fungsi Level_Gn() sesuai dengan urutan yang Anda inginkan:

# Logika_Gn_Cyan_Bawah.py


def Level_Gn():

    level_gn_urut = []


    # Kondisi untuk Gn_Cyan_Bawah

    if Gn_Cyan_Bawah:

        for i in range(1, 13):

            if i % 4 == 1:

                level_gn_urut.append((i, 'Bass ID 1'))

            elif i % 4 == 2:

                level_gn_urut.append((i, 'Bass ID 2'))

            elif i % 4 == 3:

                level_gn_urut.append((i, 'Bass ID 3'))

            else:

                level_gn_urut.append((i, 'Bass ID 4'))


    # Kondisi untuk Sub_Gn_Cyan_Bawah

    elif Sub_Gn_Cyan_Bawah:

        for i in range(1, 13):

            level_gn_urut.append((i, 'Bass Sub_ID 1'))


    return level_gn_urut


# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah

Gn_Cyan_Bawah = True

Sub_Gn_Cyan_Bawah = False


# Contoh pemanggilan fungsi Level_Gn()

urutan_level = Level_Gn()

for level in urutan_level:

    print(f"Level {level[0]}: {level[1]}")


Penjelasan Modifikasi:

1. Untuk Gn_Cyan_Bawah: Jika kondisi Gn_Cyan_Bawah adalah True, maka teks yang digunakan adalah "Bass ID 1", "Bass ID 2", "Bass ID 3", dan "Bass ID 4", sesuai dengan urutan yang Anda minta.

2. Untuk Sub_Gn_Cyan_Bawah: Jika kondisi Sub_Gn_Cyan_Bawah adalah True, maka semua level menggunakan teks "Bass Sub_ID 1", sesuai dengan permintaan Anda.

Kode ini sekarang memenuhi kebutuhan penggunaan "ID" untuk Gn_Cyan_Bawah dan "Sub_ID" untuk Sub_Gn_Cyan_Bawah. Anda dapat melanjutkan dengan menggunakan fungsi ini dalam file CRUD_Gn_Cyan_Bawah(gabung).py sesuai dengan kebutuhan aplikasi Anda.

Penjelasan Kode:

Fungsi Level_Gn(): 

Fungsi ini menghasilkan urutan Level_Gn berdasarkan kondisi yang Anda berikan. Jika Gn_Cyan_Bawah adalah True, maka urutan mengikuti pola 1, 5, 9 dengan Bass ID 1, 2, 6, 10 dengan Bass ID 2, dan seterusnya. Jika Sub_Gn_Cyan_Bawah adalah True, maka semua level akan diisi dengan Bass Sub_ID 1.

Logika Pengulangan: 

Menggunakan pengulangan dengan rentang 1 hingga 12 (menggunakan range(1, 13)) untuk menghasilkan 12 level.Output: level_gn_urut adalah list yang berisi tuple dari nomor level dan ID Bass yang bersesuaian, yang kemudian di-return oleh fungsi.

Contoh Penggunaan: 

Pada bagian akhir kode, ada contoh penggunaan fungsi Level_Gn() yang menunjukkan urutan level yang dihasilkan.Kode ini akan memudahkan dalam mengelola urutan Level_Gn pada tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah sesuai dengan ketentuan yang telah Anda berikan. Anda bisa mengimpor fungsi ini ke dalam file CRUD_Gn_Cyan_Bawah(gabung).py dan memanfaatkannya sesuai kebutuhan.


Mengimpor kode tersebut untuk file CRUD_Gn_Cyan_Bawah(gabung).py, ataukah untuk file Logika_Gn_Cyan_Bawah.py ?


Kode tersebut merupakan bagian dari file `Logika_Gn_Cyan_Bawah.py`. Untuk mengimpor dan menggunakan fungsi `Level_Gn()` di dalam file `CRUD_Gn_Cyan_Bawah(gabung).py`, Anda perlu melakukan langkah berikut:

1. **Pastikan file `Logika_Gn_Cyan_Bawah.py` dan `CRUD_Gn_Cyan_Bawah(gabung).py` berada dalam direktori yang sama.**

2. **Tambahkan kode impor di dalam `CRUD_Gn_Cyan_Bawah(gabung).py`**:

   - Pada bagian atas file `CRUD_Gn_Cyan_Bawah(gabung).py`, impor fungsi `Level_Gn()` dari file `Logika_Gn_Cyan_Bawah.py`.


Berikut contoh cara melakukannya:


```python

# CRUD_Gn_Cyan_Bawah(gabung).py


# Impor fungsi Level_Gn dari Logika_Gn_Cyan_Bawah.py

from Logika_Gn_Cyan_Bawah import Level_Gn


# Penggunaan fungsi Level_Gn di dalam CRUD_Gn_Cyan_Bawah(gabung).py

urutan_level = Level_Gn()

for level in urutan_level:

    print(f"Level {level[0]}: {level[1]}")


# Tambahkan kode lain yang sesuai untuk CRUD_Gn_Cyan_Bawah(gabung).py

```

Dengan cara ini, Anda bisa memanfaatkan fungsi `Level_Gn()` yang ada di dalam `Logika_Gn_Cyan_Bawah.py` di file `CRUD_Gn_Cyan_Bawah(gabung).py`, dan menggunakan hasil urutan `Level_Gn` sesuai kebutuhan aplikasi Anda.


Pada kode isi file CRUD_Gn_Cyan_Bawah(gabung).py, bagaimana kalau untuk mengambil dan menampilkan.data gugus nada terpilih, kita pergunakan tombol toggle_btn1, toggle_btn2, dan toggle_btn3 yang ada pada head_frame, dan entry_id, entry_level_gn, entry_nada, sehingga entry_progres, dan entry_mode tidak digunakan lagi dalam mengambil dan menampilkan.data gugus nada terpilih di entry_bass, entry_sub_bass, entry_trebel, dan entry_sub_trebel pada kode isi file CRUD_Gn_Cyan_Bawah(gabung).py berikut ini:


import tkinter as tk

from tkinter import ttk

import sqlite3

from tkinter import messagebox

from tkinter import filedialog

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

import subprocess

import os

import logging

from Logika_Gn_Cyan_Bawah import get_data_gn_cyan_bawah_from_db, get_data_sub_gn_cyan_bawah_from_db, adjust_trebel_value, pilih_nada, Level_Gn

# Initialize logging

logging.basicConfig(level=logging.INFO)

# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik")    

# Head Frame

head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)

head_frame.place()

# Content Frame

content_frame = tk.Frame(root)

content_frame.pack()

# Koneksi ke database dan inisialisasi tabel jika belum ada

def init_db():

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

    c = conn.cursor()

    c.execute('''

        CREATE TABLE IF NOT EXISTS Gn_Cyan_Bawah (

            ID INTEGER PRIMARY KEY,

            Level_R TEXT,

            Bass INT,            

            Trebel_Biasa INT,

            Trebel_Aneh INT

        )

    ''')

    c.execute('''

        CREATE TABLE IF NOT EXISTS Sub_Gn_Cyan_Bawah(

            Sub_ID INTEGER PRIMARY KEY,

            Level_D TEXT,

            Bass INT,

            Trebel_Biasa INT,

            Trebel_Aneh INT    

        )

    ''')

    conn.commit()

    conn.close()

# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()               

# Penggunaan fungsi Level_Gn di dalam CRUD_Gn_Cyan_Bawah(gabung).py

urutan_level = Level_Gn()

for level in urutan_level:

    print(f"Level {level[0]}: {level[1]}")              

# Function to switch modes and update pages

def switch_mode(progres, mode):

    if mode[progres - 1] == "naik":

        mode[progres - 1] = "turun"

        setup_turun_mode(progres)

    else:

        mode[progres - 1] = "naik"

        setup_naik_mode(progres)        

# Options Frame

options_frame = tk.Frame(root, bg="#c3c3c3") 

# Current mode for each toggle button

current_mode = ['naik', 'naik', 'naik']

toggle_btns = []

indicator_labels = []

pages = [

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],

    ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

]                                                                                 

# Function to toggle menus

def toggle_menu(progres, mode):

    if mode[progres - 1] == 'naik':

        mode[progres - 1] = 'turun'

        toggle_btns[progres - 1].config(text="X _ T")

        pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

        indicator_labels[progres - 1].config(text="Turun")

    else:

        mode[progres - 1] = 'naik'

        toggle_btns[progres - 1].config(text="☰ _ N")

        pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

        indicator_labels[progres - 1].config(text="Naik")

    update_options_frame(progres)

    display_pages(progres) 

# Function to display pages

def display_pages(progres):

    for widget in content_frame.winfo_children():

        widget.destroy()

    display_gn_cyan_bawah_page()

# Function to display default page

def display_gn_cyan_bawah_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()                

# Function to setup "Naik" mode

def setup_naik_mode(progres):

    if progres == 1:

        pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

    elif progres == 2:

        pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']

    elif progres == 3:

        pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']  

# Function to setup "Turun" mode

def setup_turun_mode(progres):

    if progres == 1:

        pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

    elif progres == 2:

        pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']

    elif progres == 3:

        pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']               

# Toggle Button 1

toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))

toggle_btn1.pack(side=tk.LEFT)

toggle_btn1.place(x=5, y=20)

toggle_btns.append(toggle_btn1)

title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))

title_lb1.pack(side=tk.LEFT)

title_lb1.place(x=108, y=11)

indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label1.pack(side=tk.LEFT)

indicator_label1.place(x=127, y=55)

indicator_labels.append(indicator_label1)

# Toggle Button 2

toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))

toggle_btn2.pack(side=tk.LEFT)

toggle_btn2.place(x=232, y=20)

toggle_btns.append(toggle_btn2)

title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))

title_lb2.pack(side=tk.LEFT)

title_lb2.place(x=334, y=5)

indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label2.pack(side=tk.LEFT)

indicator_label2.place(x=368, y=55)

indicator_labels.append(indicator_label2)

# Toggle Button 3

toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))

toggle_btn3.pack(side=tk.LEFT)

toggle_btn3.place(x=460, y=20)

toggle_btns.append(toggle_btn3)

title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))

title_lb3.pack(side=tk.LEFT)

title_lb3.place(x=565, y=5)

indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))

indicator_label3.pack(side=tk.LEFT)

indicator_label3.place(x=599, y=55)

indicator_labels.append(indicator_label3)

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

head_frame.pack_propagate(False)

head_frame.configure(height=120)

options_frame.pack(side=tk.LEFT)

options_frame.pack_propagate(False)

options_frame.configure(width=170, height=300) 

# Bottom Frame

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

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

# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()                 

def open_data_gn_cyan_bawah_file():

    filepath = "DATA_Gn_Cyan_Bawah(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")                      

#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih 

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

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

# Data Buttons

crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")

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

label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")

label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)

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

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

# Frame untuk ID dan progres

frame_top = tk.Frame(root)

frame_top.pack(pady=10)

# CRUD Functions

def clear_entries():

    for row in entry_rows:

        for entry in row:

            entry.delete(0, tk.END)       

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

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

entry_id = tk.Entry(frame_top)

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

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_progres = tk.Label(frame_top, text="Progres:")

label_progres.grid(row=2, 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=2, column=1, padx=5, pady=5)

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

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

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

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

nada_var = tk.StringVar()

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

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

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

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

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

# Bottom Frame

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

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

# Label Gugusan Nada Terpilih Field

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

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

#Label dan Entry Ambil Gugusan nada Teroilih

label_bass = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")

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

entry_bass = tk.Entry(bottom_frame)

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

label_sub_bass = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")

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

entry_sub_bass = tk.Entry(bottom_frame)

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

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)

# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py 

active_page = None # Menyimpan halaman aktif

# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py

def run_gn_a_trebel_file():

    filepath = "CRUD_Gn_A_Trebel.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_biru_file():

    filepath = "CRUD_Gn_Biru.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_bawah_file():

    filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")    

def run_gn_cyan_atas_file():

    filepath = "CRUD_Gn_Cyan_Atas(gabung).py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")       

def run_gn_a_bass_file():

    filepath = "CRUD_Gn_A_Bass.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")                             

# Function to display the options based on the current mode and progress

def update_options_frame(progres):

    # Clear existing buttons

    for widget in options_frame.winfo_children():

        widget.destroy()

    if current_mode[progres - 1] == "turun":

        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

        Gn_Cyan_Bawah_btn.place(x=3, y=0)       

        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

        Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)            

        Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)

        Gn_A_Trebel_btn.place(x=3, y=50)        

        Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)    

    else: # Mode "naik"

        Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

        Gn_Cyan_Bawah_btn.place(x=3, y=0)       

        Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

        Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)    

        Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)

        Gn_Cyan_Atas_btn.place(x=3, y=50)      

        Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)    

        Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)

        Gn_Biru_btn.place(x=3, y=100)       

        Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_Biru_indicate.place(x=2, y=105, width=5, height=45)    

        Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)

        Gn_A_Bass_btn.place(x=3, y=150)       

        Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

        Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)      

# Call update_options_frame for the initial setup

update_options_frame(1)

# Function to display Gn_A_Trebel page

def Gn_A_Trebel_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()      

# Function to display Gn_Biru page

def Gn_Biru_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()

# Function to display Gn_Cyan_Bawah page

def Gn_Cyan_Bawah_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack() 

# Function to display Gn_Cyan_Atas page

def Gn_Cyan_Atas_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()    

# Function to display Gn_Biru page

def Gn_A_Bass_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()

# Initialize the default page

def init_default_page():

    update_options_frame(1) # Default to showing options for Progres-1

    clear_content_frame()

    tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()    

    #Fungsi tombol di options_frame        

    Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)

    Gn_A_Trebel_btn.place(x=3, y=0)  

    Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)         

    Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)

    Gn_Biru_btn.place(x=3, y=50)       

    Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)        

    Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)

    Gn_Cyan_Bawah_btn.place(x=3, y=100)      

    Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")

    Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)    

    Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)

    Gn_Cyan_Atas_btn.place(x=3, y=150)       

    Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)    

    Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bas

s", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)

    Gn_A_Bass_btn.place(x=3, y=200)       

    Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")

    Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)  

# Inisialisasi database 

init_db()    

# Main Function

if __name__ == "__main__":  

    init_default_page()

    root.mainloop()

    

  Untuk memodifikasi kode agar mengambil dan menampilkan data gugus nada terpilih menggunakan tombol `toggle_btn1`, `toggle_btn2`, dan `toggle_btn3`, serta entry field `entry_id`, `entry_level_gn`, dan `entry_nada`, berikut langkah-langkah yang dapat dilakukan:

1. **Menghilangkan Penggunaan `progres` dan `mode`:**

   Hapus label, entry field, dan combobox yang terkait dengan `Progres` dan `Mode` di dalam fungsi CRUD, karena tidak akan digunakan lagi untuk mengambil dan menampilkan data.

2. **Modifikasi Fungsi `toggle_menu`:**

   Sesuaikan fungsi `toggle_menu` agar juga mengambil data dari database berdasarkan `ID`, `Level_Gn`, dan `Nada` yang dipilih ketika tombol toggle ditekan.

3. **Penambahan Logika untuk Mengambil Data:**

   Tambahkan logika untuk mengambil data dari database sesuai dengan ID, Level_Gn, dan Nada, kemudian tampilkan hasilnya pada entry field `entry_bass`, `entry_sub_bass`, `entry_trebel`, dan `entry_sub_trebel`.

Berikut adalah modifikasi dari kode yang telah diberikan:


```python

# Function to toggle menus and display data

def toggle_menu(progres, mode):

    # Menentukan tabel yang akan digunakan berdasarkan toggle button yang ditekan

    table_name = "Gn_Cyan_Bawah" if mode[progres - 1] == 'naik' else "Sub_Gn_Cyan_Bawah"

    # Ambil nilai dari entry_id, entry_level_gn, dan entry_nada

    id_value = entry_id.get()

    level_gn_value = entry_level_gn.get()

    nada_value = nada_var.get()

    # Koneksi ke database dan ambil data sesuai kriteria yang ditentukan

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

    c = conn.cursor()

    # Mengambil data dari tabel yang sesuai dengan ID, Level_Gn, dan Nada

    query = f"SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM {table_name} WHERE ID=? AND Level_R=?"

    c.execute(query, (id_value, level_gn_value))

    result = c.fetchone()

    if result:

        bass, trebel_biasa, trebel_aneh = result

        entry_bass.delete(0, tk.END)

        entry_sub_bass.delete(0, tk.END)

        entry_trebel.delete(0, tk.END)

        entry_sub_trebel.delete(0, tk.END)

        if nada_value == "Bass":

            entry_bass.insert(0, bass)

            entry_sub_bass.insert(0, bass) # Asumsikan untuk entry_sub_bass mengambil nilai bass yang sama

        elif nada_value == "Trebel":

            entry_trebel.insert(0, trebel_biasa)

            entry_sub_trebel.insert(0, trebel_aneh)

    else:

        messagebox.showwarning("Warning", "Data tidak ditemukan")

    conn.close()

    # Perbarui tampilan halaman

    update_options_frame(progres)

    display_pages(progres)

# Hapus komponen yang tidak digunakan lagi

# Hapus label, entry field, dan combobox untuk Progres dan Mode

label_progres.grid_forget()

progres_combobox.grid_forget()

label_mode.grid_forget()

mode_combobox.grid_forget()

# Tambahkan kode yang sudah diubah ke bagian yang relevan di dalam file utama

# Misalnya, update tombol toggle_btn1, toggle_btn2, toggle_btn3

toggle_btn1.config(command=lambda: toggle_menu(1, current_mode))

toggle_btn2.config(command=lambda: toggle_menu(2, current_mode))

toggle_btn3.config(command=lambda: toggle_menu(3, current_mode))

# Jalankan fungsi init_db() untuk memastikan tabel sudah ada

init_db()

# Jalankan aplikasi

root.mainloop()

```

### Penjelasan Modifikasi:

- **toggle_menu**: Fungsi ini sekarang akan mengambil data dari database berdasarkan `ID`, `Level_Gn`, dan `Nada` yang dipilih pada entry field terkait ketika salah satu tombol toggle ditekan.

- **Hapus Label dan Entry Field yang Tidak Digunakan**: Elemen yang terkait dengan `Progres` dan `Mode` tidak diperlukan lagi karena tidak digunakan dalam logika pengambilan data.

- **Pembaruan Logika**: Fungsi ini sekarang bekerja dengan `entry_id`, `entry_level_gn`, dan `entry_nada` untuk menentukan data mana yang harus diambil dan ditampilkan.

Dengan perubahan ini, kode menjadi lebih sederhana dan langsung menggunakan tombol toggle untuk menentukan mode, sementara data diambil langsung dari database sesuai dengan ID, Level_Gn, dan Nada yang dipilih.                                    


 Toggle button ada 3 buah: toggle_btn1 untuk Progres 1 di mode Naik atau Turun, toggle_btn2 untuk Progres 2 di mode Naik atau Turun, dan toggle_btn3 untuk Progres 3 di mode Naik atau Turun, semua toggle button tersebut untuk mengambil dan menampilkan data baik dari tabel Gn_Cyan_Bawah juga dari tabel Sub_Gn_Cyan_Bawah. Jadi ketika salah satu tombol ditekan maka akan mengambil dan menampilkan data baik dari Gn_Cyan_Bawah maupun dari Sub_Gn_Cyan_Bawah berdasarkan ID, Level_Gn, Nada, dan tentunya juga berdasarkan Progres dan Mode. Dan logika yang diterapkan pada data tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah akan saya berikan nanti


Untuk mengimplementasikan tiga toggle button (toggle_btn1, toggle_btn2, toggle_btn3) yang mengatur tiga Progres berbeda dengan mode Naik atau Turun, kita bisa menggunakan logika berikut:


1. **Toggle Button Behavior:**

   - Setiap toggle button (`toggle_btn1`, `toggle_btn2`, `toggle_btn3`) akan berfungsi untuk mengubah mode antara Naik dan Turun.

   - Berdasarkan mode yang dipilih, data akan diambil dari tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`, serta data dari `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas`.


2. **Data Fetching Logic:**

   - Ketika salah satu tombol ditekan, data yang akan diambil bergantung pada:

     - **ID**: Mengacu pada kolom ID yang relevan.

     - **Level_Gn**: Mengatur urutan pengambilan data.

     - **Nada**: Nada yang sesuai dengan Progres dan Mode.

     - **Progres dan Mode**: Menentukan apakah data diambil dalam mode Naik atau Turun, serta Progres yang sedang aktif.


3. **Implementation Plan:**

   - Buat fungsi `toggle_mode` untuk setiap tombol toggle yang mengubah status mode Naik atau Turun.

   - Implementasikan fungsi `fetch_data` yang akan menyesuaikan data yang diambil berdasarkan mode dan Progres yang aktif.

   - Update UI untuk menampilkan data yang diambil.


Berikut adalah contoh penerapan sederhana dari konsep ini dalam kode:


```python

class DataHandler:

    def __init__(self):

        self.mode1 = 'Naik'

        self.mode2 = 'Naik'

        self.mode3 = 'Naik'

    

    def toggle_mode(self, progres):

        if progres == 1:

            self.mode1 = 'Turun' if self.mode1 == 'Naik' else 'Naik'

        elif progres == 2:

            self.mode2 = 'Turun' if self.mode2 == 'Naik' else 'Naik'

        elif progres == 3:

            self.mode3 = 'Turun' if self.mode3 == 'Naik' else 'Naik'

        self.fetch_data(progres)

    

    def fetch_data(self, progres):

        mode = getattr(self, f'mode{progres}')

        # Implementasikan logika pengambilan data berdasarkan `mode` dan `progres`

        if progres == 1:

            data = self.get_data_from_tables(progres, mode)

            self.display_data(data)

        elif progres == 2:

            data = self.get_data_from_tables(progres, mode)

            self.display_data(data)

        elif progres == 3:

            data = self.get_data_from_tables(progres, mode)

            self.display_data(data)

    

    def get_data_from_tables(self, progres, mode):

        # Placeholder untuk logika pengambilan data dari Gn_Cyan_Bawah, Sub_Gn_Cyan_Bawah,

        # Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas berdasarkan `progres` dan `mode`.

        return {}

    

    def display_data(self, data):

        # Placeholder untuk menampilkan data di UI.

        pass


# Inisialisasi DataHandler

data_handler = DataHandler()


# Contoh event binding untuk toggle button

toggle_btn1.config(command=lambda: data_handler.toggle_mode(1))

toggle_btn2.config(command=lambda: data_handler.toggle_mode(2))

toggle_btn3.config(command=lambda: data_handler.toggle_mode(3))

```


Logika detail untuk fungsi `get_data_from_tables` akan bergantung pada aturan spesifik yang nanti Anda berikan terkait bagaimana data diambil dari tabel berdasarkan `ID`, `Level_Gn`, `Nada`, `Progres`, dan `Mode`.


Setelah mendapatkan logika spesifik yang Anda terapkan pada tabel `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas`, kita bisa melanjutkan untuk mengimplementasikan bagian pengambilan dan penampilan data.

Baik, saya sudah mengerti maksud dari penggunaan tiga toggle button tersebut. Jika ada logika tambahan yang perlu diterapkan pada data tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`, silakan berikan detailnya, dan saya akan membantu mengimplementasikannya ke dalam kode.


Baik, 

Berikut ini logika yang cocok diterapkan pada data tabel Gn_Cyan_Bawah, dan tabel Sub_Gn_Cyan_Bawah:




Logika pada Gn_Cyan_Bawah:




I. Jika data gugus nada yang terpilih dari kolom Bass:


1.. Jika id 1 maka level_gn = 1, 5, 9, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:


data dari Bass id 1, maka adalah Bass id 1


2. Jika id 2 maka level_gn = 2, 6, 10, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:


data dari Bass id 2, maka adalah Bass id 2


3. Jika id 3 maka level_gn = 3, 7, 11, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:


data dari Bass id 3, maka adalah Bass id 3.


4. Jika id 4 maka level_gn = 4, 8, 12, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:


data dari Bass id 4, maka adalah Bass id 4.




II. Jika data gugus nada yang terpilih dari kolom Trebel_Biasa:


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


data dari Trebel_Biasa id 1, maka adalah Trebel_Biasa id 1


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


data dari Trebel_Biasa id 2, maka adalah Trebel_Biasa id 2


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


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


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


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


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


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


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


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


data dari Trebel_Biasa id 3, maka adalah 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 id 1 maka level_gn = 1, 5, 9, dan jika progres 3, dan jika mode Naik atau Turun:


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


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


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


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


data dari Trebel_Biasa id 3, maka adalah 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)




III. Jika data gugus nada yang terpilih dari kolom Trebel_Aneh:


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


data dari Trebel_Aneh id 1, maka adalah Trebel_Aneh id 1


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


data dari Trebel_Aneh id 2, maka adalah Trebel_Aneh id 2


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


data dari Trebel_Aneh id 3, maka adalah Trebel_Aneh id 3.


1d. Jika id 4 maka level_gn = 4, 8, 12, dan jika progres 1, dan jika mode Naik atau Turun:


data dari Trebel_Aneh id 4, maka adalah Trebel_Aneh id 4.


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


data dari Trebel_Aneh id 1, maka adalah Trebel_Aneh id 1 yang setiap karakter angka datanya dikurang 1.


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


data dari Trebel_Aneh id 2, maka adalah Trebel_Aneh id 2 yang setiap karakter angka datanya dikurang 1.


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


data dari Trebel_Aneh id 3, maka adalah Trebel_Aneh id 3 yang setiap karakter angka datanya dikurang 1. 


2d. Jika id 4 maka level_gn = 4, 8, 12, dan jika progres 2, dan jika mode Naik atau Turun:


data dari Trebel_Aneh id 4, maka adalah Trebel_Aneh id 4 yang setiap karakter angka datanya dikurang 1. 


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


data dari Trebel_Aneh id 1, maka adalah Trebel_Aneh id 1 yang setiap karakter angka datanya dikurang 2.


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


data dari Trebel_Aneh id 2, maka adalah Trebel_Aneh id 2 yang setiap karakter angka datanya dikurang 2.


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


data dari Trebel_Aneh id 3, maka adalah Trebel_Aneh id 3 yang setiap karakter angka datanya dikurang 2. 


3d. Jika id 4 maka level_gn = 4, 8, 12, dan jika progres 3, dan jika mode Naik atau Turun:


data dari Trebel_Aneh id 4, maka adalah Trebel_Aneh id 4 yang setiap karakter angka datanya dikurang 2. 




Logika pada Gn_Cyan_Bawah terkait dengan logika pada Sub_Gn_Cyan_Bawah.




Logika pada Sub_Gn_Cyan_Bawah:




I. Jika data gugus nada yang terpilih dari kolom Bass:


1.. Jika sub_id 1 maka level_gn = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:


data dari Bass sub_id 1, maka adalah Bass sub_id 1.




II. Data gugus nada pada kolom Trebel_Biasa sub_id 1 adalah kosong (tidak boleh menginput data di sel ini)




III. Jika data gugus nada yang terpilih dari kolom Trebel_Aneh:


1. Jika sub_id 1 maka level_gn = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, dan jika progres 1, dan jika mode Naik atau Turun:


data dari Trebel_Aneh sub_id 1, maka adalah Trebel_Aneh sub_id 1.


2. Jika sub_id 1 maka level_gn = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, dan jika progres 2, dan jika mode Naik atau Turun:


data dari Trebel_Aneh sub_id 1, maka adalah Trebel_Aneh sub_id 1 yang setiap karakter angka datanya dikurang 1.


3. Jika sub_id 1 maka level_gn = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, dan jika progres 3, dan jika mode Naik atau Turun:


data dari Trebel_Aneh sub_id 1, maka adalah Trebel_Aneh sub_id 1 yang setiap karakter angka datanya dikurang 2.

 

Terima kasih atas penjelasan logika yang ingin diterapkan. Berikut adalah langkah yang bisa diambil untuk mengimplementasikan logika ini dalam kode Anda:


### 1. **Fungsi untuk Mengambil Data Berdasarkan Logika yang Ditetapkan:**

   - Buat fungsi untuk setiap bagian logika (`Bass`, `Trebel_Biasa`, `Trebel_Aneh`) yang akan memilih dan mengubah data berdasarkan ID, Level_Gn, Progres, dan Mode.

   - Fungsi ini dapat dikaitkan dengan aksi dari masing-masing `toggle_btn` (1, 2, dan 3).


### 2. **Integrasi dengan Toggle Button:**

   - Setiap kali salah satu toggle button ditekan, fungsi yang sesuai akan dipanggil untuk mengambil data yang tepat dari `Gn_Cyan_Bawah` atau `Sub_Gn_Cyan_Bawah`.

   - Pastikan fungsi tersebut memperhitungkan mode (Naik atau Turun) dan progres (1, 2, atau 3) sesuai dengan logika yang sudah ditetapkan.


### 3. **Validasi Input:**

   - Untuk kolom-kolom yang tidak diperbolehkan diisi, pastikan terdapat validasi untuk mencegah pengisian data di kolom tersebut.


### 4. **Implementasi dalam Kode:**

   - Modifikasi kode Anda pada file `CRUD_Gn_Cyan_Bawah(gabung).py` dan `DATA_Gn_Cyan_Bawah(gabung).py` untuk mengintegrasikan logika ini.

   - Misalnya, tambahkan fungsi `update_trebel_biasa`, `update_trebel_aneh`, dan `update_bass` yang akan dipanggil berdasarkan pilihan dari toggle button.


Jika Anda ingin saya membantu membuat contoh kode implementasinya, berikan saya detail lebih lanjut tentang bagaimana struktur data saat ini disusun dalam kode, khususnya bagaimana data diambil dan dimodifikasi berdasarkan ID dan Level_Gn.

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

Penerapan Graf dan Logika dalam Perancangan Rangkaian Digital

  Penerapan Graf dan Logika dalam Perancangan Rangkaian Digital dengan Studi Kasus Jam Digital Advertisement dokumen-dokumen yang mirip Aljabar Boolean. IF2120 Matematika Diskrit. Oleh: Rinaldi Munir Program Studi Informatika, STEI-ITB. Rinaldi Munir - IF2120 Matematika Diskrit SISTEM DIGITAL; Analisis, Desain dan Implementasi, oleh Eko Didik Widianto Hak Cipta 2014 pada penulis GRAHA ILMU Ruko Jambusari 7A Yogyakarta 55283 PENGGUNAAN TABEL KEBENARAN DALAM MERANCANG DESAIN DIGITAL MODUL 6 PROYEK PERANCANGAN RANGKAIAN DIGITAL 2. STUDI PUSTAKA Aplikasi Aljabar Boolean dalam Komparator Digital Aljabar Boolean. Adri Priadana Aljabar Boolean. Rinaldi Munir/IF2151 Mat. Diskrit 1 Aljabar Boolean. Bahan Kuliah Matematika Diskrit Implementasi Greedy Dalam Menemukan Rangkaian Logika Minimal Menggunakan Karnaugh Map MATERI PELATIHAN VHDL UNTUK SINTESIS yang paling umum adalah dengan menspesifikasikan unsur unsur pembentuknya (Definisi 2.1 Menurut Lipschutz, Seymour & Marc Lars Lipson dala...