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
Posting Komentar
This Message