Langsung ke konten utama

LOGIKA YANG DITERAPKAN PADA DATA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah

LOGIKA YANG DITERAPKAN PADA DATA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah (Part-1)


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


Logika pada tabel data Gn_Cyan_Bawah:

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

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

maka data dari Bass id 1 menjadi Bass id 1

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

maka data dari Bass id 2 menjadi Bass id 2

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

maka data dari Bass id 3 menjadi Bass id 3.

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

maka data dari Bass id 4 menjadi Bass id 4.

II. 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 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 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 menjadi Trebel_Biasa id 3.

1d. Kolom Trebel_Biasa id 4 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 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 kosong (tidak boleh menginput data di sel ini)

III. Jika data gugus nada terpilih dari kolom Trebel_Aneh pada  Gn_Cyan_Bawah:

1a. Jika data dari Trebel_Aneh id 1, dan jika progres 1, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 1 menjadi Trebel_Aneh id 1.

1b. Jika data dari Trebel_Aneh id 2, dan jika progres 1,, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 2 menjadi Trebel_Aneh id 2.

1c. Jika data dari Trebel_Aneh id 3, dan jika progres 1, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 3 menjadi Trebel_Aneh id 3.

1d. Jika data dari Trebel_Aneh id 4, dan jika progres 1, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 4 menjadi Trebel_Aneh id 4.

2a. Jika data dari Trebel_Aneh id 1, dan jika progres 2, dan jika mode Naik atau Turun,maka data dari Trebel_Aneh id 1 adalah menjadi Trebel_Aneh id 1 yang setiap karakter angka datanya dikurang 1.

2b. Jika data dari Trebel_Aneh id 2, dan jika progres 2,, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 2 adalah menjadi Trebel_Aneh id 2 yang setiap karakter angka datanya dikurang 1.

2c. Jika data dari Trebel_Aneh id 3, dan jika progres 2, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 3 adalah menjadi Trebel_Aneh id 3 yang setiap karakter angka datanya dikurang 1.

2d. Jika data dari Trebel_Aneh id 4, dan jika progres 2, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 4 adalah menjadi Trebel_Aneh id 4 yang setiap karakter angka datanya dikurang 1.

3a. Jika data dari Trebel_Aneh id 1, dan jika progres 3, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 1 adalah menjadi Trebel_Aneh id 1 yang setiap karakter angka datanya dikurang 2.

3b. Jika data dari Trebel_Aneh id 2, dan jika progres 3,, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 2 adalah menjadi Trebel_Aneh id 2 yang setiap karakter angka datanya dikurang 2.

3c. Jika data dari Trebel_Aneh id 3, dan jika progres 3, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 3 adalah menjadi Trebel_Aneh id 3 yang setiap karakter angka datanya dikurang 2.

3d. Jika data dari Trebel_Aneh id 4, dan jika progres 3, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh id 4 adalah menjadi Trebel_Aneh id 4 yang setiap karakter angka datanya dikurang 2.

Logika pada data Trebel_Aneh pada Gn_Cyan_Bawah terkait dengan logika pada data Trebel_Aneh pada Sub_Gn_Cyan_Bawah.

Logika pada tabel data Sub_Gn_Cyan_Bawah:

I. Jika kumpulan data nada yang terpilih dari kolom Bass pada Sub_ Gn_Cyan_Bawah:

1.. Jika data dari Bass 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:

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


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

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

Jika data dari Trebel_Aneh sub_id 1, dan jika progres 1, dan jika mode Naik atau Turun:.maka data dari Trebel_Aneh sub_id 1 adalah menjadi Trebel_Aneh sub_id 1.

Jika data dari Trebel_Aneh sub_id 1, dan jika progres 2, dan jika mode Naik atau Turun: maka data dari Trebel_Aneh sub_id 1 adalah menjadi Trebel_Aneh sub_id 1 yang setiap karakter angka datanya dikurang 1.

Jika data dari Trebel_Aneh sub_id 1, dan jika progres 3, dan jika mode Naik atau Turun:maka data dari Trebel_Aneh sub_id 1 adalah menjadi Trebel_Aneh sub_id 1  yang setiap karakter angka datanya dikurang 2.



Struktur data Gn_Cyan_Atss dan Sub_Gn_Cyan_Atas yang disusun dalam kode, khususnya bagaimana data diambil dan dimodifikasi berdasarkan ID dan Level_Gn.

Pertama tama menginisialisasi database DATAMUSIK.db untuk memastikan apakah tabel Gn_Cyan_Bawah dan tabel Sub_Gn_Cyan_Bawah ada atau tidak di dalam database. 

Data di dalam tabel Gn_Cyan_Bawah dibatasi hanya dalam 4 baris, sedangkan data di dalam tabel Sub_Gn_Cyan_Bawah dibatasi hanya dalam 1 baris saja.

Data di kolom Bass di semua baris (id 1 hingga id 4) pada tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah akan bisa diinput oleh users. 

Sedangkan  data di kolom Trebel_Biasa (ada 4 baris) pada tabel Gn_Cyan_Bawah di id 1 hingga id 3 akan terisi secara otomatis hanya karakter angka pertamanya saja yang didapat dari kolom Bass_1 dari Gn_Cyan_Atas melalui formula (ketentuan) yang diberikan, karakter angka kedua dan seterusnya akan bisa diinput oleh users.  Data di kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini). Data di kolom Trebel_Biasa pada tabel Sub_Gn_Cyan_Bawah di id 1 (hanya 1 baris) adalah kosong (tidak boleh menginput data di sel ini). 

Kemudian  data di kolom Trebel_Aneh pada tabel Gn_Cyan_Bawah di id 1 hingga id 4 (ada 4 baris) akan terisi secara otomatis hanya karakter angka pertamanya saja yang didapat dari kolom Trebel_Biasa dari Gn_Cyan_Bawah melalui formula (ketentuan) yang diberikan, karakter angka kedua dan seterusnya akan bisa diinput oleh users. 

Data di kolom Trebel_Aneh pada tabel Sub_Gn_Cyan_Bawah di id 1 (hanya 1 baris) akan terisi juga secara otomatis hanya karakter angka pertamanya saja yang didapat dari kolom Trebel_Biasa dari Sub_Gn_Cyan_Bawah melalui formula (ketentuan) yang diberikan, karakter angka kedua dan seterusnya akan bisa diinput oleh users. 

Kemudian membuat fungsi CRUD untuk data tabel Gn_Cyan_Bawah, yaitu create_gn_cyan_bawah_record(row), read_gn_cyan_bawah_record(row), update_gn_cyan_bawah_record(row), delete_gn_cyan_bawah_record(row), dan clear_entries_gn_cyan_bawah(row=None). Data tabel Gn_Cyan_Bawah akan ditampilkan melalui fungsi display_records.

Untuk CRUD data tabel Gn_Cyan_Bawah (Entry untuk gn_cyan_bawah) dibuat entries sebanyak 4 baris (1 set) yang masing-masing baris terdiri dari kolom ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh. Kolom Level_R diatur agar keadaan isian sel datanya adalah read only melalui fungsi setup_default_mode(). Dan ditambahkan id_entry untuk operasi CRUD pada ID yang berfungsi melalui fungsi  input_id_entry().

Dengan hal yang sama, juga membuat fungsi CRUD untuk data tabel Sub_Gn_Cyan_Bawah ((Entry untuk sub_gn_cyan_bawah)  yaitu create_sub_gn_cyan_bawah_record(row), read_sub_gn_cyan_bawah_record(row), update_sub_gn_cyan_bawah_record(row), delete_sub_gn_cyan_bawah_record(row), dan clear_entries_sub_gn_cyan_bawah(row=None). Data tabel Sub_Gn_Cyan_Bawah akan ditampilkan melalui fungsi display_sub_records.

Untuk CRUD data tabel Sub_Gn_Cyan_Bawah (Entry untuk sub_gn_cyan_bawah) dibuat entries sebanyak 1 baris (1 set) yang terdiri dari kolom Sub_ID, Level_D, Bass, Trebel_Biasa, Trebel_Aneh. Kolom Level_D diatur agar keadaan isian sel datanya adalah read only melalui fungsi setup_default_mode_sub(). Dan ditambahkan sub_id_entry untuk operasi CRUD pada ID yang berfungsi melalui fungsi input_sub_id_entry().

Sebagai penutup kode, maka akhirnya ditambahkan sebuah tombol pilih_button untuk difungsikan membuka file CRUD_Gn_Cyan_Bawah(gabung).py ketika tombol tersebut ditekan maka menjalankan fungsi open_crud_gn_cyan_bawah_file().

Jadi operasi untuk mengambil dan menampilkan data Gn_Cyan_Bawah, dan data Sub_Gn_Cyan_Bawah ada pada isi file CRUD_Gn'Cyan_Bawah(gabung).py yang terintegrasi (terkait) dengan file Logika_Gn_Cyan_Bawah.py dengan melalui kode perintah "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" yang ditempatkan pada bagian atas kode pada file CRUD_Gn'Cyan_Bawah(gabung).py.

Pada isi file CRUD_Gn'Cyan_Bawah(gabung).py, data dari Gn_Cyan_Atas akan diambil dan ditampilkan pada entries: entry_bass, dan entry_trebel, sedangkan data dari Sub_Gn_Cyan_Atas akan diambil dan ditampilkan pada entries: entry_sub_bass, dan entry_sub_trebel. 

Data yang diambil dan ditampilkan tersebut berdasarkan ID, Level_Gn, Nada, Progres, Mode. Pilihan data berdasarkan ID, Level_Gn, dan Nada adalah dengan input-annya dari users pada entries: entry_id untuk operasi ID (id berkesesuaian dengan level_gn), entry_level-gn untuk Level_Gn (urutan 1 hingga 12), dan entry nada_combobox untuk Nada (pilihan Bass atau Trebel). Sedangkan Pilihan data berdasarkan Progres dan Mode adalah dengan 3 buah toggle button (toggle_btn1, toggle_btn2, toggle_btn3) pada toggle_menu yang di head_frame. Tombol toggle button tersebut bisa ditekan oleh users untuk memilih Progres di mode Naik atau Turun: 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, 

Pengambilan dan menampilkan data yang terpilih yang berdasarkan ID, Level_Gn, Nada, Progres, dan Mode, ini harus sesuai dengan logika yang diterapkan pada data tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, seperti yang telah saya uraikan sebelumnya di atas.


Struktur data pada tabel `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas` yang digunakan di dalam kode mengatur bagaimana data diambil dan dimodifikasi berdasarkan ID dan Level_Gn. Berikut adalah langkah-langkah yang diuraikan secara terperinci:

### 1. Inisialisasi Database `DATAMUSIK.db`

Pertama-tama, kode harus memastikan bahwa database `DATAMUSIK.db` ada dan di dalamnya terdapat tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`. Tabel `Gn_Cyan_Bawah` dibatasi hingga hanya 4 baris data, dan `Sub_Gn_Cyan_Bawah` dibatasi hingga 1 baris data.

### 2. Struktur Tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`

- **Tabel `Gn_Cyan_Bawah`:**

  - Memiliki 4 baris (ID 1 hingga 4) dengan kolom: `ID`, `Level_R`, `Bass`, `Trebel_Biasa`, `Trebel_Aneh`.

  - **Kolom `Bass`**: Data di kolom ini bisa diinput oleh pengguna.

  - **Kolom `Trebel_Biasa`**: Data pada ID 1 hingga 3 diisi secara otomatis dengan karakter angka pertama dari kolom `Bass_1` di `Gn_Cyan_Atas` sesuai formula yang diberikan. Karakter angka kedua dan seterusnya diinput oleh pengguna. Data di ID 4 kosong dan tidak bisa diinput oleh pengguna.

  - **Kolom `Trebel_Aneh`**: Data diisi otomatis berdasarkan kolom `Trebel_Biasa` pada `Gn_Cyan_Bawah` dengan formula yang diberikan, dan karakter angka kedua dan seterusnya diinput oleh pengguna.

- **Tabel `Sub_Gn_Cyan_Bawah`:**

  - Memiliki 1 baris (Sub_ID 1) dengan kolom: `Sub_ID`, `Level_D`, `Bass`, `Trebel_Biasa`, `Trebel_Aneh`.

  - **Kolom `Bass`**: Data di kolom ini bisa diinput oleh pengguna.

  - **Kolom `Trebel_Biasa`**: Data di Sub_ID 1 kosong dan tidak bisa diinput oleh pengguna.

  - **Kolom `Trebel_Aneh`**: Diisi otomatis dengan karakter angka pertama dari `Trebel_Biasa` pada `Sub_Gn_Cyan_Bawah` sesuai formula. Karakter angka kedua dan seterusnya diinput oleh pengguna.

### 3. Fungsi CRUD untuk Tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`

- **CRUD pada `Gn_Cyan_Bawah`:** 

  - Fungsi CRUD: `create_gn_cyan_bawah_record(row)`, `read_gn_cyan_bawah_record(row)`, `update_gn_cyan_bawah_record(row)`, `delete_gn_cyan_bawah_record(row)`, dan `clear_entries_gn_cyan_bawah(row=None)`.

  - Entries (kolom): `ID`, `Level_R`, `Bass`, `Trebel_Biasa`, `Trebel_Aneh`. Kolom `Level_R` diatur sebagai read-only.

  - Penambahan `id_entry` untuk operasi CRUD pada ID melalui fungsi `input_id_entry()`.

- **CRUD pada `Sub_Gn_Cyan_Bawah`:**

  - Fungsi CRUD: `create_sub_gn_cyan_bawah_record(row)`, `read_sub_gn_cyan_bawah_record(row)`, `update_sub_gn_cyan_bawah_record(row)`, `delete_sub_gn_cyan_bawah_record(row)`, dan `clear_entries_sub_gn_cyan_bawah(row=None)`.

  - Entries (kolom): `Sub_ID`, `Level_D`, `Bass`, `Trebel_Biasa`, `Trebel_Aneh`. Kolom `Level_D` diatur sebagai read-only.

  - Penambahan `sub_id_entry` untuk operasi CRUD pada Sub_ID melalui fungsi `input_sub_id_entry()`.

### 4. Pengambilan dan Penampilan Data pada CRUD

Pengambilan data dari `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas` dilakukan melalui file `CRUD_Gn_Cyan_Bawah(gabung).py` yang berhubungan dengan file `Logika_Gn_Cyan_Bawah.py`. Data yang diambil berdasarkan `ID`, `Level_Gn`, `Nada`, `Progres`, dan `Mode`, yang dipilih oleh pengguna melalui entries `entry_id`, `entry_level-gn`, `entry_nada_combobox`, dan tiga toggle button (`toggle_btn1`, `toggle_btn2`, `toggle_btn3`) pada `toggle_menu`.

### 5. Logika Pengambilan Data

Logika pengambilan data diimplementasikan untuk tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`, yang mempengaruhi bagaimana data diambil dan ditampilkan sesuai dengan formula berdasarkan `Level_Gn`, `Progres`, dan `Mode`. 

Sebagai contoh:

- Jika `Bass id 1` pada `Gn_Cyan_Bawah` dan `level_gn = 1, 5, 9`, serta `progres 1`, maka data tersebut akan digunakan kembali sebagai `Bass id 1`.

- Jika `Trebel_Biasa id 1` dan `progres 2`, maka data diubah dengan mengurangi setiap karakter angka datanya sebesar 1.

### 6. Tombol Aksi untuk Membuka File Lain

Sebagai penutup, sebuah tombol `pilih_button` ditambahkan yang difungsikan untuk membuka file `CRUD_Gn_Cyan_Bawah(gabung).py` melalui fungsi `open_crud_gn_cyan_bawah_file()` ketika tombol ditekan.

Dengan struktur dan logika ini, pengguna dapat mengelola dan memodifikasi data pada tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` secara terstruktur dan sesuai dengan aturan yang telah ditentukan.


 Berikut kode isi file CRUD_Gn_Cyan_Bawah(gabung).py:


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)


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


# 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_Bass", 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()

    

 Terima kasih telah membagikan kode lengkap dari file `CRUD_Gn_Cyan_Bawah(gabung).py`. Berikut beberapa poin penting dan perbaikan atau tambahan yang bisa dilakukan berdasarkan kode yang telah diberikan:

1. **Penempatan dan Pengelompokan Fungsi**:

   - Fungsi seperti `init_db()` bisa dipanggil langsung saat aplikasi dijalankan untuk memastikan database selalu terinisialisasi ketika program dimulai.

   - Pengelompokan fungsi yang terkait bisa dilakukan untuk menjaga struktur kode yang lebih rapi, seperti menempatkan semua fungsi CRUD bersama-sama.

2. **Optimisasi Proses CRUD**:

   - Dalam kode yang Anda miliki, sebaiknya Anda mengelompokkan proses `insert`, `update`, dan `delete` menjadi fungsi tersendiri untuk menangani manipulasi data. Ini akan menjaga kerapihan kode dan kemudahan dalam pemeliharaan.

3. **Penggunaan `exec`**:

   - Penggunaan `exec` pada `open_data_gn_cyan_bawah_file` untuk mengeksekusi kode dari file `DATA_Gn_Cyan_Bawah(gabung).py` sebenarnya cukup berisiko jika tidak dipastikan bahwa kode tersebut aman. Sebagai alternatif, Anda bisa memanggil fungsi secara eksplisit dari file yang diimpor, sehingga lebih mudah untuk di-debug dan aman.

4. **Pengelolaan Frame**:

   - Pastikan bahwa semua frame diatur dengan baik untuk menjaga tampilan yang dinamis dan responsif terhadap perubahan ukuran jendela.

5. **Penggunaan Mode Naik dan Turun**:

   - Pastikan logika `toggle_menu` untuk pengaturan mode Naik dan Turun sudah berfungsi dengan baik sesuai dengan kebutuhan Anda, dan selalu melakukan update terhadap `options_frame` dan konten yang ditampilkan di `content_frame`.

6. **Pengelolaan Data**:

   - Saat Anda ingin mengelola data dari tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`, pastikan logika pengambilan data seperti `get_data_gn_cyan_bawah_from_db` dan `adjust_trebel_value` bekerja sesuai dengan persyaratan Anda. Pengambilan data dari database bisa dioptimalkan dengan query yang efisien.

7. **Pengecekan Error dan Debugging**:

   - Gunakan logging dan error handling yang cukup untuk mengetahui bagian mana yang gagal saat eksekusi dan juga untuk membantu dalam proses debugging.

8. **Pengelolaan Event**:

   - Anda mungkin ingin memisahkan pengelolaan event seperti tombol toggle atau menu pada fungsi terpisah yang bisa lebih mudah di-maintain dan di-troubleshoot.

Jika ada bagian spesifik yang ingin Anda tingkatkan atau jika ada bagian dari kode yang perlu bantuan lebih lanjut, silakan informasikan!                                     


Berikut ini kode isi file Logika_Gn_Cyan_Bawah.py :

import tkinter as tk

from tkinter import ttk

import sqlite3



# 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]}")

                

# Fungsi untuk mengambil data Gn_Cyan_Bawah.dari database berdasarkan ID

def get_data_gn_cyan_bawah_from_db(id_selected):

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

    cursor = conn.cursor()

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

    data = cursor.fetchone()   

    conn.close()

    return data


# Fungsi untuk mengambil data Sub_Gn_Cyan_Bawah.dari database berdasarkan ID

def get_data_sub_gn_cyan_bawah_from_db(id_selected):

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

    cursor = conn.cursor()

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

    data = cursor.fetchone()   

    conn.close()

    return data


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


# Fungsi untuk memilih nada Bass dan Trebel berdasarkan ID, progres, dan mode

def pilih_nada():

    try:

        id_selected = int(entry_id.get())

        progres = int(progres_var.get())

        mode = mode_var.get().lower()


        # Dapatkan data Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah dari database

        data_gn_cyan_bawah = get_data_gn_cyan_bawah_from_db(id_selected)

        data_sub_gn_cyan_bawah = get_data_sub_gn_cyan_bawah_from_db(id_selected)


        # Hapus data Gn_Cyan_Bawah sebelumnya di EntryBox

        entry_bass.delete(0, tk.END)       

        entry_trebel_biasa.delete(0, tk.END)

        entry_trebel_aneh.delete(0, tk.END)

        

        # Logika pengisian data Bass ke EntryBox berdasarkan data Gn_Cyan_Bawah dari database

        if id_selected == 1:

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])           

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

               pass

               

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

               pass

                

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

                entry_bass.iinsert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass               


        elif id_selected == 2:

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass

                

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])


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

                pass

                

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

                pass              


        elif id_selected == 3:

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass

                

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

 

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

                pass

                

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

                pass

                

        if id_selected == 4:

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

                entry_bass.insert(0, data_gn_cyan_bawah[2])           

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

               pass

               

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

               pass

                

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

                entry_bass.iinsert(0, data_gn_cyan_bawah[2])

                entry_sub_bass.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass                               

                               

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

       

        # Logika pengisian data Trebel ke EntryBox berdasarkan data Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas dari database

        if id_selected == 1:

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

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

               

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

                pass

                

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

             pass


        elif id_selected == 2:

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass

                

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])


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

                pass

                

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

                pass              


        elif id_selected == 3:

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass

                

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

 

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

                pass

                

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

                pass


        if id_selected == 4:

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

               pass

               

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

               pass

                

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

                entry_trebel.insert(0, data_gn_cyan_bawah[2])

                entry_sub_trebel.insert(0, data_sub_gn_cyan_bawah[2])

                

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

                pass

                

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

                pass               

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


Kode yang Anda berikan untuk file `Logika_Gn_Cyan_Bawah.py` tampaknya sudah cukup lengkap, tetapi ada beberapa hal yang perlu diperhatikan untuk memastikan bahwa fungsinya berjalan sesuai dengan yang diinginkan:

1. **Penggunaan Variabel Global:**

   - `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` dideklarasikan secara global, dan nilai boolean yang diberikan menentukan kondisi untuk setiap tabel. Ini baik jika hanya satu tabel yang akan diaktifkan dalam satu waktu. Namun, pastikan bahwa Anda hanya menggunakan salah satu dari keduanya (tidak keduanya bernilai `True` bersamaan).

2. **Fungsi `Level_Gn`:**

   - Fungsi ini mengembalikan daftar urutan level berdasarkan nilai dari `Gn_Cyan_Bawah` atau `Sub_Gn_Cyan_Bawah`. Anda sudah mengatur logikanya dengan baik. Namun, pastikan bahwa Anda memberikan nilai boolean pada `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` sebelum memanggil fungsi ini agar urutan level dihasilkan sesuai dengan kondisi tabel yang aktif.

3. **Fungsi `adjust_trebel_value`:**

   - Fungsi ini berguna untuk menyesuaikan nilai Trebel berdasarkan progres. Fungsi ini sudah benar dalam mengurangi karakter angka di dalam string.

4. **Fungsi `pilih_nada`:**

   - Fungsi ini adalah bagian utama yang menangani pengambilan dan pengisian data pada `EntryBox` berdasarkan ID, progres, dan mode.

   - Terdapat beberapa pengulangan logika yang mungkin bisa disederhanakan dengan membuat fungsi terpisah untuk mengisi `EntryBox` dengan data `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`.

   - Pastikan semua bagian dalam logika pengecekan progres dan mode ditangani dengan baik agar tidak ada kasus yang terlewat.

   - Dalam kondisi saat ini, terdapat beberapa `pass` statement yang menunjukkan bahwa belum ada implementasi untuk beberapa kombinasi progres dan mode. Pastikan untuk melengkapi bagian tersebut jika diperlukan.

5. **Penggunaan `messagebox`:**

   - Anda sudah menggunakan `messagebox` untuk memberi tahu pengguna jika ada kesalahan input atau jika proses berhasil. Ini akan membantu pengguna memahami apa yang terjadi saat menjalankan aplikasi.

6. **Kesalahan Pengetikan:**

   - Terdapat kesalahan pengetikan kecil pada beberapa bagian seperti `entry_bass.iinsert` yang seharusnya `entry_bass.insert`. Periksa kembali kode untuk memastikan tidak ada kesalahan pengetikan lainnya.

7. **Pemisahan Logika Berdasarkan ID:**

   - Anda telah memisahkan logika berdasarkan ID dengan baik. Namun, jika banyak ID yang memiliki pola yang sama, Anda mungkin dapat mempertimbangkan untuk membuat satu fungsi yang bisa digunakan kembali untuk ID yang serupa, untuk mengurangi pengulangan kode.

Secara keseluruhan, kode ini sudah hampir siap digunakan. Anda mungkin ingin melakukan uji coba lebih lanjut untuk memastikan bahwa semua kondisi tertangani dengan baik, terutama pada bagian yang masih kosong (`pass` statement) atau membutuhkan logika tambahan.


Tolong modifikasi kode isi file Logika_Gn_Cyan_Bawah.py tersebut agar applikasi dapat berjalan dengan baik, terutama modifikasi kode dibagian logika dalam pengaturan pemilihan data gugusan nada terpilih yaitu Logika pengambilan dan pengisian data Bass maupun data Trebel ke EntryBox (entry_bass, entry_trebel, entry_sub_bass, entry_sub_trebel) berdasarkan ID, Progres, Mode, Level_Gn, dan Nada oleh users, data yang diambil dari tabel Gn_Cyan_Bawah dan tabel Sub_Gn_Cyan_Bawah dari database DATAMUSIK.db

 


Bersambung ke:

LOGIKA YANG DITERAPKAN PADA DATA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah (Part-2)







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