Langsung ke konten utama

CRUD DATA PADA TABEL Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas PADA DATA KOLOM Bass DAN KOLOM Trebel (Part-2)

CRUD DATA PADA TABEL Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas PADA DATA KOLOM Bass DAN KOLOM Trebel (Part-2)


Semua kode saya buat dalam file dengan nama file: CRUD_Gn_Cyan_Atas(gabung).py , kemudian elemen-elemen dan fungsi-fungsi lainnya saya tambahkan untuk melengkapi isi file tersebut, khususnya untuk melakukan CRUD dalam mengambil data Bass dari kolom Bass_1, Bass_2, Bass_3, Bass_4, dan Bass_5, baik dari tabel Gn_Cyan_Atas maupun dari tabel Sub_Gn_Cyan_Atas, lalu menampilkannya pada entry_bass dan entry_sub_bass. Kemudian mengambil data Trebel dari kolom Trebel_1, Trebel_2, Trebel_3, Trebel_4, dan Trebel_5, baik dari tabel Gn_Cyan_Atas maupun dari tabel Sub_Gn_Cyan_Atas, lalu menampilkannya pada entry_trebel dan entry_sub_trebel. Sehingga kode keseluruhan menjadi berikut ini:


import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

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

from tkinter import Tk, Button, Frame, TclError



# Function to initialize database

def init_db():

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

    c = conn.cursor()

    # Create Gn_Cyan_Atas table

    c.execute('''CREATE TABLE IF NOT EXISTS Gn_Cyan_Atas (

                ID INTEGER PRIMARY KEY,

                Level_R TEXT,

                Bass_1 TEXT,

                Bass_2 TEXT,

                Bass_3 TEXT,

                Bass_4 TEXT,

                Bass_5 TEXT,

                Trebel_1 TEXT,

                Trebel_2 TEXT,

                Trebel_3 TEXT,

                Trebel_4 TEXT,

                Trebel_5 TEXT

                )''')

    # Create Sub_Gn_Cyan_Atas table

    c.execute('''CREATE TABLE IF NOT EXISTS Sub_Gn_Cyan_Atas (

                Sub_ID INTEGER PRIMARY KEY,

                Level_D TEXT,

                Bass_1 TEXT,

                Bass_2 TEXT,

                Bass_3 TEXT,

                Bass_4 TEXT,

                Bass_5 TEXT,

                Trebel_1 TEXT,

                Trebel_2 TEXT,

                Trebel_3 TEXT,

                Trebel_4 TEXT,

                Trebel_5 TEXT

                )''')

    conn.commit()

    conn.close()

    

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


# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()

        

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


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


# Function to display default page

def display_gn_cyan_atas_page():

    clear_content_frame()

    tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Atas", 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']

        display_pages(progres)


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

        display_pages(progres)


# 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="Turun", 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="Turun", 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="Turun", 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

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

options_frame.place(x=0, y=50)

#options_frame.pack(side=tk.LEFT, fill=tk.X)


def run_file(filepath):

    try:

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

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

        messagebox.showinfo("Success", f"{filepath} executed successfully")

    except Exception as e:

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

# Penggunaann run_file

def run_gn_a_trebel_file():

    run_file("CRUD_Gn_A_Trebel.py")

def run_gn_biru_file():

    run_file("CRUD_Gn_Biru.py")

def run_gn_cyan_bawah_file(): run_file("CRUD_Gn_Cyan_Bawah(gabung).py")

def run_gn_cyan_atas_file():

    run_file("CRUD_Gn_Cyan_Atas(gabung).py")

def run_gn_a_bass_file():

    run_file("CRUD_Gn_A_Bass.py")


# Fungsi yang akan memodifikasi tampilan tombol dan indikator

def highlight_button(button, indicator):

    clear_highlight() # Bersihkan highlight sebelum menyorot tombol yang baru

    button.config(bg="tomato") # Ubah warna background tombol saat aktif

    indicator.config(bg="yellow") # Ubah warna background indikator saat tombol diklik


def clear_highlight():

    # Fungsi ini mengembalikan semua indikator ke status normal (tidak menyala)

    try:

        for widget in options_frame.winfo_children():

            if isinstance(widget, tk.Button):

                widget.config(bg="green") # Reset warna background tombol

            if isinstance(widget, tk.Label):

                widget.config(bg="#c3c3c3") # Reset warna background indikator

    except TclError as e:

        print("Error while clearing highlight:", e)


# Fungsi yang dijalankan saat tombol diklik

def on_gn_a_bass_click():

    try:

        run_gn_a_bass_file()

        highlight_button(Gn_A_Bass_btn, Gn_A_Bass_indicate)

        Gn_A_Bass_page()

    except TclError as e:

        print("Error in on_gn_a_bass_click:", e)  

def on_gn_biru_click():

    try:

        run_gn_biru_file()

        highlight_button(Gn_Biru_btn, Gn_Biru_indicate)

        Gn_Biru_page()

    except TclError as e:

        print("Error in on_gn_biru_click:", e)   

def on_gn_cyan_atas_click():

    try:

        run_gn_cyan_atas_file()

        highlight_button(Gn_Cyan_Atas_btn, Gn_Cyan_Atas_indicate)

        Gn_Cyan_Atas_page()

    except TclError as e:

        print("Error in on_gn_cyan_atas_click:", e)

def on_gn_cyan_bawah_click():

    try:

        run_gn_cyan_bawah_file()

        highlight_button(Gn_Cyan_Bawah_btn, Gn_Cyan_Bawah_indicate)

        Gn_Cyan_Bawah_page()

    except TclError as e:

        print("Error in on_gn_cyan_bawah_click:", e)        

def on_gn_a_trebel_click():

    try:

        run_gn_a_trebel_file()

        highlight_button(Gn_A_Trebel_btn, Gn_A_Trebel_indicate)

        Gn_A_Trebel_page()

    except TclError as e:

        print("Error in on_gn_a_trebel_click:", 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":

     

# Button and Indicator for Gn_Cyan_Atas

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

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


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

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

        

# Button and Indicator for Gn_Cyan_Bawah

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

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


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

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

                              

# Button and Indicator for Gn_A_Trebel

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

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


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

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


    else: # Mode "naik"


# Button and Indicator for Gn_Cyan_Atas

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

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

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

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


  # Button and Indicator for Gn_A_Bass

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

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


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

        Gn_A_Bass_indicate.place(x=2, y=55, 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        

# Button and Indicator for Gn_A_Bass

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

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


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

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


# Button and Indicator for Gn_Biru

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

    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)


# Button and Indicator for Gn_Cyan_Atas

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

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


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

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


# Button and Indicator for Gn_Cyan_Bawah

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

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


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

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

                 

# Button and Indicator for Gn_A_Trebel

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

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


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

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


options_frame.pack(side=tk.LEFT)

options_frame.pack_propagate(False)

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


# Function to clear content frame

def clear_content_frame():

    for widget in content_frame.winfo_children():

        widget.destroy()


# Bottom Frame

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

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

                                    

def open_data_gn_cyan_atas_file():

    filepath = "DATA_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}")      

                  

#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih 

gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Atas", 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 Cyan_Atas", command=open_data_gn_cyan_atas_file, bg="green", fg="white")

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

#Tampilkan semua Data

tampil_dats_btn = tk.Button(bottom_frame, text="Display All DATA", command=None, bg="green", fg="white")

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


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Buat label_info di frame_top

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

label_info.grid(row=0, column=0, sticky="w", padx=0, pady=(0, 5)) # Letakkan di baris pertama


# Letakkan entry dan combobox di bawah 

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

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

entry_level_gn = tk.Entry(frame_top)

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


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

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

entry_id = tk.Entry(frame_top)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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


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

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

nada_var = tk.StringVar()

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

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

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


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

# abel_progres.grid_forget()

# progres_combobox.grid_forget()

# label_mode.grid_forget()

# mode_combobox.grid_forget() 


# Fungsi untuk memilih nada Bass, Trebel Biasa, dan Trebel_Aneh 

def pilih_nada():

    pass

     

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

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


 # Tombol untuk memilih nada

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

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


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

separator.grid(row=8, column=0, sticky="ew", pady=10)


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

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="Sub Bass Gn Cyan Atas")

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

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="Sub Trebel Gn Cyan Atas")

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)


# Fungsi untuk Naik ke Gn_A_Bass (file CRUD_Gn_A_Bass.py,  atau Turum ke Gn_Cyan_Bawah (file CRUD_Gn_Cyan_Bawah(gabung).py)

active_page = None  # Menyimpan halaman aktif

def next_to_crud_gn_a_bass():

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

        

def next_to_crud_gn_cyan_bawah():

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

    

#Fungsi Tombol Ambil Gugusan nada Teroilih

copy_bass_gn_cyan_atas_btn = tk.Button(bottom_frame, text="Copy Bass", command=None, bg="lightgreen", fg="blue")

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


copy_bass_sub_gn_cyan_atas_btn = tk.Button(bottom_frame, text="Copy Sub_Bass", command=None, bg="lightgreen", fg="blue")

copy_bass_sub_gn_cyan_atas_btn.grid(row=9, column=2, padx=10, pady=5)


copy_trebel_gn_cyan_atas_btn = tk.Button(bottom_frame, text="Copy Trebel", command=None, bg="lightgreen", fg="blue")

copy_trebel_gn_cyan_atas_btn.grid(row=9, column=3, padx=10, pady=5)


copy_trebel_sub_gn_cyan_atas_btn = tk.Button(bottom_frame, text="Copy Sub Trebel", command=None, bg="lightgreen", fg="blue")

copy_trebel_sub_gn_cyan_atas_btn.grid(row=9, column=4, padx=10, pady=5)


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

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


prev_btn = tk.Button(bottom_frame, text="< Prev", command=None, bg="orange", fg="white")

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


naik_btn = tk.Button(bottom_frame, text=" Naik Lagi > ", command=next_to_crud_gn_a_bass, bg="orange", fg="white")

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


turun_btn = tk.Button(bottom_frame, text="Turun Lagi >", command=next_to_crud_gn_cyan_bawah, bg="orange", fg="white")

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


# Initialize the application with the first progress setup

setup_naik_mode(1)


# Initialize the application with the default page

display_gn_cyan_atas_page()

      

# Inisialisasi database 

init_db()    


# Main Function

if __name__ == "__main__":

    init_default_page()

    root.mainloop()         


 Jika tombol "Data Cyan Atas" ditekan maka akan membuka isi file DATA_Gn_Cyan_Atas(gabung).py. Kemudian sekarang kita akan melakukan CRUD pada data Bass pada tabel Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas


Untuk memulai proses CRUD (Create, Read, Update, Delete) pada data Bass dalam tabel `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas`, kita dapat membuat antarmuka dengan tkinter yang memungkinkan pengguna berinteraksi dengan data dalam tabel tersebut. Kita juga perlu memodifikasi file `DATA_Gn_Cyan_Atas(gabung).py` agar dapat menangani operasi CRUD tersebut.

### Langkah-langkah yang akan kita lakukan:

1. **Tombol "Data Cyan Atas":** Ketika tombol ini ditekan, kita akan membuka halaman atau frame baru yang berisi antarmuka CRUD untuk tabel `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas`.

2. **Membuat Antarmuka CRUD:**

   - **Create (C):** Form input untuk memasukkan data baru ke dalam tabel.

   - **Read (R):** Tabel atau daftar untuk melihat data yang ada.

   - **Update (U):** Form yang memungkinkan pengeditan data yang sudah ada.

   - **Delete (D):** Tombol atau opsi untuk menghapus data dari tabel.

3. **Memodifikasi File `DATA_Gn_Cyan_Atas(gabung).py`:** Kita akan menambahkan fungsi CRUD yang diperlukan di dalam file ini, seperti `add_data()`, `view_data()`, `update_data()`, dan `delete_data()`.

### Contoh Kode:

Berikut adalah contoh dasar untuk implementasi tombol dan antarmuka CRUD:


#### 1. **Membuat Tombol "Data Cyan Atas":**

```python

# Misalnya di dalam main.py atau file utama tkinter

from tkinter import *

from DATA_Gn_Cyan_Atas import open_data_cyan_atas

def main_window():

    root = Tk()

    root.title("Data Cyan Atas")

    btn_data_cyan_atas = Button(root, text="Data Cyan Atas", command=open_data_cyan_atas)

    btn_data_cyan_atas.pack(pady=20)

    root.mainloop()

if __name__ == "__main__":

    main_window()

```


#### 2. **File `DATA_Gn_Cyan_Atas(gabung).py`:**

```python

import sqlite3

from tkinter import *

from tkinter import ttk

def open_data_cyan_atas():

    window = Toplevel()

    window.title("CRUD Data Cyan Atas")

    # Connect to the database

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

    cursor = conn.cursor()

    # Function to add data

    def add_data():

        # Implementasi menambahkan data ke tabel Gn_Cyan_Atas atau Sub_Gn_Cyan_Atas

        pass

    # Function to view data

    def view_data():

        # Implementasi menampilkan data dari tabel Gn_Cyan_Atas atau Sub_Gn_Cyan_Atas

        pass

    # Function to update data

    def update_data():

        # Implementasi mengupdate data di tabel Gn_Cyan_Atas atau Sub_Gn_Cyan_Atas

        pass

    # Function to delete data

    def delete_data():

        # Implementasi menghapus data dari tabel Gn_Cyan_Atas atau Sub_Gn_Cyan_Atas

        pass

    # Create the interface

    # Label, Entry, Button, dan Tabel untuk CRUD

    Label(window, text="ID").grid(row=0, column=0, padx=10, pady=10)

    entry_id = Entry(window)

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

    Label(window, text="Bass").grid(row=1, column=0, padx=10, pady=10)

    entry_bass = Entry(window)

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

    Button(window, text="Add Data", command=add_data).grid(row=2, column=0, padx=10, pady=10)

    Button(window, text="View Data", command=view_data).grid(row=2, column=1, padx=10, pady=10)

    Button(window, text="Update Data", command=update_data).grid(row=2, column=2, padx=10, pady=10)

    Button(window, text="Delete Data", command=delete_data).grid(row=2, column=3, padx=10, pady=10)

    window.mainloop()

```

#### 3. **Fungsi CRUD di `DATA_Gn_Cyan_Atas(gabung).py`:**

Dalam file ini, kita akan mendefinisikan fungsi CRUD seperti berikut:

```python

def add_data():

    id_data = entry_id.get()

    bass_data = entry_bass.get()

    # Lakukan insert data ke database

    cursor.execute("INSERT INTO Gn_Cyan_Atas (ID, Bass) VALUES (?, ?)", (id_data, bass_data))

    conn.commit()

def view_data():

    cursor.execute("SELECT * FROM Gn_Cyan_Atas")

    records = cursor.fetchall()

    # Tampilkan records di dalam tabel atau listbox

    for row in records:

        print(row)

def update_data():

    id_data = entry_id.get()

    bass_data = entry_bass.get()

    # Lakukan update data berdasarkan ID

    cursor.execute("UPDATE Gn_Cyan_Atas SET Bass = ? WHERE ID = ?", (bass_data, id_data))

    conn.commit()

def delete_data():

    id_data = entry_id.get()

    # Lakukan delete data berdasarkan ID

    cursor.execute("DELETE FROM Gn_Cyan_Atas WHERE ID = ?", (id_data,))

    conn.commit()

```

### Integrasi:

Setelah menambahkan kode ini, tombol "Data Cyan Atas" akan membuka jendela baru yang memungkinkan pengguna untuk melakukan operasi CRUD pada tabel `Gn_Cyan_Atas` dan `Sub_Gn_Cyan_Atas`. Pastikan semua entri yang diperlukan dalam database telah ditentukan agar operasi CRUD berjalan lancar.

Jika ada spesifikasi lebih lanjut atau detail yang perlu ditambahkan, silakan beritahu!

       

Untuk mengambil data Bass terpilih dari tabel Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas, lalu menampilkan data Bass terpilih tersebut pada entry_bass, dan entry_sub_bas, maka kode saya persingkat dengan membuat elemen dan fungsi yang terkait yang penting pentinh saja dan menambahkan beberapa elemen dan fungsi lainnya untuk menjadikan sebuah file dengan nama filenya: CRUD_Gn_Cyan_Atas_Bass.py yang kode isi filenya adalah berikut ini:


import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

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



# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

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


# Buat frame_top di dalam inner_frame

frame_top = tk.Frame(root)

frame_top.pack(pady=10)  # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya

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


# Letakkan entry dan combobox di bawah 

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

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

entry_level_gn = tk.Entry(frame_top)

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


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

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

entry_id = tk.Entry(frame_top)

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


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

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

progres_var = tk.StringVar()

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

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

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


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

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

mode_var = tk.StringVar()

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

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


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

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

nada_var = tk.StringVar()

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

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

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


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

# abel_progres.grid_forget()

# progres_combobox.grid_forget()

# label_mode.grid_forget()

# mode_combobox.grid_forget() 


# 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_Bawah WHERE ID = ?", (id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data

        

# Fungsi untuk mengambil data Sub_Gn_Cyan_Bawah dari database berdasarkan Sub_ID

def get_data_sub_gn_cyan_bawah_from_db(sub_id_selected):

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

    cursor = conn.cursor()

    cursor.execute("SELECT * FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (sub_id_selected,))

    data = cursor.fetchone()

    conn.close()

    return data

    

# Fungsi untuk menyesuaikan nilai bass berdasarkan progres

def adjust_bass_value(bass_value, progres):

    if bass_value.isdigit():

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

    else:

        adjusted_value = bass_value

    return adjusted_value

    

 # Fungsi untuk menyesuaikan nilai bass berdasarkan progres

def adjust_sub_bass_value(sub_bass_value, progres):

    if sub_bass_value.isdigit():

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

    else:

        adjusted_value = sub_bass_value

    return adjusted_value       


# Fungsi untuk memilih nada Bass, Trebel Biasa, dan bass 

def pilih_nada():

    pass


# Fungsi untuk memastikan urutan Level_Gn dan ID

def level_gn():

    try:  

        level_gn_selected = int(entry_level_gn.get())       

        if level_gn_selected in [1, 5, 9]:

            id_selected = 1

        elif level_gn_selected in [2, 6, 10]:

            id_selected = 2

        elif level_gn_selected in [3, 7, 11]:

            id_selected = 3

        elif level_gn_selected in [4, 8, 12]:

            id_selected = 4

        else:

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

            return None

        

        entry_id.delete(0, 'end')

        entry_id.insert(0, str(id_selected))


        id_selected_sub = 1


        return id_selected, id_selected_sub


    except ValueError:

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

        return None, None  

               

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

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


 # Tombol untuk memilih nada

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

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


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

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="Sub Bass Gn Cyan Atas")

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

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="Sub Trebel Gn Cyan Atas")

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)



root.mainloop()


Tolong lengkapi kode pada bagian fungsi def pilih_nada, dengan menerapkan logika pada Data Bass di Gn_Cyan_Atas, dan Sub_Gn_Cyan_Atas berikut ini:

Berikut ini logika yang diterapkan pada data tabel Gn_Cyan_Atas, dan tabel Sub_Gn_Cyan_Atas:

Logika pada tabel data Gn_Cyan_Atas:

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

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

maka data dari Bass_1 id 1 menjadi data Bass_1 id 1

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

maka data dari Bass_1 id 2 menjadi data Bass_1 id 2

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

maka data dari Bass_1 id 3 menjadi Bass_1 id 3.

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

maka data dari Bass_2 id 1 menjadi data Bass_2 id 1.

5. Kolom Bass_2 id 2 adalah kosong (tidak boleh menginput data di sel ini).

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

maka data dari Bass_2 id 3 menjadi data Bass_2 id 3.

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

maka data dari Bass_3 id 1 menjadi data Bass_3 id 1.

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

maka data dari Bass_3 id 2 menjadi data Bass_3 id 2.

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

maka data dari Bass_3 id 3 menjadi data Bass_3 id 3.

10. Kolom Bass_4 id 1 adalah kosong (tidak boleh menginput data di sel ini).

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

maka data dari Bass_4 id 2 menjadi data Bass_4 id 2.

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

maka data dari Bass_4 id 3 menjadi data Bass_4 id 3.

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

maka data dari Bass_5 id 1 menjadi data Bass_5 id 1.

14,  Jika data dari Bass_5 id 2 maka level_gn = 12, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka data dari Bass_5 id 2 menjadi data Bass_5 id 2.

15. Kolom Bass_5 id 3 adalah kosong (tidak boleh menginput data di sel ini). 


Logika pada tabel data Sub_Gn_Cyan_Bawah:

II. Jika data gugus nada yang terpilih dari kolom Bass pada Sub_Gn_Cyan_Atas:

1.. Jika data dari Bass_1 sub_id 1 maka level_gn = 1, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

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

2.. Jika data dari Bass_2 sub_id 1 maka level_gn = 2, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

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

3.. Jika data dari Bass_3 sub_id 1 maka level_gn = 3, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

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

4.. Jika data dari Bass_4 sub_id 1 maka level_gn = 4, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

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

5. Kolom Bass_5 Sub_id 1 adalah kosong (tidak boleh menginput data di sel ini).

6. Jika data dari Bass_1 sub_id 1 maka level_gn = 5, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 5, data dari Bass_1 sub_id 1 adalah menjadi data Bass_1 sub_id 1 yang setiap karakter angka datanya dikurang 1.

7.. Jika data dari Bass_2 sub_id 1 maka level_gn = 6, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 6,  data dari Bass_2 sub_id 1 adalah menjadi data Bass_2 sub_id 1 yang setiap karakter angka datanya dikurang 1.

8.  Jika data dari Bass_3 sub_id 1 maka level_gn = 7, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 7,  data dari Bass_3 sub_id 1 adalah menjadi data Bass_3 sub_id 1 yang setiap karakter angka datanya dikurang 1. 

9. Jika data dari Bass_4 sub_id 1 maka level_gn = 8, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 8,  data dari Bass_4 sub_id 1 adalah menjadi data Bass_4 sub_id 1 yang setiap karakter angka datanya dikurang 1. 

10. Jika data dari Bass_1 sub_id 1 maka level_gn = 9, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 9,  data dari Bass_1 sub_id 1 adalah menjadi data Bass_1 sub_id 1 yang setiap karakter angka datanya dikurang 2.

11.. Jika data dari Bass_2 sub_id 1 maka level_gn = 10, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 10,  data dari Bass_2 sub_id 1 adalah menjadi data Bass_2 sub_id 1 yang setiap karakter angka datanya dikurang 2.

12.  Jika data dari Bass_3 sub_id 1 maka level_gn = 11, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 11,  data dari Bass_3 sub_id 1 adalah menjadi data Bass_3 sub_id 1 yang setiap karakter angka datanya dikurang 2. 

13. Jika data dari Bass_4 sub_id 1 maka level_gn = 12, dan jika progres 1, 2 atau 3, dan jika mode Naik atau Turun:

maka untuk level_gn 12,  data dari Bass_4 sub_id 1 adalah menjadi data Bass_4 sub_id 1 yang setiap karakter angka datanya dikurang 2. 

Dan pastikan data Bass yang terpilih yang diambil dari tabel Gn_Cyan_Atas akan ditampilkan pada entry_bass, sedangkan data Bass yang terpilih yang diambil dari tabel Sub_Gn_Cyan_Atas akan ditampilkan pada entry_sub_bass


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