Langsung ke konten utama

LANGKAH LANGKAH MELAKUKAN CRUD DATA DI TABEL PADA DATABASE (Part-2)

LANGKAH-LANGKAH MEMBUAT DAN MENAMPILKAN DATA DARI TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cysn_Bawah PADA DATABASE DATAMUSIK.db (Part-2)


Pada kode saya tambahkan beberapa label, entry, juga id_entry di dalam fungsi input_id_entry , dan tombol inpit_id_button, serta tombol CRUD dan Clear untuk Gn_Cyan_Bawah, dan juga frame_record untuk menampilkan data dari tabel Gn_Cyan_Bawah, sehingga kode menjadi berikut ini:

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")    

main_frame = tk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=1)

canvas = tk.Canvas(main_frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar_y = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)

canvas.configure(yscrollcommand=scrollbar_y.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Frame utama untuk konten
content_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=content_frame, anchor="nw")

data_frame = tk.Frame(content_frame)
data_frame.grid(row=0, column=0, padx=10, pady=10)

record_frame = tk.Frame(content_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

sub_entry_frame = tk.Frame(content_frame)
sub_entry_frame.grid(row=2, column=0, padx=10, pady=10)

sub_record_frame = tk.Frame(content_frame)
sub_record_frame.grid(row=3, column=0, padx=10, pady=10)

# 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()
    
# Fungsi untuk membersihkan entry
def clear_entries(entries):
    for entry in entries:
        entry.delete(0, tk.END)    

# Fungsi CRUD untuk Gn_Cyan_Bawah
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM gn_cyan_bawah WHERE ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE gn_cyan_bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM gn_cyan_bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in sub_entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_sub_default_mode()    
    input_id_entry()                                                                                    
def setup_default_mode():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')                       
def display_records():
    for widget in record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)        
# lLabel untuk gn_cyan_bawah
tk.Label(data_frame, fg="tomato", text="CRUD Data \n gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk gn_cyan_bawah
labels = ["ID", "Level_R", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(labels):
    tk.Label(data_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(labels)):
        if j == 0: # ID column
            entry = tk.Entry(data_frame, width=4)
        elif j == 1: # Level_R column
            entry = tk.Entry(data_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(data_frame, width=20)
        entry.grid(row=i+4, column=j, padx=5, pady=5)
        row.append(entry)
    entry_rows.append(row)
    
# EntryBox untuk ID
id_label = tk.Label(data_frame, text="ID for Operation")
id_label.grid(row=8, column=0, padx=5, pady=5)
id_entry = tk.Entry(data_frame, width=6)
id_entry.grid(row=9, column=0, padx=5, pady=5)

def input_id_entry():
    # Dapatkan teks dari entry
    input_id = id_entry.get()
    # Bersihkan entry setelah input
    id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "ID berhasil diinput dan dibersihkan")

# Membuat tombol input_id
input_id_button = tk.Button(data_frame, text="Clear ID", bg="red", fg="white", command=input_id_entry)
input_id_button.place(x=175, y=395)

# Membuat tombol CRUD
create_button = tk.Button(data_frame, text="Create", bg="cyan", fg="black", command=lambda: create_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
create_button.grid(row=9, column=2, padx=5, pady=5)

read_button = tk.Button(data_frame, text="Read", bg="cyan", fg="black", command=lambda: read_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
read_button.grid(row=9, column=3, padx=5, pady=5)

update_button = tk.Button(data_frame, text="Update", bg="cyan", fg="black", command=lambda: update_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
update_button.grid(row=9, column=4, padx=5, pady=5)

delete_button = tk.Button(data_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
delete_button.grid(row=9, column=5, padx=5, pady=5)

clear_button = tk.Button(data_frame, text="Clear", bg="lightcyan", fg="black", command=lambda: clear_entries_gn_cyan_bawah(entry_rows[int(id_entry.get()) - 1]))
clear_button.grid(row=9, column=6, padx=5, pady=5)

# Frame untuk menampilkan record gn_cyan_bawah
record_frame = tk.Frame(data_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

separator = tk.Frame(data_frame, height=40, bg="grey")
separator.grid(row=11, column=0, padx=5, pady=5)           


    
# Fungsi CRUD untuk sub_gn_cyan_bawah
def create_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Sub_Gn_Cyan_Bawah (Sub_ID, Level_D, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_records()

def read_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM sub_gn_cyan_bawah WHERE Sub_ID=?", (id_value,))
    record = c.fetchone()
    conn.close()
    if record:
        for i, entry in enumerate(row):
            entry.delete(0, tk.END)
            entry.insert(0, record[i])

def update_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("UPDATE sub_gn_cyan_bawah SET Level_D = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE Sub_ID = ?",
              data)
    conn.commit()
    conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def delete_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("DELETE FROM sub_gn_cyan_bawah WHERE Sub_ID=?", (id_value,))
    conn.commit()
    conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def clear_entries_sub_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in sub_entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_sub_default_mode()    
    
def setup_sub_default_mode():
    levels = ["Satu"]
    for row_index, row in enumerate(sub_entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')

def display_sub_records():
    for widget in sub_record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(sub_record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)    
    
# Inisialisasi database 
init_db()


root.mainloop()


Namun disayangkan karena data dari tabel Gn_Cyan_Bawah belum juga tampil kelihatan


Untuk menampilkan data dari tabel `Gn_Cyan_Bawah` dengan benar, kita perlu memastikan bahwa fungsi `display_records` dipanggil pada waktu yang tepat dan bahwa kerangka kerja (frame) diatur dengan benar. Berikut adalah kode yang telah dioptimalkan dan disusun ulang agar data dapat tampil dengan baik:

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")    

main_frame = tk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=1)

canvas = tk.Canvas(main_frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar_y = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)

canvas.configure(yscrollcommand=scrollbar_y.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Frame utama untuk konten
content_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=content_frame, anchor="nw")

data_frame = tk.Frame(content_frame)
data_frame.grid(row=0, column=0, padx=10, pady=10)

record_frame = tk.Frame(content_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

sub_entry_frame = tk.Frame(content_frame)
sub_entry_frame.grid(row=2, column=0, padx=10, pady=10)

sub_record_frame = tk.Frame(content_frame)
sub_record_frame.grid(row=3, column=0, padx=10, pady=10)

# 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()
    
# Fungsi untuk membersihkan entry
def clear_entries(entries):
    for entry in entries:
        entry.delete(0, tk.END)    

# Fungsi CRUD untuk Gn_Cyan_Bawah
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Gn_Cyan_Bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode()                                                                                     

def setup_default_mode():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')                       

def display_records():
    for widget in record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)        
# lLabel untuk gn_cyan_bawah
tk.Label(data_frame, fg="tomato", text="CRUD Data \n gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk gn_cyan_bawah
labels = ["ID", "Level_R", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(labels):
    tk.Label(data_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(labels)):
        if j == 0: # ID column
            entry = tk.Entry(data_frame, width=4)
        elif j == 1: # Level_R column
            entry = tk.Entry(data_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(data_frame, width=20)
        entry.grid(row=i+4, column=j, padx=5, pady=5)
        row.append(entry)
    entry_rows.append(row)
    
# EntryBox untuk ID
id_label = tk.Label(data_frame, text="ID for Operation")
id_label.grid(row=8, column=0, padx=5, pady=5)
id_entry = tk.Entry(data_frame, width=6)
id_entry.grid(row=9, column=0, padx=5, pady=5)

def input_id_entry():
    # Dapatkan teks dari entry
    input_id = id_entry.get()
    # Bersihkan entry setelah input
    id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "ID berhasil diinput dan dibersihkan")

# Membuat tombol input_id
input_id_button = tk.Button(data_frame, text="Clear ID", bg="red", fg="white", command=input_id_entry)
input_id_button.place(x=175, y=395)

# Membuat tombol CRUD
create_button = tk.Button(data_frame, text="Create", bg="cyan", fg="black", command=lambda: create_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
create_button.grid(row=9, column=2, padx=5, pady=5)

read_button = tk.Button(data_frame, text="Read", bg="cyan", fg="black", command=lambda: read_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
read_button.grid(row=9, column=3, padx=5, pady=5)

update_button = tk.Button(data_frame, text="Update", bg="cyan", fg="black", command=lambda: update_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
update_button.grid(row=9, column=4, padx=5, pady=5)

delete_button = tk.Button(data_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
delete_button.grid(row=9, column=5, padx=5, pady=5)

clear_button = tk.Button(data_frame, text="Clear", bg="cyan", fg="black", command=clear_entries_gn_cyan_bawah)
clear_button.grid(row=9, column=6, padx=5, pady=5)

# Sub_Gn_Cyan_Bawah CRUD Operations
def create_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Sub_Gn_Cyan_Bawah (Sub_ID, Level_D, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def read_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for Sub_ID {row[0].get()}")
        display_sub_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Sub_Gn_Cyan_Bawah SET Level_D = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE Sub_ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def delete_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def clear_entries_sub_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in sub_entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode_sub()

def setup_default_mode_sub():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(sub_entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')

def display_sub_records():
    for widget in sub_record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(sub_record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)

# Label untuk sub_gn_cyan_bawah
tk.Label(sub_entry_frame, fg="tomato", text="CRUD Data \n sub_gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk sub_gn_cyan_bawah
sub_labels = ["Sub_ID", "Level_D", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(sub_labels):
    tk.Label(sub_entry_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

sub_entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(sub_labels)):
        if j == 0: # Sub_ID column
            entry = tk.Entry(sub_entry_frame, width=4)
        elif j == 1: # Level_D column
            entry = tk.Entry(sub_entry_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(sub_entry_frame, width=20)
        entry.grid(row=i+2, column=j, padx=5, pady=5)
        row.append(entry)
    sub_entry_rows.append(row)

# EntryBox untuk Sub_ID
sub_id_label = tk.Label(sub_entry_frame, text="Sub_ID for Operation")
sub_id_label.grid(row=6, column=0, padx=5, pady=5)
sub_id_entry = tk.Entry(sub_entry_frame, width=6)
sub_id_entry.grid(row=7, column=0, padx=5, pady=5)

def input_sub_id_entry():
    # Dapatkan teks dari entry
    input_id = sub_id_entry.get()
    # Bersihkan entry setelah input
    sub_id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "Sub_ID berhasil diinput dan dibersihkan")

# Membuat tombol input_sub_id
input_sub_id_button = tk.Button(sub_entry_frame, text="Clear Sub_ID", bg="red", fg="white", command=input_sub_id_entry)
input_sub_id_button.place(x=175, y=345)

# Membuat tombol CRUD untuk sub_gn_cyan_bawah
create_sub_button = tk.Button(sub_entry_frame, text="Create", bg="cyan", fg="black", command=lambda: create_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
create_sub_button.grid(row=7, column=2, padx=5, pady=5)

read_sub_button = tk.Button(sub_entry_frame, text="Read", bg="cyan", fg="black", command=lambda: read_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
read_sub_button.grid(row=7, column=3, padx=5, pady=5)

update_sub_button = tk.Button(sub_entry_frame, text="Update", bg="cyan", fg="black", command=lambda: update_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
update_sub_button.grid(row=7, column=4, padx=5, pady=5)

delete_sub_button = tk.Button(sub_entry_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
delete_sub_button.grid(row=7, column=5, padx=5, pady=5)

clear_sub_button = tk.Button(sub_entry_frame, text="Clear", bg="cyan", fg="black", command=clear_entries_sub_gn_cyan_bawah)
clear_sub_button.grid(row=7, column=6, padx=5, pady=5)

# Inisialisasi database dan tampilkan data awal
init_db()
display_records()
display_sub_records()

root.mainloop()


Kode di atas melengkapi semua fungsi CRUD untuk tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah, serta menampilkan data yang ada di tabel tersebut dalam GUI. Kode ini juga menginisialisasi database dan menampilkan data saat aplikasi dijalankan.


Dengan hal yang sama, pada kode saya tambahkan beberapa sub_label, sub_entry, juga sub_id_entry di dalam fungsi input_sub_id_entry ,dan tombol inpit_sub_id_button, serta tombol CRUD dan Clear untuk Sub_Gn_Cyan_Bawah, dan juga sub_frame_record untuk menampilkan data dari tabel Sub_Gn_Cyan_Atas, lalu mengatur tata letak dan style setiap elemen, sehingga kode menjadi berikut ini:

import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")    

main_frame = tk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=1)

canvas = tk.Canvas(main_frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar_y = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)

canvas.configure(yscrollcommand=scrollbar_y.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Frame utama untuk konten
content_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=content_frame, anchor="nw")

data_frame = tk.Frame(content_frame)
data_frame.grid(row=0, column=0, padx=10, pady=10)

record_frame = tk.Frame(data_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

sub_entry_frame = tk.Frame(content_frame)
sub_entry_frame.grid(row=2, column=0, padx=10, pady=10)

sub_record_frame = tk.Frame(content_frame)
sub_record_frame.grid(row=3, column=0, sticky="w", padx=10, pady=10)

# 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()
    
# Fungsi untuk membersihkan entry
def clear_entries(entries):
    for entry in entries:
        entry.delete(0, tk.END)    

# Fungsi CRUD untuk Gn_Cyan_Bawah
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Gn_Cyan_Bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode()                                                                                     

def setup_default_mode():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')                       

def display_records():
    for widget in record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)        
# lLabel untuk gn_cyan_bawah
tk.Label(data_frame, fg="tomato", text="CRUD Data \n gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk gn_cyan_bawah
labels = ["ID", "Level_R", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(labels):
    tk.Label(data_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(labels)):
        if j == 0: # ID column
            entry = tk.Entry(data_frame, width=4)
        elif j == 1: # Level_R column
            entry = tk.Entry(data_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(data_frame, width=20)
        entry.grid(row=i+4, column=j, padx=5, pady=5)
        row.append(entry)
    entry_rows.append(row)
    
# EntryBox untuk ID
id_label = tk.Label(data_frame, text="ID for Operation")
id_label.grid(row=8, column=0, padx=5, pady=5)
id_entry = tk.Entry(data_frame, width=6)
id_entry.grid(row=9, column=0, padx=5, pady=5)

def input_id_entry():
    # Dapatkan teks dari entry
    input_id = id_entry.get()
    # Bersihkan entry setelah input
    id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "ID berhasil diinput dan dibersihkan")

# Membuat tombol input_id
input_id_button = tk.Button(data_frame, text="Clear ID", bg="red", fg="white", command=input_id_entry)
input_id_button.place(x=385, y=395)

# Membuat tombol CRUD
create_button = tk.Button(data_frame, text="Create", bg="cyan", fg="black", command=lambda: create_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
create_button.grid(row=9, column=2, padx=5, pady=5)

read_button = tk.Button(data_frame, text="Read", bg="cyan", fg="black", command=lambda: read_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
read_button.grid(row=9, column=3, padx=5, pady=5)

update_button = tk.Button(data_frame, text="Update", bg="cyan", fg="black", command=lambda: update_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
update_button.grid(row=9, column=4, padx=5, pady=5)

delete_button = tk.Button(data_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
delete_button.grid(row=9, column=5, padx=5, pady=5)

clear_button = tk.Button(data_frame, text="Clear", bg="lightgrey", fg="black", command=clear_entries_gn_cyan_bawah)
clear_button.grid(row=9, column=6, padx=5, pady=5)


# Sub_Gn_Cyan_Bawah CRUD Operations
def create_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Sub_Gn_Cyan_Bawah (Sub_ID, Level_D, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def read_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for Sub_ID {row[0].get()}")
        display_sub_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Sub_Gn_Cyan_Bawah SET Level_D = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE Sub_ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def delete_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def clear_entries_sub_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in sub_entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode_sub()

def setup_default_mode_sub():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(sub_entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')

def display_sub_records():
    for widget in sub_record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(sub_record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)

separator = tk.Frame(data_frame, height=40, bg="grey")
separator.grid(row=11, column=0, padx=5, pady=5)           

# Label untuk sub_gn_cyan_bawah
tk.Label(sub_entry_frame, fg="tomato", text="CRUD Data \n sub_gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk sub_gn_cyan_bawah
sub_labels = ["Sub_ID", "Level_D", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(sub_labels):
    tk.Label(sub_entry_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

sub_entry_rows = []
for i in range(1): # Create four rows of entries
    row = []
    for j in range(len(sub_labels)):
        if j == 0: # Sub_ID column
            entry = tk.Entry(sub_entry_frame, width=4)
        elif j == 1: # Level_D column
            entry = tk.Entry(sub_entry_frame, width=6, bg="white", justify="center")
            levels = ["Satu"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(sub_entry_frame, width=20)
        entry.grid(row=i+2, column=j, padx=5, pady=5)
        row.append(entry)
    sub_entry_rows.append(row)

# EntryBox untuk Sub_ID
sub_id_label = tk.Label(sub_entry_frame, text="Sub_ID for Operation")
sub_id_label.grid(row=6, column=0, padx=5, pady=5)
sub_id_entry = tk.Entry(sub_entry_frame, width=6)
sub_id_entry.grid(row=7, column=0, padx=5, pady=5)

def input_sub_id_entry():
    # Dapatkan teks dari entry
    input_id = sub_id_entry.get()
    # Bersihkan entry setelah input
    sub_id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "Sub_ID berhasil diinput dan dibersihkan")

# Membuat tombol input_sub_id
input_sub_id_button = tk.Button(sub_entry_frame, text="Clear Sub_ID", bg="red", fg="white", command=input_sub_id_entry)
input_sub_id_button.place(x=190, y=245)

# Membuat tombol CRUD untuk sub_gn_cyan_bawah
create_sub_button = tk.Button(sub_entry_frame, text="Create", bg="green", fg="white", command=lambda: create_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
create_sub_button.grid(row=7, column=2, padx=5, pady=5)

read_sub_button = tk.Button(sub_entry_frame, text="Read", bg="green", fg="white", command=lambda: read_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
read_sub_button.grid(row=7, column=3, padx=5, pady=5)

update_sub_button = tk.Button(sub_entry_frame, text="Update", bg="green", fg="white", command=lambda: update_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
update_sub_button.grid(row=7, column=4, padx=5, pady=5)

delete_sub_button = tk.Button(sub_entry_frame, text="Delete", bg="green", fg="white", command=lambda: delete_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
delete_sub_button.grid(row=7, column=5, padx=5, pady=5)

clear_sub_button = tk.Button(sub_entry_frame, text="Clear", bg="grey", fg="white", command=clear_entries_sub_gn_cyan_bawah)
clear_sub_button.grid(row=7, column=6, padx=5, pady=5)

# Inisialisasi database dan tampilkan data awal
init_db()
display_records()
display_sub_records()

root.mainloop()

 Selanjutnya kode akan dimodifikasi dengan mengelola CRUD  berdasarkan sesuai dengan ketentuan yang berlaku pada data Gn_Cyan_Bswah, dan Sub_Gn_Cysn_Bawah, baik data Bass maupun data Trebel pada kedua tabel tersebut


Saya melihat bahwa Anda ingin menambahkan beberapa elemen tambahan dan juga tombol CRUD untuk kedua tabel, yaitu `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`. Berikut adalah kode yang sudah dimodifikasi dan lengkap:

```python
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")    

main_frame = tk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=1)

canvas = tk.Canvas(main_frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar_y = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)

canvas.configure(yscrollcommand=scrollbar_y.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Frame utama untuk konten
content_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=content_frame, anchor="nw")

data_frame = tk.Frame(content_frame)
data_frame.grid(row=0, column=0, padx=10, pady=10)

record_frame = tk.Frame(data_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

sub_entry_frame = tk.Frame(content_frame)
sub_entry_frame.grid(row=2, column=0, padx=10, pady=10)

sub_record_frame = tk.Frame(content_frame)
sub_record_frame.grid(row=3, column=0, sticky="w", padx=10, pady=10)

# 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()
    
# Fungsi untuk membersihkan entry
def clear_entries(entries):
    for entry in entries:
        entry.delete(0, tk.END)    

# Fungsi CRUD untuk Gn_Cyan_Bawah
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Gn_Cyan_Bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode()                                                                                     

def setup_default_mode():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')                       

def display_records():
    for widget in record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)        

# Label untuk gn_cyan_bawah
tk.Label(data_frame, fg="tomato", text="CRUD Data \n gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk gn_cyan_bawah
labels = ["ID", "Level_R", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(labels):
    tk.Label(data_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(labels)):
        if j == 0: # ID column
            entry = tk.Entry(data_frame, width=4)
        elif j == 1: # Level_R column
            entry = tk.Entry(data_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(data_frame, width=20)
        entry.grid(row=i+4, column=j, padx=5, pady=5)
        row.append(entry)
    entry_rows.append(row)
    
# EntryBox untuk ID
id_label = tk.Label(data_frame, text="ID for Operation")
id_label.grid(row=8, column=0, padx=5, pady=5)
id_entry = tk.Entry(data_frame, width=6)
id_entry.grid(row=9, column=0, padx=5, pady=5)

def input_id_entry():
    # Dapatkan teks dari entry
    input_id = id_entry.get()
    # Bersihkan entry setelah input
    id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "ID berhasil diinput dan dibersihkan")

# Membuat tombol input_id
input_id_button = tk.Button(data_frame, text="Clear ID", bg="red", fg="white", command=input_id_entry)
input_id_button.place(x=385, y=395)

# Membuat tombol CRUD
create_button = tk.Button(data_frame, text="Create", bg="cyan", fg="black", command=lambda: create_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
create_button.grid(row=9, column=2, padx=5, pady=5)

read_button = tk.Button(data_frame, text="Read", bg="cyan", fg="black", command=lambda: read_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
read_button.grid(row=9, column=3, padx=5, pady=5)

update_button = tk.Button(data_frame, text="Update", bg="cyan", fg="black", command=lambda: update_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
update_button.grid(row=9, column=4, padx=5, pady=5)

delete_button = tk.Button(data_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
delete_button.grid(row=9, column=5, padx=5, pady=5)

clear_button


Untuk melalukan CRUD pada data tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, maka saya membuat file baru dengan nama file: CRUD_Gn_Cyan_Bawah(gabung).py. Kemudian pada kode isi file DATA_Gn_Cyan_Bawah(gabung).py.saya tambahkan sebuah tombol "Pilih Nada" agar supaya ketika pengguna menekan tombol "Pilih Nada" maka akan membuka file CRUD_Gn_Cyan_Bawah(gabung).py. Di dalam file inilah kita akan melakukan CRUD data Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah. Sehingga kode isi file DATA_Gn_Cyan_Bawah(gabung).py seutuhnya adalah berikut ini;
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")    

main_frame = tk.Frame(root)
main_frame.pack(fill=tk.BOTH, expand=1)

canvas = tk.Canvas(main_frame)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)

scrollbar_y = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)

canvas.configure(yscrollcommand=scrollbar_y.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

# Frame utama untuk konten
content_frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=content_frame, anchor="nw")

data_frame = tk.Frame(content_frame)
data_frame.grid(row=0, column=0, padx=10, pady=10)

record_frame = tk.Frame(data_frame)
record_frame.grid(row=10, column=0, padx=10, pady=10)

sub_entry_frame = tk.Frame(content_frame)
sub_entry_frame.grid(row=2, column=0, padx=10, pady=10)

sub_record_frame = tk.Frame(content_frame)
sub_record_frame.grid(row=3, column=0, sticky="w", padx=10, pady=10)

# 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()
    
# Fungsi untuk membersihkan entry
def clear_entries(entries):
    for entry in entries:
        entry.delete(0, tk.END)    

# Fungsi CRUD untuk Gn_Cyan_Bawah
def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def read_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for ID {row[0].get()}")
        display_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Gn_Cyan_Bawah SET Level_R = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def delete_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_gn_cyan_bawah(row)
    display_records()

def clear_entries_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode()                                                                                     

def setup_default_mode():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')                       

def display_records():
    for widget in record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)        
# lLabel untuk gn_cyan_bawah
tk.Label(data_frame, fg="tomato", text="CRUD Data \n gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk gn_cyan_bawah
labels = ["ID", "Level_R", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(labels):
    tk.Label(data_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

entry_rows = []
for i in range(4): # Create four rows of entries
    row = []
    for j in range(len(labels)):
        if j == 0: # ID column
            entry = tk.Entry(data_frame, width=4)
        elif j == 1: # Level_R column
            entry = tk.Entry(data_frame, width=6, bg="white", justify="center")
            levels = ["Satu", "Dua", "Tiga", "Empat"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(data_frame, width=20)
        entry.grid(row=i+4, column=j, padx=5, pady=5)
        row.append(entry)
    entry_rows.append(row)
    
# EntryBox untuk ID
id_label = tk.Label(data_frame, text="ID for Operation")
id_label.grid(row=8, column=0, padx=5, pady=5)
id_entry = tk.Entry(data_frame, width=6)
id_entry.grid(row=9, column=0, padx=5, pady=5)

def input_id_entry():
    # Dapatkan teks dari entry
    input_id = id_entry.get()
    # Bersihkan entry setelah input
    id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "ID berhasil diinput dan dibersihkan")

# Membuat tombol input_id
input_id_button = tk.Button(data_frame, text="Clear ID", bg="red", fg="white", command=input_id_entry)
input_id_button.place(x=385, y=395)

# Membuat tombol CRUD
create_button = tk.Button(data_frame, text="Create", bg="cyan", fg="black", command=lambda: create_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
create_button.grid(row=9, column=2, padx=5, pady=5)

read_button = tk.Button(data_frame, text="Read", bg="cyan", fg="black", command=lambda: read_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
read_button.grid(row=9, column=3, padx=5, pady=5)

update_button = tk.Button(data_frame, text="Update", bg="cyan", fg="black", command=lambda: update_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
update_button.grid(row=9, column=4, padx=5, pady=5)

delete_button = tk.Button(data_frame, text="Delete", bg="cyan", fg="black", command=lambda: delete_gn_cyan_bawah_record(entry_rows[int(id_entry.get()) - 1]))
delete_button.grid(row=9, column=5, padx=5, pady=5)

clear_button = tk.Button(data_frame, text="Clear", bg="lightgrey", fg="black", command=clear_entries_gn_cyan_bawah)
clear_button.grid(row=9, column=6, padx=5, pady=5)


# Sub_Gn_Cyan_Bawah CRUD Operations
def create_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Sub_Gn_Cyan_Bawah (Sub_ID, Level_D, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0].get(), row[1].get(), row[2].get(), row[3].get(), row[4].get()))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def read_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        record = c.fetchone()
        if record:
            for col, value in enumerate(record):
                row[col].delete(0, tk.END)
                row[col].insert(0, int(value) if isinstance(value, float) else value)
        else:
            print(f"No record found for Sub_ID {row[0].get()}")
        display_sub_records()
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

def update_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("UPDATE Sub_Gn_Cyan_Bawah SET Level_D = ?, Bass = ?, Trebel_Biasa = ?, Trebel_Aneh = ? WHERE Sub_ID = ?", 
                  (row[1].get(), row[2].get(), row[3].get(), row[4].get(), row[0].get()))
        conn.commit()
    except Exception as e:
        print(f"Error updating record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def delete_sub_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("DELETE FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID = ?", (row[0].get(),))
        conn.commit()
    except Exception as e:
        print(f"Error deleting record: {e}")
    finally:
        conn.close()
    clear_entries_sub_gn_cyan_bawah(row)
    display_sub_records()

def clear_entries_sub_gn_cyan_bawah(row=None):
    if row:
        for entry in row:
            entry.delete(0, tk.END)
    else:
        for row in sub_entry_rows:
            for entry in row:
                entry.delete(0, tk.END)
    setup_default_mode_sub()

def setup_default_mode_sub():
    levels = ["Satu", "Dua", "Tiga", "Empat"]
    for row_index, row in enumerate(sub_entry_rows):
        row[1].delete(0, tk.END)
        row[1].insert(0, levels[row_index])
        row[1].config(state='readonly')

def display_sub_records():
    for widget in sub_record_frame.winfo_children():
        widget.destroy()
    
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah")
    records = c.fetchall()
    conn.close()

    for i, record in enumerate(records):
        for j, value in enumerate(record):
            tk.Label(sub_record_frame, text=value).grid(row=i, column=j, padx=5, pady=5)

separator = tk.Frame(data_frame, height=40, bg="grey")
separator.grid(row=11, column=0, padx=5, pady=5)           

# Label untuk sub_gn_cyan_bawah
tk.Label(sub_entry_frame, fg="tomato", text="CRUD Data \n sub_gn_cyan_bawah").grid(row=0, column=0, padx=5, pady=5)

# Entry untuk sub_gn_cyan_bawah
sub_labels = ["Sub_ID", "Level_D", "Bass", "Trebel_Biasa", "Trebel_Aneh"]
for col_index, label in enumerate(sub_labels):
    tk.Label(sub_entry_frame, text=label).grid(row=1, column=col_index, padx=5, pady=5)

sub_entry_rows = []
for i in range(1): # Create four rows of entries
    row = []
    for j in range(len(sub_labels)):
        if j == 0: # Sub_ID column
            entry = tk.Entry(sub_entry_frame, width=4)
        elif j == 1: # Level_D column
            entry = tk.Entry(sub_entry_frame, width=6, bg="white", justify="center")
            levels = ["Satu"]
            entry.insert(0, levels[i])
            entry.config(state='readonly')
        else:
            entry = tk.Entry(sub_entry_frame, width=20)
        entry.grid(row=i+2, column=j, padx=5, pady=5)
        row.append(entry)
    sub_entry_rows.append(row)

# EntryBox untuk Sub_ID
sub_id_label = tk.Label(sub_entry_frame, text="Sub_ID for Operation")
sub_id_label.grid(row=6, column=0, padx=5, pady=5)
sub_id_entry = tk.Entry(sub_entry_frame, width=6)
sub_id_entry.grid(row=7, column=0, padx=5, pady=5)

def input_sub_id_entry():
    # Dapatkan teks dari entry
    input_id = sub_id_entry.get()
    # Bersihkan entry setelah input
    sub_id_entry.delete(0, tk.END)
    # Menampilkan pesan konfirmasi
    messagebox.showinfo("Info", "Sub_ID berhasil diinput dan dibersihkan")

# Membuat tombol input_sub_id
input_sub_id_button = tk.Button(sub_entry_frame, text="Clear Sub_ID", bg="red", fg="white", command=input_sub_id_entry)
input_sub_id_button.place(x=190, y=245)

# Membuat tombol CRUD untuk sub_gn_cyan_bawah
create_sub_button = tk.Button(sub_entry_frame, text="Create", bg="green", fg="white", command=lambda: create_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
create_sub_button.grid(row=7, column=2, padx=5, pady=5)

read_sub_button = tk.Button(sub_entry_frame, text="Read", bg="green", fg="white", command=lambda: read_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
read_sub_button.grid(row=7, column=3, padx=5, pady=5)

update_sub_button = tk.Button(sub_entry_frame, text="Update", bg="green", fg="white", command=lambda: update_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
update_sub_button.grid(row=7, column=4, padx=5, pady=5)

delete_sub_button = tk.Button(sub_entry_frame, text="Delete", bg="green", fg="white", command=lambda: delete_sub_gn_cyan_bawah_record(sub_entry_rows[int(sub_id_entry.get()) - 1]))
delete_sub_button.grid(row=7, column=5, padx=5, pady=5)

clear_sub_button = tk.Button(sub_entry_frame, text="Clear", bg="grey", fg="white", command=clear_entries_sub_gn_cyan_bawah)
clear_sub_button.grid(row=7, column=6, padx=5, pady=5)

separator = tk.Frame(content_frame, height=40, bg="grey")
separator.grid(row=8, column=0, padx=5, pady=5)         

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

    # Pilih Buttons
pilih_button = tk.Button(content_frame, text="Pilih Nada", command=open_crud_gn_cyan_bawah_file, bg="green", fg="white")
pilih_button.grid(row=11, column=0, sticky="w", padx=395, pady=5)

# Inisialisasi database dan tampilkan data awal
init_db()
display_records()
display_sub_records()

root.mainloop()


Untuk memastikan bahwa tombol "Pilih Nada" dapat membuka dan mengeksekusi file `CRUD_Gn_Cyan_Bawah(gabung).py`, langkah-langkah yang telah Anda ambil terlihat tepat. Namun, ada beberapa hal yang dapat diperhatikan untuk memastikan kode berfungsi dengan baik:

1. **Penggunaan `exec` untuk Menjalankan File Lain**:
   Penggunaan `exec` dengan membaca dan mengeksekusi kode dari file dapat bekerja, tetapi ini tidak ideal karena masalah keamanan dan kesalahan yang mungkin terjadi. Sebaiknya, Anda memisahkan logika CRUD ke dalam fungsi-fungsi yang dapat dipanggil dari file utama. Berikut adalah contoh bagaimana Anda dapat menstrukturkan kode agar lebih modular dan aman:

1. **Pemisahan Fungsi CRUD ke dalam Modul Terpisah**:
   Buat file `CRUD_Gn_Cyan_Bawah.py` dengan fungsi CRUD untuk `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`.

2. **Memanggil Fungsi dari File Utama**:
   Dari file utama, impor dan panggil fungsi dari `CRUD_Gn_Cyan_Bawah.py`.

### Contoh File `CRUD_Gn_Cyan_Bawah.py`
```python
import sqlite3

def create_gn_cyan_bawah_record(row):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO Gn_Cyan_Bawah (ID, Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?, ?)",
                  (row[0], row[1], row[2], row[3], row[4]))
        conn.commit()
    except Exception as e:
        print(f"Error inserting record: {e}")
    finally:
        conn.close()

# Fungsi lainnya (read_gn_cyan_bawah_record, update_gn_cyan_bawah_record, delete_gn_cyan_bawah_record)
# Dapat diimplementasikan dengan cara serupa

def read_gn_cyan_bawah_record(id):
    conn = sqlite3.connect('DATAMUSIK.db')
    c = conn.cursor()
    try:
        c.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (id,))
        record = c.fetchone()
        return record
    except Exception as e:
        print(f"Error reading record: {e}")
    finally:
        conn.close()

# Fungsi CRUD untuk Sub_Gn_Cyan_Bawah juga dapat didefinisikan di sini
```

### Contoh File `DATA_Gn_Cyan_Bawah.py`
```python
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from CRUD_Gn_Cyan_Bawah import create_gn_cyan_bawah_record, read_gn_cyan_bawah_record

# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Bawah")

# ... (Kode inisialisasi tkinter lainnya)

def open_crud_gn_cyan_bawah_file():
    selected_row = entry_rows[int(id_entry.get()) - 1]
    data = [entry.get() for entry in selected_row]
    create_gn_cyan_bawah_record(data)
    messagebox.showinfo("Success", "Record created successfully")

# Tombol untuk membuka fungsi CRUD
pilih_button = tk.Button(content_frame, text="Pilih Nada", command=open_crud_gn_cyan_bawah_file, bg="green", fg="white")
pilih_button.grid(row=11, column=0, sticky="w", padx=395, pady=5)

# Inisialisasi database dan tampilkan data awal
init_db()
display_records()
display_sub_records()

root.mainloop()
```

### Penjelasan:
- **`CRUD_Gn_Cyan_Bawah.py`**:
  - File ini berisi fungsi CRUD yang terpisah dari logika GUI. Anda dapat menambahkan fungsi `read_gn_cyan_bawah_record`, `update_gn_cyan_bawah_record`, dan `delete_gn_cyan_bawah_record` dengan pola yang sama.
  
- **`DATA_Gn_Cyan_Bawah.py`**:
  - File utama ini mengimpor dan memanggil fungsi dari `CRUD_Gn_Cyan_Bawah.py` untuk melakukan operasi CRUD.
  - Tombol "Pilih Nada" memanggil fungsi `open_crud_gn_cyan_bawah_file` yang menggunakan fungsi CRUD yang telah diimpor.

Dengan pemisahan ini, kode akan lebih modular, mudah dikelola, dan lebih aman karena menghindari penggunaan `exec` untuk menjalankan kode dari file lain.



Tambahan Ekstra:

import sqlite3
from tkinter import Tk, Text

# Fungsi untuk mengambil data dari database
def fetch_data():
    # Menghubungkan ke database
    conn = sqlite3.connect('DATAMUSIK.db')
    cursor = conn.cursor()

    # Mengambil data dari tabel Gn_Cyan_Atas
    query_gn_cyan_atas = """
    SELECT Bass_1, Bass_2, Bass_3, Bass_4, Bass_5 FROM Gn_Cyan_Atas
    WHERE id IN (1, 2, 3, 1, 3, 1, 2, 3, 2, 3, 1, 2)
    """
    cursor.execute(query_gn_cyan_atas)
    gn_cyan_atas_data = cursor.fetchall()

    # Mengambil data dari tabel Sub_Gn_Cyan_Atas
    query_sub_gn_cyan_atas = """
    SELECT Bass_1, Bass_2, Bass_3, Bass_4, Bass_5 FROM Sub_Gn_Cyan_Atas
    WHERE Sub_ID IN (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    """
    cursor.execute(query_sub_gn_cyan_atas)
    sub_gn_cyan_atas_data = cursor.fetchall()

    # Menutup koneksi database
    conn.close()

    return gn_cyan_atas_data, sub_gn_cyan_atas_data
    

# Fungsi untuk menampilkan data menggunakan tkinter
def display_data():
    gn_cyan_atas_data, sub_gn_cyan_atas_data = fetch_data()
    
    # Membuat jendela tkinter
    root = Tk()
    root.title("Data Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas")

    # Membuat teks area untuk menampilkan data
    text_area = Text(root, wrap='word', width=100, height=30)
    text_area.pack(expand=True, fill='both')

    # Menampilkan data Gn_Cyan_Atas
    text_area.insert('end', "Data Gn_Cyan_Atas:\n")
    for row in gn_cyan_atas_data:
        text_area.insert('end', f"{row}\n")

    # Menampilkan data Sub_Gn_Cyan_Atas
    text_area.insert('end', "\nData Sub_Gn_Cyan_Atas:\n")
    for row in sub_gn_cyan_atas_data:
        modified_row = tuple(int(char)-1 if char.isdigit() else char for char in row)
        text_area.insert('end', f"{modified_row}\n")

    # Memulai loop tkinter
    root.mainloop()

# Menjalankan fungsi display_data untuk menampilkan data
display_data()



Bersambung ke ;



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