MELAKUKAN CRUD DATA PADA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah DI DATABASE DATAMUSIK db (Part-2)
Untuk memilih Gugusan Nada Terpilih (Data Musik) dari tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah, maka pada isi file CRUD_Gn_Cyan_Bawah(gabung).py pada bottom_frame saya tambahkan label gugusan nada terpilih, 4 buah entry (bass_gn_cyan_bawah_entry, sub_bass_gn_cyan_bawah_entry, trebel_gn_cyan_bawah_entry, sub_trebel_gn_cyan_bawah_entry) untuk tempat meletakkan data gugusan nada terpilih yang didapat dari kedua tabel tersebut, dan sebuah tombol Pilih Nada untuk menjalankan perintah "select_nada" untuk memilih/mengambil dan meletakkan data gugusan nada terpilih yang dari tabel ke dalam masing-masing kotak entry, sebelum data ditampilkan maka semua entries terlebih dahulu sudah dibersihkan.
Namun data gugusan nada terpilih yang diambil dari tabel, data dipilih oleh pengguna berdasarkan ID, Progres, Mode, Level_Gn, dan Nada (Bass/Trebel) yang diinput pada masing masing kotak entries (EntryBoxs) yang tersedia pada frame_top,
Sehingga kode isi file CRUD_Gn_Cyan_Bawah(gabung).py berkembang menjadi seperti berikut ini:
import tkinter as tk
from tkinter import ttk
import sqlite3
from tkinter import messagebox
from tkinter import filedialog
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import subprocess
import os
import logging
# Initialize logging
logging.basicConfig(level=logging.INFO)
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
# Function to initialize database
def init_db():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
# Create Gn_Cyan_Bawah table
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
)''')
# Create Sub_Gn_Cyan_Bawah table
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()
# Head Frame
head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)
head_frame.place()
# Content Frame
content_frame = tk.Frame(root)
content_frame.pack()
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
# Function to switch modes and update pages
def switch_mode(progres, mode):
if mode[progres - 1] == "naik":
mode[progres - 1] = "turun"
setup_turun_mode(progres)
else:
mode[progres - 1] = "naik"
setup_naik_mode(progres)
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3")
# Current mode for each toggle button
current_mode = ['naik', 'naik', 'naik']
toggle_btns = []
indicator_labels = []
pages = [
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
]
# Function to toggle menus
def toggle_menu(progres, mode):
if mode[progres - 1] == 'naik':
mode[progres - 1] = 'turun'
toggle_btns[progres - 1].config(text="X _ T")
pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
indicator_labels[progres - 1].config(text="Turun")
else:
mode[progres - 1] = 'naik'
toggle_btns[progres - 1].config(text="☰ _ N")
pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
indicator_labels[progres - 1].config(text="Naik")
update_options_frame(progres)
display_pages(progres)
# Function to display pages
def display_pages(progres):
for widget in content_frame.winfo_children():
widget.destroy()
display_gn_cyan_bawah_page()
# Function to display default page
def display_gn_cyan_bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to setup "Naik" mode
def setup_naik_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 2:
pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 3:
pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
# Function to setup "Turun" mode
def setup_turun_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 2:
pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 3:
pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
# Toggle Button 1
toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))
toggle_btn1.pack(side=tk.LEFT)
toggle_btn1.place(x=5, y=20)
toggle_btns.append(toggle_btn1)
title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))
title_lb1.pack(side=tk.LEFT)
title_lb1.place(x=108, y=11)
indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label1.pack(side=tk.LEFT)
indicator_label1.place(x=127, y=55)
indicator_labels.append(indicator_label1)
# Toggle Button 2
toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))
toggle_btn2.pack(side=tk.LEFT)
toggle_btn2.place(x=232, y=20)
toggle_btns.append(toggle_btn2)
title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))
title_lb2.pack(side=tk.LEFT)
title_lb2.place(x=334, y=5)
indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label2.pack(side=tk.LEFT)
indicator_label2.place(x=368, y=55)
indicator_labels.append(indicator_label2)
# Toggle Button 3
toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))
toggle_btn3.pack(side=tk.LEFT)
toggle_btn3.place(x=460, y=20)
toggle_btns.append(toggle_btn3)
title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))
title_lb3.pack(side=tk.LEFT)
title_lb3.place(x=565, y=5)
indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label3.pack(side=tk.LEFT)
indicator_label3.place(x=599, y=55)
indicator_labels.append(indicator_label3)
head_frame.pack(side=tk.TOP, fill=tk.X)
head_frame.pack_propagate(False)
head_frame.configure(height=120)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
def open_data_gn_cyan_bawah_file():
filepath = "DATA_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih
gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")
# Data Buttons
crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")
crud_btn.grid(row=5, column=0, padx=10, pady=5)
label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")
label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)
separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Frame untuk ID dan progres
frame_top = tk.Frame(root)
frame_top.pack(pady=10)
# CRUD Functions
def clear_entries():
for row in entry_rows:
for entry in row:
entry.delete(0, tk.END)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5, pady=5)
label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")
label_Level_Gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=2, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=2, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=3, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=3, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=4, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("Bass", "Trebel")
nada_combobox.grid(row=4, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Label Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)
#Label dan Entry Ambil Gugusan nada Teroilih
label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")
label_bass_gn_cyan_atas.grid(row=7, column=1, padx=5, pady=5)
entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_gn_cyan_atas.grid(row=8, column=1, padx=5, pady=5)
label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")
label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)
entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)
label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)
entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)
label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)
entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)
# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna
def select_nada():
save_current_values()
nada = nada_var.get()
progres = int(progres_var.get()) if progres_var.get() else 0
if nada == "Bass":
select_bass_nada_and_display_in_entries()
elif nada == "Trebel":
clear_entries_except_progres()
restore_saved_values()
select_trebel_nada_and_display_in_entries()
# Reset progres and nada selection
progres_combobox.set('')
nada_combobox.set('')
# Fungsi untuk membersihkan semua entry
def clear_all_entries():
entry_id.delete(0, tk.END)
entry_level_gn.delete(0, tk.END)
progres_var.set('')
mode_var.set('')
nada_var.set('')
entry_bass_gn_cyan_bawah.delete(0, tk.END)
entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)
# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)
# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py
active_page = None # Menyimpan halaman aktif
# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py
def run_gn_a_trebel_file():
filepath = "CRUD_Gn_A_Trebel.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_biru_file():
filepath = "CRUD_Gn_Biru.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_bawah_file():
filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_atas_file():
filepath = "CRUD_Gn_Cyan_Atas(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_a_bass_file():
filepath = "CRUD_Gn_A_Bass.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
# Function to display the options based on the current mode and progress
def update_options_frame(progres):
# Clear existing buttons
for widget in options_frame.winfo_children():
widget.destroy()
if current_mode[progres - 1] == "turun":
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=50)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)
else: # Mode "naik"
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=50)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
Gn_Biru_btn.place(x=3, y=100)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_indicate.place(x=2, y=105, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=150)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)
# Call update_options_frame for the initial setup
update_options_frame(1)
# Function to display Gn_A_Trebel page
def Gn_A_Trebel_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_Biru_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Bawah page
def Gn_Cyan_Bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Atas page
def Gn_Cyan_Atas_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_A_Bass_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()
# Initialize the default page
def init_default_page():
update_options_frame(1) # Default to showing options for Progres-1
clear_content_frame()
tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()
#Fungsi tombol di options_frame
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=0)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
Gn_Biru_btn.place(x=3, y=50)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=100)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=150)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=200)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)
# Main Function
if __name__ == "__main__":
init_db()
init_default_page()
root.mainloop()
Selanjutnya tolong modifikasi kode agar supaya data gugusan nada terpilih yang diambil dari tabel dapat diletakkan di 4 entries yang tersedia (bass_gn_cyan_bawah_entry, sub_bass_gn_cyan_bawah_entry, trebel_gn_cyan_bawah_entry, sub_trebel_gn_cyan_bawah_entry), dan pastikan data gugusan nada terpilih tersebut dipilih berdasarkan input oleh pengguna pada kotak entries: ID, Progres, Mode, Level_Gn, dan Nada (Bass atau Trebel)
Terima kasih atas penjelasan dan kode yang telah Anda berikan. Berdasarkan uraian Anda, tampaknya Anda ingin menambahkan fitur untuk memilih gugusan nada terpilih dari tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah, dengan data yang akan ditampilkan pada bottom_frame di beberapa Entry. Berikut adalah beberapa poin dan penyesuaian yang dapat diterapkan untuk melengkapi kode yang Anda buat:Menambahkan Fungsi untuk Mengambil Data dari Tabel: Anda memerlukan fungsi untuk mengambil data berdasarkan ID, Progres, Mode, Level_Gn, dan jenis Nada dari tabel yang bersangkutan.Memperbaiki Struktur dan Logika: Beberapa fungsi seperti clear_entries, select_nada, dan fungsi yang terkait dengan pengambilan data dari tabel perlu diperbaiki atau ditambahkan agar sesuai dengan logika aplikasi.Berikut adalah kode yang sudah diperbaiki dan ditambahkan fungsi select_nada:
import tkinter as tk
from tkinter import ttk
import sqlite3
from tkinter import messagebox
from tkinter import filedialog
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import subprocess
import os
import logging
# Initialize logging
logging.basicConfig(level=logging.INFO)
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
# Function to initialize database
def init_db():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
# Create Gn_Cyan_Bawah table
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
)''')
# Create Sub_Gn_Cyan_Bawah table
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()
# Head Frame
head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)
head_frame.place()
# Content Frame
content_frame = tk.Frame(root)
content_frame.pack()
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
# Function to switch modes and update pages
def switch_mode(progres, mode):
if mode[progres - 1] == "naik":
mode[progres - 1] = "turun"
setup_turun_mode(progres)
else:
mode[progres - 1] = "naik"
setup_naik_mode(progres)
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3")
# Current mode for each toggle button
current_mode = ['naik', 'naik', 'naik']
toggle_btns = []
indicator_labels = []
pages = [
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
]
# Function to toggle menus
def toggle_menu(progres, mode):
if mode[progres - 1] == 'naik':
mode[progres - 1] = 'turun'
toggle_btns[progres - 1].config(text="X _ T")
pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
indicator_labels[progres - 1].config(text="Turun")
else:
mode[progres - 1] = 'naik'
toggle_btns[progres - 1].config(text="☰ _ N")
pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
indicator_labels[progres - 1].config(text="Naik")
update_options_frame(progres)
display_pages(progres)
# Function to display pages
def display_pages(progres):
for widget in content_frame.winfo_children():
widget.destroy()
display_gn_cyan_bawah_page()
# Function to display default page
def display_gn_cyan_bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to setup "Naik" mode
def setup_naik_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 2:
pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 3:
pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
# Function to setup "Turun" mode
def setup_turun_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 2:
pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 3:
pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
# Toggle Button 1
toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))
toggle_btn1.pack(side=tk.LEFT)
toggle_btn1.place(x=5, y=20)
toggle_btns.append(toggle_btn1)
title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))
title_lb1.pack(side=tk.LEFT)
title_lb1.place(x=108, y=11)
indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label1.pack(side=tk.LEFT)
indicator_label1.place(x=127, y=55)
indicator_labels.append(indicator_label1)
# Toggle Button 2
toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))
toggle_btn2.pack(side=tk.LEFT)
toggle_btn2.place(x=232, y=20)
toggle_btns.append(toggle_btn2)
title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))
title_lb2.pack(side=tk.LEFT)
title_lb2.place(x=334, y=5)
indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label2.pack(side=tk.LEFT)
indicator_label2.place(x=368, y=55)
indicator_labels.append(indicator_label2)
# Toggle Button 3
toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))
toggle_btn3.pack(side=tk.LEFT)
toggle_btn3.place(x=460, y=20)
toggle_btns.append(toggle_btn3)
title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))
title_lb3.pack(side=tk.LEFT)
title_lb3.place(x=565, y=5)
indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label3.pack(side=tk.LEFT)
indicator_label3.place(x=599, y=55)
indicator_labels.append(indicator_label3)
head_frame.pack(side=tk.TOP, fill=tk.X)
head_frame.pack_propagate(False)
head_frame.configure(height=120)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
def open_data_gn_cyan_bawah_file():
filepath = "DATA_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih
gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")
# Data Buttons
crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")
crud_btn.grid(row=5, column=0, padx=10, pady=5)
label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")
label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)
separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Frame untuk ID dan progres
frame_top = tk.Frame(root)
frame_top.pack(pady=10)
# CRUD Functions
def clear_entries():
for row in entry_rows:
for entry in row:
entry.delete(0, tk.END)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5, pady=5)
label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")
label_Level_Gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=2, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=2, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=3, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=3, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=4, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("Bass", "Trebel")
nada_combobox.grid(row=4, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Label Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)
#Label dan Entry Ambil Gugusan nada Teroilih
label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")
label_bass_gn_cyan_atas.grid(row=7, column=1, padx=5, pady=5)
entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_gn_cyan_atas.grid(row=8, column=1, padx=5, pady=5)
label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")
label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)
entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)
label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)
entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)
label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)
entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)
# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna
def select_nada():
save_current_values()
nada = nada_var.get()
progres = int(progres_var.get()) if progres_var.get() else 0
if nada == "Bass":
select_bass_nada_and_display_in_entries()
elif nada == "Trebel":
clear_entries_except_progres()
restore_saved_values()
select_trebel_nada_and_display_in_entries()
# Reset progres and nada selection
progres_combobox.set('')
nada_combobox.set('')
# Fungsi untuk membersihkan semua entry
def clear_all_entries():
entry_id.delete(0, tk.END)
entry_level_gn.delete(0, tk.END)
progres_var.set('')
mode_var.set('')
nada_var.set('')
entry_bass_gn_cyan_bawah.delete(0, tk.END)
entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)
# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)
# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py
active_page = None # Menyimpan halaman aktif
# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py
def run_gn_a_trebel_file():
filepath = "CRUD_Gn_A_Trebel.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_biru_file():
filepath = "CRUD_Gn_Biru.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_bawah_file():
filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_atas_file():
filepath = "CRUD_Gn_Cyan_Atas(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_a_bass_file():
filepath = "CRUD_Gn_A_Bass.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
# Function to display the options based on the current mode and progress
def update_options_frame(progres):
# Clear existing buttons
for widget in options_frame.winfo_children():
widget.destroy()
if current_mode[progres - 1] == "turun":
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=50)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)
else: # Mode "naik"
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=50)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
Gn_Biru_btn.place(x=3, y=100)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_indicate.place(x=2, y=105, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=150)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)
# Call update_options_frame for the initial setup
update_options_frame(1)
# Function to display Gn_A_Trebel page
def Gn_A_Trebel_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_Biru_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Bawah page
def Gn_Cyan_Bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Atas page
def Gn_Cyan_Atas_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_A_Bass_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()
# Initialize the default page
def init_default_page():
update_options_frame(1) # Default to showing options for Progres-1
clear_content_frame()
tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()
#Fungsi tombol di options_frame
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=0)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
Gn_Biru_btn.place(x=3, y=50)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=100)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=150)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=200)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)
# Main Function
if __name__ == "__main__":
init_db()
init_default_page()
root.mainloop()
Penjelasan:
Fungsi select_nada:
Fungsi ini mengambil data dari tabel Gn_Cyan_Bawah dan Sub_Gn_Cyan_Bawah berdasarkan nilai yang diinput oleh pengguna di Entry pada frame_top. Data yang diambil kemudian diisi ke dalam Entry pada bottom_frame sesuai dengan jenis nada yang dipilih (Bass atau Trebel).
Validasi Input:
Fungsi ini juga melakukan validasi untuk memastikan semua Entry pada frame_top telah diisi sebelum mencoba mengambil data dari database.
Pembersihan Entry:
Sebelum menampilkan data yang baru, semua Entry dibersihkan terlebih dahulu menggunakan fungsi clear_all_entries.
Dengan penyesuaian ini, Anda seharusnya dapat mengambil dan menampilkan data sesuai dengan yang diinginkan pengguna. Jika ada kendala lain atau penyesuaian lebih lanjut yang diperlukan, silakan beritahu saya!
Tolong kembali pastikan bahwa jumlah Level_Gn ada sebanyak 12 (dari 1 hingga 12) baik pada tabel Gn_Cyan_Bawah, maupun tabel Sub_Gn_Cyan_Bawah,. Penentu urutan Level_Gn adalah pada nada Bass. Berikut ini urutan Level_Gn pada Gn_Cyan_Bawah:
1. Level Gn= 1 = 5 = 9 pada kolom Bass id 1 Gn_Gn_Cyan_Bawah,
2. Level Gn= 2 = 6 =10 pada kolom Bass id 2,
3. Level Gn= 3 = 7 = 11 pada kolom Bass id 3,
4. Level Gn= 4 = 8 = 12 pada kolom Bass id 4,
Sebenarnya Level Gn pada Gn_Cyan_Bawah ini sampai hingga tak terbatas (unlimited), tetapi kita batasi saja hingga sampai 12 level saja.
Sedangkan Level_Gn pada Sub_Gn_Cyan_Bawah, adalah:
1. Level Gn= 1 = 2 = 3 = 4 = 5 = 6 =7 = 8 = 9 = 10 = 11 = 12 pada kolom Bass sub_id 1 Gn_Gn_Cyan_Bawah,
Sebenarnya, juga Level Gn pada Gn_Cyan_Bawah ini sampai hingga tak terbatas (unlimited), tetapi kita batasi saja hingga sampai 12 level saja.
Dan pastikan pengambilan data kita lakukan pada bagian data Bass terlebih dahulu, baik data Bass dari Gn_Cyan_Bawah, maupun dari Bass Sub_Gn_Cyan_Bawah yang akan serempak diambil, dipilih dari tabel yang sesuai dan dimasukkan ke dalam kotak entries yang sesuai juga, Jadi jelas kode perintah untuk pengambilan data Bass berbeda dengan untuk data Trebel, sebab pada data Trebel akan memiliki penyesuaian atau adaptasi yaitu Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres
Untuk memastikan jumlah **Level_Gn** sesuai dengan urutan yang diinginkan, berikut adalah beberapa poin penting:
### 1. **Penentuan Urutan Level_Gn pada Gn_Cyan_Bawah**
- **Level 1, 5, 9**: Mengambil data dari kolom Bass ID 1.
- **Level 2, 6, 10**: Mengambil data dari kolom Bass ID 2.
- **Level 3, 7, 11**: Mengambil data dari kolom Bass ID 3.
- **Level 4, 8, 12**: Mengambil data dari kolom Bass ID 4.
### 2. **Penentuan Urutan Level_Gn pada Sub_Gn_Cyan_Bawah**
- **Level 1 hingga 12**: Mengambil data dari kolom Bass Sub_ID 1.
### 3. **Pengambilan Data**
- **Data Bass**: Harus diambil serempak dari **Gn_Cyan_Bawah** dan **Sub_Gn_Cyan_Bawah**, kemudian dimasukkan ke dalam kotak entries yang sesuai.
- **Data Trebel**: Akan diambil setelahnya dengan penyesuaian atau adaptasi berdasarkan **progres**.
### Modifikasi Kode
Berikut ini adalah kode yang telah dimodifikasi untuk memastikan pengambilan data sesuai dengan urutan **Level_Gn**:
```python
def select_nada():
id_value = entry_id.get()
level_gn_value = int(entry_level_gn.get())
progres_value = progres_var.get()
mode_value = mode_var.get()
nada_value = nada_var.get()
if not all([id_value, level_gn_value, progres_value, mode_value, nada_value]):
messagebox.showwarning("Warning", "Harap isi semua kolom!")
return
clear_all_entries()
try:
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
# Kondisi untuk menentukan kolom ID dan Sub_ID berdasarkan Level_Gn
if level_gn_value in [1, 5, 9]:
bass_id = 1
elif level_gn_value in [2, 6, 10]:
bass_id = 2
elif level_gn_value in [3, 7, 11]:
bass_id = 3
elif level_gn_value in [4, 8, 12]:
bass_id = 4
else:
messagebox.showerror("Error", "Level_Gn tidak valid!")
return
# Ambil data dari Gn_Cyan_Bawah
c.execute('''
SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Gn_Cyan_bawah
WHERE ID=? AND ?=?
''', (bass_id, mode_value, progres_value))
result_gn_cyan_bawah = c.fetchone()
# Ambil data dari Sub_Gn_Cyan_bawah
c.execute('''
SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Sub_Gn_Cyan_bawah
WHERE Sub_ID=1 AND ?=?
''', (mode_value, progres_value))
result_sub_gn_cyan_bawah = c.fetchone()
# Pengisian data Bass
if nada_value == "Bass":
if result_gn_cyan_bawah:
entry_bass_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[0])
if result_sub_gn_cyan_bawah:
entry_bass_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[0])
# Pengisian data Trebel
elif nada_value == "Trebel":
if result_gn_cyan_bawah:
entry_trebel_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[1])
entry_trebel_sub_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[2])
if result_sub_gn_cyan_bawah:
entry_trebel_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[1])
conn.close()
except Exception as e:
messagebox.showerror("Error", f"Failed to fetch data: {e}")
```
Dengan kode ini, data **Bass** akan diambil dan dimasukkan ke dalam entry sesuai Level_Gn yang sudah ditentukan. Data **Trebel** juga akan dimasukkan setelah pengambilan data Bass, dengan penyesuaian berdasarkan kondisi progres. Hal ini memastikan bahwa pengambilan data sesuai dengan urutan Level_Gn yang kamu inginkan.
Kita memilih gugusan nada Bass dulu, baik Bass dari Gn_Cyan_Bawah maupun Bass dari Sub_Gn_Cyan_Bawah, data Bass Gn_Cyan_Bawah, dan Bass Sub_Gn_Cyan_Bawah ini akan serempak bersamaan diambil, lalu akan serempak dimasukkan ke dalam EntryBoxs: bass_gn_cyan_bawah_entry, dan bass_sub_gn_cyan_bawah_entry, pada kode isi file CRUD_Gn_Cyan_Bawah.py yang butuh dimodifikasi:
import tkinter as tk
from tkinter import ttk
import sqlite3
from tkinter import messagebox
from tkinter import filedialog
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import subprocess
import os
import logging
# Initialize logging
logging.basicConfig(level=logging.INFO)
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
# Function to initialize database
def init_db():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
# Create Gn_Cyan_Bawah table
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
)''')
# Create Sub_Gn_Cyan_Bawah table
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()
# Head Frame
head_frame = tk.Frame(root, bg="#158aff", highlightbackground="white", highlightthickness=1)
head_frame.place()
# Content Frame
content_frame = tk.Frame(root)
content_frame.pack()
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
# Fungsi CRUD untuk Gn_Biru
def create_gn_cyan_bawah_record(row):
conn = sqlite3.connect('DATAMUSIK.db')
c = conn.cursor()
try:
for row in entry_rows:
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:
for row in entry_rows:
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()
input_id_entry()
# Function to switch modes and update pages
def switch_mode(progres, mode):
if mode[progres - 1] == "naik":
mode[progres - 1] = "turun"
setup_turun_mode(progres)
else:
mode[progres - 1] = "naik"
setup_naik_mode(progres)
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3")
# Current mode for each toggle button
current_mode = ['naik', 'naik', 'naik']
toggle_btns = []
indicator_labels = []
pages = [
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
]
# Function to toggle menus
def toggle_menu(progres, mode):
if mode[progres - 1] == 'naik':
mode[progres - 1] = 'turun'
toggle_btns[progres - 1].config(text="X _ T")
pages[progres - 1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
indicator_labels[progres - 1].config(text="Turun")
else:
mode[progres - 1] = 'naik'
toggle_btns[progres - 1].config(text="☰ _ N")
pages[progres - 1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
indicator_labels[progres - 1].config(text="Naik")
update_options_frame(progres)
display_pages(progres)
# Function to display pages
def display_pages(progres):
for widget in content_frame.winfo_children():
widget.destroy()
display_gn_cyan_bawah_page()
# Function to display default page
def display_gn_cyan_bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah Halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to setup "Naik" mode
def setup_naik_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 2:
pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 3:
pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Atas', 'Gn_A_Bass']
# Function to setup "Turun" mode
def setup_turun_mode(progres):
if progres == 1:
pages[0] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 2:
pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
elif progres == 3:
pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_A_Trebel']
# Toggle Button 1
toggle_btn1 = tk.Button(head_frame, text="☰ _ P 1", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(1, current_mode))
toggle_btn1.pack(side=tk.LEFT)
toggle_btn1.place(x=5, y=20)
toggle_btns.append(toggle_btn1)
title_lb1 = tk.Label(head_frame, text="Progres-1", bg="#158aff", fg="white", font=("bold", 7))
title_lb1.pack(side=tk.LEFT)
title_lb1.place(x=108, y=11)
indicator_label1 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label1.pack(side=tk.LEFT)
indicator_label1.place(x=127, y=55)
indicator_labels.append(indicator_label1)
# Toggle Button 2
toggle_btn2 = tk.Button(head_frame, text="☰ _ P 2", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(2, current_mode))
toggle_btn2.pack(side=tk.LEFT)
toggle_btn2.place(x=232, y=20)
toggle_btns.append(toggle_btn2)
title_lb2 = tk.Label(head_frame, text="Progres-2", bg="#158aff", fg="white", font=("bold", 7))
title_lb2.pack(side=tk.LEFT)
title_lb2.place(x=334, y=5)
indicator_label2 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label2.pack(side=tk.LEFT)
indicator_label2.place(x=368, y=55)
indicator_labels.append(indicator_label2)
# Toggle Button 3
toggle_btn3 = tk.Button(head_frame, text="☰ _ P 3", bg="#158aff", font=("bold", 6), fg="white", bd=0, activebackground="#158aff", activeforeground="white", command=lambda: toggle_menu(3, current_mode))
toggle_btn3.pack(side=tk.LEFT)
toggle_btn3.place(x=460, y=20)
toggle_btns.append(toggle_btn3)
title_lb3 = tk.Label(head_frame, text="Progres-3", bg="#158aff", fg="white", font=("bold", 7))
title_lb3.pack(side=tk.LEFT)
title_lb3.place(x=565, y=5)
indicator_label3 = tk.Label(head_frame, text="Naik", bg="#158aff", fg="yellow", font=("bold", 8))
indicator_label3.pack(side=tk.LEFT)
indicator_label3.place(x=599, y=55)
indicator_labels.append(indicator_label3)
head_frame.pack(side=tk.TOP, fill=tk.X)
head_frame.pack_propagate(False)
head_frame.configure(height=120)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Function to clear content frame
def clear_content_frame():
for widget in content_frame.winfo_children():
widget.destroy()
def open_data_gn_cyan_bawah_file():
filepath = "DATA_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
#Gugusan Nada Terpilih: "Gn_Cyan_Atas" Terpilih
gugusan_label = tk.Label(bottom_frame, text="Gn_Cyan_Bawah", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")
# Data Buttons
crud_btn = tk.Button(bottom_frame, text="DATA", command=open_data_gn_cyan_bawah_file, bg="green", fg="white")
crud_btn.grid(row=5, column=0, padx=10, pady=5)
label_info = tk.Label(bottom_frame, fg="tomato", text="Pilih gugusan nada Gn_Cyan_Bawah \n untuk dirangkai dalam \n notasi angka lagu:\n")
label_info.grid(row=6, column=1, sticky="w", padx=0, pady=5)
separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Frame untuk ID dan progres
frame_top = tk.Frame(root)
frame_top.pack(pady=10)
# CRUD Functions
def clear_entries():
for row in entry_rows:
for entry in row:
entry.delete(0, tk.END)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=0, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=0, column=1, padx=5, pady=5)
label_Level_Gn = tk.Label(frame_top, text="Level_Gn:")
label_Level_Gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=2, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=2, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=3, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=3, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=4, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("Bass", "Trebel")
nada_combobox.grid(row=4, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# Label Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=8, column=0, padx=5, pady=5)
#Label dan Entry Ambil Gugusan nada Teroilih
label_bass_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Gn Cyan Bawah:")
label_bass_gn_cyan_atas.grid(row=7, column=1, padx=5, pady=5)
entry_bass_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_gn_cyan_atas.grid(row=8, column=1, padx=5, pady=5)
label_bass_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Bass Sub Gn Cyan Bawah:")
label_bass_sub_gn_cyan_atas.grid(row=7, column=2, padx=5, pady=5)
entry_bass_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_bass_sub_gn_cyan_atas.grid(row=8, column=2, padx=5, pady=5)
label_trebel_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel_gn_cyan_atas.grid(row=7, column=3, padx=5, pady=5)
entry_trebel_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_gn_cyan_atas.grid(row=8, column=3, padx=5, pady=5)
label_trebel_sub_gn_cyan_atas = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_trebel_sub_gn_cyan_atas.grid(row=7, column=4, padx=5, pady=5)
entry_trebel_sub_gn_cyan_atas = tk.Entry(bottom_frame)
entry_trebel_sub_gn_cyan_atas.grid(row=8, column=4, padx=5, pady=5)
# Fungsi untuk memilih dan menampilkan nada berdasarkan pilihan pengguna
def select_nada():
id_value = entry_id.get()
level_gn_value = int(entry_level_gn.get())
progres_value = progres_var.get()
mode_value = mode_var.get()
nada_value = nada_var.get()
if not all([id_value, level_gn_value, progres_value, mode_value, nada_value]):
messagebox.showwarning("Warning", "Harap isi semua kolom!")
return
clear_all_entries()
try:
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
# Kondisi untuk menentukan kolom ID dan Sub_ID berdasarkan Level_Gn
if level_gn_value in [1, 5, 9]:
bass_id = 1
elif level_gn_value in [2, 6, 10]:
bass_id = 2
elif level_gn_value in [3, 7, 11]:
bass_id = 3
elif level_gn_value in [4, 8, 12]:
bass_id = 4
else:
messagebox.showerror("Error", "Level_Gn tidak valid!")
return
# Ambil data dari Gn_Cyan_Bawah
c.execute('''
SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Gn_Cyan_bawah
WHERE ID=? AND ?=?
''', (bass_id, mode_value, progres_value))
result_gn_cyan_bawah = c.fetchone()
# Ambil data dari Sub_Gn_Cyan_bawah
c.execute('''
SELECT Bass, Trebel_Biasa, Trebel_Aneh FROM Sub_Gn_Cyan_bawah
WHERE Sub_ID=1 AND ?=?
''', (mode_value, progres_value))
result_sub_gn_cyan_bawah = c.fetchone()
# Pengisian data Bass
if nada_value == "Bass":
if result_gn_cyan_bawah:
entry_bass_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[0])
if result_sub_gn_cyan_bawah:
entry_bass_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[0])
# Pengisian data Trebel
elif nada_value == "Trebel":
if result_gn_cyan_bawah:
entry_trebel_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[1])
entry_trebel_sub_gn_cyan_bawah.insert(0, result_gn_cyan_bawah[2])
if result_sub_gn_cyan_bawah:
entry_trebel_sub_gn_cyan_bawah.insert(0, result_sub_gn_cyan_bawah[1])
conn.close()
except Exception as e:
messagebox.showerror("Error", f"Failed to fetch data: {e}")
# Fungsi untuk membersihkan semua entry
def clear_all_entries():
entry_id.delete(0, tk.END)
entry_level_gn.delete(0, tk.END)
progres_var.set('')
mode_var.set('')
nada_var.set('')
entry_bass_gn_cyan_bawah.delete(0, tk.END)
entry_bass_sub_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_gn_cyan_bawah.delete(0, tk.END)
entry_trebel_sub_gn_cyan_bawah.delete(0, tk.END)
# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=select_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)
# Fungsi untuk membuka file CRUD_Gn_Cyan_Bawah(gabung).py
active_page = None # Menyimpan halaman aktif
# Fungsi untuk menjalankan file CRUD_Gn_A_Trebel.py, CRUD_Gn_Biru.py, CRUD_Gn_Cyan_Bawah.py, CRUD_Gn_Cysn_Atas.py, dan CRUD_Gn_A_Bass.py
def run_gn_a_trebel_file():
filepath = "CRUD_Gn_A_Trebel.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_biru_file():
filepath = "CRUD_Gn_Biru.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_bawah_file():
filepath = "CRUD_Gn_Cyan_Bawah(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_cyan_atas_file():
filepath = "CRUD_Gn_Cyan_Atas(gabung).py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def run_gn_a_bass_file():
filepath = "CRUD_Gn_A_Bass.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
# Function to display the options based on the current mode and progress
def update_options_frame(progres):
# Clear existing buttons
for widget in options_frame.winfo_children():
widget.destroy()
if current_mode[progres - 1] == "turun":
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=50)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=55, width=5, height=45)
else: # Mode "naik"
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=0)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=5, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=50)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=55, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=150)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=155, width=5, height=45)
# Call update_options_frame for the initial setup
update_options_frame(1)
# Function to display Gn_A_Trebel page
def Gn_A_Trebel_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Trebel", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_Biru_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Biru", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Bawah page
def Gn_Cyan_Bawah_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Bawah", font=("Helvetica", 10)).pack()
# Function to display Gn_Cyan_Atas page
def Gn_Cyan_Atas_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_Cyan_Atas", font=("Helvetica", 10)).pack()
# Function to display Gn_Biru page
def Gn_A_Bass_page():
clear_content_frame()
tk.Label(content_frame, text="Ini adalah halaman Gn_A_Bass", font=("Helvetica", 10)).pack()
# Initialize the default page
def init_default_page():
update_options_frame(1) # Default to showing options for Progres-1
clear_content_frame()
tk.Label(content_frame, text="Halaman Default Gugus Nada", font=("Helvetica", 10)).pack()
#Fungsi tombol di options_frame
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=run_gn_a_trebel_file)
Gn_A_Trebel_btn.place(x=3, y=0)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_indicate.place(x=2, y=5, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=run_gn_biru_file)
Gn_Biru_btn.place(x=3, y=50)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_indicate.place(x=2, y=55, width=5, height=45)
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_bawah_file)
Gn_Cyan_Bawah_btn.place(x=3, y=100)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text="Ini Gn_Cyan_Bawah ", bg="#c3c3c3")
Gn_Cyan_Bawah_indicate.place(x=2, y=105, width=5, height=45)
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=run_gn_cyan_atas_file)
Gn_Cyan_Atas_btn.place(x=3, y=150)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=run_gn_a_bass_file)
Gn_A_Bass_btn.place(x=3, y=200)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)
# Main Function
if __name__ == "__main__":
init_db()
init_default_page()
root.mainloop()
Untuk mengimplementasikan pengambilan data secara bersamaan dari tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` dan memasukkannya ke dalam `EntryBoxs` (yaitu `entry_bass_gn_cyan_atas` dan `entry_bass_sub_gn_cyan_atas`), kita perlu membuat fungsi yang akan menjalankan query pada kedua tabel tersebut, kemudian mengisi `EntryBoxs` dengan data yang diperoleh.
Berikut adalah modifikasi yang bisa diterapkan pada kode:
### 1. Tambahkan Fungsi untuk Mengambil Data Bass
```python
def ambil_data_bass():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
try:
# Ambil data Bass dari Gn_Cyan_Bawah berdasarkan Level_R tertentu
c.execute("SELECT Bass FROM Gn_Cyan_Bawah WHERE Level_R = ?", (entry_level_gn.get(),))
bass_gn_cyan_bawah = c.fetchone()
# Ambil data Bass dari Sub_Gn_Cyan_Bawah berdasarkan Level_D tertentu
c.execute("SELECT Bass FROM Sub_Gn_Cyan_Bawah WHERE Level_D = ?", (entry_level_gn.get(),))
bass_sub_gn_cyan_bawah = c.fetchone()
# Masukkan data ke dalam EntryBoxs jika ditemukan
if bass_gn_cyan_bawah:
entry_bass_gn_cyan_atas.delete(0, tk.END)
entry_bass_gn_cyan_atas.insert(0, bass_gn_cyan_bawah[0])
if bass_sub_gn_cyan_bawah:
entry_bass_sub_gn_cyan_atas.delete(0, tk.END)
entry_bass_sub_gn_cyan_atas.insert(0, bass_sub_gn_cyan_bawah[0])
except Exception as e:
messagebox.showerror("Error", f"Gagal mengambil data Bass: {e}")
finally:
conn.close()
```
### 2. Integrasikan Fungsi dengan Tombol atau Event
Jika Anda ingin fungsi ini dipanggil secara otomatis ketika Level atau ID tertentu dimasukkan, Anda bisa mengintegrasikan fungsi ini pada event atau tombol tertentu:
```python
# Misalnya kita tambahkan pada tombol "Ambil Data"
btn_ambil_data_bass = tk.Button(frame_top, text="Ambil Data Bass", command=ambil_data_bass)
btn_ambil_data_bass.grid(row=9, column=1, padx=5, pady=5)
```
### 3. Uji Coba Fungsi
Sekarang, setelah semua sudah siap, Anda dapat menjalankan program dan mencoba mengambil data dari kedua tabel dengan menekan tombol "Ambil Data Bass". Data yang diperoleh akan dimasukkan ke dalam `EntryBoxs` yang sesuai.
### 4. Penyesuaian Tambahan
Jika ada kondisi atau logika tertentu yang ingin diterapkan saat mengambil data, pastikan untuk menambahkannya di dalam fungsi `ambil_data_bass` sesuai kebutuhan.
Dengan langkah ini, Anda akan bisa mengambil dan menampilkan data Bass dari kedua tabel (`Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`) secara bersamaan di dalam GUI.
Komentar
Posting Komentar
This Message