MELAKUKAN CRUD DATA PADA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah DI DATABASE DATAMUSIK db (Part-1)
MELAKUKAN CRUD DATA PADA TABEL Gn_Cyan_Bawah, DAN TABEL Sub_Gn_Cyan_Bawah DI DATABASE DATAMUSIK db (Part-1)
Sebuah file sudah saya buat dengan nama file: CRUD_Gn_Cyan_Bawah(gabung).py. Pada file berisikan kode fungsi menginisialisasi database DATAMUSIK.db apakah tabel Gn_Cyan_Bawah, dan Sub_Gn_Cyan_Bawah ada atau tidak ada pada database, kode juga membentuk frame sesuai dengan yang diinginkan, sementara kode isi file berikut ini:
import tkinter as tk
from tkinter import ttk
import sqlite3
# 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()
# Initialize database
init_db()
# Start the main loop
root.mainloop()
Langkah berikutnya adalah melengkapi fungsi CRUD (Create, Read, Update, Delete) untuk tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah` dalam file `CRUD_Gn_Cyan_Bawah(gabung).py`. Saya akan menambahkan fungsi-fungsi tersebut, dan juga memperluas GUI untuk memungkinkan interaksi pengguna dengan data ini.
Berikut adalah kelanjutan kode untuk menangani operasi CRUD:
```python
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
# 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 TEXT,
Trebel_Biasa TEXT,
Trebel_Aneh TEXT
)''')
# 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 TEXT,
Trebel_Biasa TEXT,
Trebel_Aneh TEXT
)''')
conn.commit()
conn.close()
# Function to add record
def add_record():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
if table_var.get() == "Gn_Cyan_Bawah":
c.execute("INSERT INTO Gn_Cyan_Bawah (Level_R, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?)",
(level_entry.get(), bass_entry.get(), trebel_biasa_entry.get(), trebel_aneh_entry.get()))
elif table_var.get() == "Sub_Gn_Cyan_Bawah":
c.execute("INSERT INTO Sub_Gn_Cyan_Bawah (Level_D, Bass, Trebel_Biasa, Trebel_Aneh) VALUES (?, ?, ?, ?)",
(level_entry.get(), bass_entry.get(), trebel_biasa_entry.get(), trebel_aneh_entry.get()))
conn.commit()
conn.close()
clear_entries()
messagebox.showinfo("Success", "Record added successfully")
view_records()
# Function to view records
def view_records():
clear_content_frame()
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
if table_var.get() == "Gn_Cyan_Bawah":
c.execute("SELECT * FROM Gn_Cyan_Bawah")
elif table_var.get() == "Sub_Gn_Cyan_Bawah":
c.execute("SELECT * FROM Sub_Gn_Cyan_Bawah")
records = c.fetchall()
conn.close()
tree = ttk.Treeview(content_frame, columns=(1, 2, 3, 4, 5), show="headings", height="10")
tree.pack()
if table_var.get() == "Gn_Cyan_Bawah":
tree.heading(1, text="ID")
tree.heading(2, text="Level_R")
tree.heading(3, text="Bass")
tree.heading(4, text="Trebel_Biasa")
tree.heading(5, text="Trebel_Aneh")
elif table_var.get() == "Sub_Gn_Cyan_Bawah":
tree.heading(1, text="Sub_ID")
tree.heading(2, text="Level_D")
tree.heading(3, text="Bass")
tree.heading(4, text="Trebel_Biasa")
tree.heading(5, text="Trebel_Aneh")
for record in records:
tree.insert("", "end", values=record)
# Function to clear entry fields
def clear_entries():
level_entry.delete(0, tk.END)
bass_entry.delete(0, tk.END)
trebel_biasa_entry.delete(0, tk.END)
trebel_aneh_entry.delete(0, tk.END)
# Function to delete a record
def delete_record():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
if table_var.get() == "Gn_Cyan_Bawah":
c.execute("DELETE FROM Gn_Cyan_Bawah WHERE ID=?", (id_entry.get(),))
elif table_var.get() == "Sub_Gn_Cyan_Bawah":
c.execute("DELETE FROM Sub_Gn_Cyan_Bawah WHERE Sub_ID=?", (id_entry.get(),))
conn.commit()
conn.close()
clear_entries()
messagebox.showinfo("Success", "Record deleted successfully")
view_records()
# Function to update a record
def update_record():
conn = sqlite3.connect("DATAMUSIK.db")
c = conn.cursor()
if table_var.get() == "Gn_Cyan_Bawah":
c.execute('''UPDATE Gn_Cyan_Bawah SET
Level_R=?, Bass=?, Trebel_Biasa=?, Trebel_Aneh=?
WHERE ID=?''',
(level_entry.get(), bass_entry.get(), trebel_biasa_entry.get(), trebel_aneh_entry.get(), id_entry.get()))
elif table_var.get() == "Sub_Gn_Cyan_Bawah":
c.execute('''UPDATE Sub_Gn_Cyan_Bawah SET
Level_D=?, Bass=?, Trebel_Biasa=?, Trebel_Aneh=?
WHERE Sub_ID=?''',
(level_entry.get(), bass_entry.get(), trebel_biasa_entry.get(), trebel_aneh_entry.get(), id_entry.get()))
conn.commit()
conn.close()
clear_entries()
messagebox.showinfo("Success", "Record updated successfully")
view_records()
# Frame for input fields and buttons
input_frame = tk.Frame(root)
input_frame.pack(pady=10)
# Table selection dropdown
table_var = tk.StringVar(value="Gn_Cyan_Bawah")
table_dropdown = ttk.Combobox(input_frame, textvariable=table_var, values=["Gn_Cyan_Bawah", "Sub_Gn_Cyan_Bawah"], state="readonly")
table_dropdown.grid(row=0, column=1)
# Input fields
tk.Label(input_frame, text="ID/Sub_ID:").grid(row=1, column=0, padx=10, pady=5)
id_entry = tk.Entry(input_frame)
id_entry.grid(row=1, column=1, padx=10, pady=5)
tk.Label(input_frame, text="Level_R/Level_D:").grid(row=2, column=0, padx=10, pady=5)
level_entry = tk.Entry(input_frame)
level_entry.grid(row=2, column=1, padx=10, pady=5)
tk.Label(input_frame, text="Bass:").grid(row=3, column=0, padx=10, pady=5)
bass_entry = tk.Entry(input_frame)
bass_entry.grid(row=3, column=1, padx=10, pady=5)
tk.Label(input_frame, text="Trebel_Biasa:").grid(row=4, column=0, padx=10, pady=5)
trebel_biasa_entry = tk.Entry(input_frame)
trebel_biasa_entry.grid(row=4, column=1, padx=10, pady=5)
tk.Label(input_frame, text="Trebel_Aneh:").grid(row=5, column=0, padx=10, pady=5)
trebel_aneh_entry = tk.Entry(input_frame)
trebel_aneh_entry.grid(row=5, column=1, padx=10, pady=5)
# Buttons for CRUD operations
tk.Button(input_frame, text="Add Record", command=add_record).grid(row=6, column=0, pady=10)
tk.Button(input_frame, text="Update Record", command=update_record).grid(row=6, column=1, pady=10)
tk.Button(input_frame, text="Delete Record", command=delete_record).grid(row=7, column=0, pady=10)
tk.Button(input_frame, text="View Records", command=view_records).grid(row=7, column=1, pady=10)
# Initialize database
init_db()
# Start the main loop
root.mainloop()
```
**Penjelasan:**
1. **Menambah Record**: Menggunakan fungsi `add_record()`.
2. **Melihat Record**: Menggunakan fungsi `view_records()`, data ditampilkan menggunakan `ttk.Treeview`.
3. **Menghapus Record**: Menggunakan fungsi `delete_record()`.
4. **Memperbarui Record**: Menggunakan fungsi `update_record()`.
Pastikan untuk menjalankan dan menguji fungsionalitas ini sesuai dengan kebutuhan aplikasi Anda.
Pada bagian head_frame, saya membuat toggle_menu yang berisikan 3 buah tombol: toggle_btn1, toggle_btn2, toggle_btn3 untuk mengatur Progres, dan mode Naik atau Turun. Kemudian pada option_frame saya membuat 5 buah tombol: Gn_A_Trebel_btn untuk menampilkan halaman Gn_A_Trebel_Page, Gn_Biru_btn untuk menampilkan halaman Gn_Biru_Page, Gn_Cyan_Bawah_btn untuk menampilkan halaman Gn_Cyan_Bawah_Page, Gn_Cyan_Atas_btn untuk menampilkan halaman Gn_Cyan_Atas_Page, dan Gn_A_Bass_btn untuk menampilkan halaman Gn_A_Bass_Page, sehingga kode isi file berkembang menjadi berikut ini:
import tkinter as tk
from tkinter import ttk
import sqlite3
# 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)
# 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")
display_pages(progres)
# Function to display pages
def display_pages(progres):
for widget in content_frame.winfo_children():
widget.destroy()
for page in pages[progres - 1]:
if page == 'Gn_Cyan_Bawah':
Gn_Cyan_Bawah_page()
elif page == 'Gn_A_Trebel':
Gn_A_Trebel_page()
elif page == 'Gn_Biru':
Gn_Biru_page()
elif page == 'Gn_Cyan_Atas':
Gn_Cyan_Atas_page()
# 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']
# 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']
]
# 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
options_frame = tk.Frame(root, bg="#c3c3c3")
# 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()
#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=None)
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)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0, bg="blue", command=None)
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_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Bawah_btn.place(x=3, y=150)
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_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Atas_btn.place(x=3, y=200)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=205, 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=None)
Gn_A_Bass_btn.place(x=3, y=250)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=255, width=5, height=45)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# Initialize the application with the first progress setup
setup_turun_mode(1)
# Initialize database
init_db()
# Start the main loop
root.mainloop()
Tolong modifikasi kode, agar supaya susunan tombol di options_frame dari atas ke bawah, ketika mode Turun adalah Gn_Cyan_Bawah, Gn_A_Trebel. Sedangkan bila mode Naik, maka susunan tombol dari atas ke bawah adalah Gn_Cyan_Bawah, Gn_Cyan_Atas, Gn_Biru, Gn_A_Bass.
Untuk memodifikasi kode agar susunan tombol di `options_frame` berubah sesuai dengan mode yang dipilih (`Turun` atau `Naik`), kita perlu mengupdate bagian yang menampilkan tombol-tombol tersebut di `options_frame` berdasarkan mode yang aktif. Berikut adalah modifikasi kode yang telah disesuaikan:
```python
# 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.place(x=3, y=50)
Gn_Cyan_Bawah_indicate.place(x=2, y=55, width=5, height=45)
Gn_A_Trebel_btn.place(x=3, y=100)
Gn_A_Trebel_indicate.place(x=2, y=105, width=5, height=45)
else: # Mode "naik"
Gn_Cyan_Bawah_btn.place(x=3, y=50)
Gn_Cyan_Bawah_indicate.place(x=2, y=55, width=5, height=45)
Gn_Cyan_Atas_btn.place(x=3, y=100)
Gn_Cyan_Atas_indicate.place(x=2, y=105, width=5, height=45)
Gn_Biru_btn.place(x=3, y=150)
Gn_Biru_indicate.place(x=2, y=155, width=5, height=45)
Gn_A_Bass_btn.place(x=3, y=200)
Gn_A_Bass_indicate.place(x=2, y=205, width=5, height=45)
# 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")
indicator_labels[progres - 1].config(text="Turun")
else:
mode[progres - 1] = 'naik'
toggle_btns[progres - 1].config(text="☰ _ N")
indicator_labels[progres - 1].config(text="Naik")
update_options_frame(progres)
display_pages(progres)
# Call update_options_frame for the initial setup
update_options_frame(1)
# Options Frame
options_frame = tk.Frame(root, bg="#c3c3c3")
Gn_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=None)
Gn_A_Trebel_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0, bg="blue", command=None)
Gn_Biru_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_btn = tk.Button(options_frame, text="Gn_A_Bass", font=("bold", 7), fg="yellow", bd=0, bg="grey", command=None)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# Initialize the application with the first progress setup
setup_turun_mode(1)
# Initialize database
init_db()
# Start the main loop
root.mainloop()
```
### Penjelasan:
1. **Fungsi `update_options_frame(progres)`**:
- Mengatur ulang tampilan tombol di `options_frame` berdasarkan mode (`Turun` atau `Naik`) untuk setiap `progres`.
- Jika mode adalah `Turun`, maka susunan tombol adalah `Gn_Cyan_Bawah` di atas dan `Gn_A_Trebel` di bawah.
- Jika mode adalah `Naik`, maka susunan tombol adalah `Gn_Cyan_Bawah` di atas diikuti oleh `Gn_Cyan_Atas`, `Gn_Biru`, dan `Gn_A_Bass`.
2. **Pemanggilan `update_options_frame(progres)`**:
- Dipanggil setiap kali toggle mode berubah dan saat aplikasi pertama kali diinisialisasi untuk memastikan tampilan yang benar.
Dengan kode ini, tombol-tombol di `options_frame` akan berubah susunan sesuai dengan mode `Turun` atau `Naik` yang dipilih.
Kode kamu kurang tepat, kode yang sebenarnya adalah berikut ini:
import tkinter as tk
from tkinter import ttk
import sqlite3
# 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()
for page in pages[progres - 1]:
if page == 'Gn_Cyan_Bawah':
Gn_Cyan_Bawah_page()
elif page == 'Gn_A_Trebel':
Gn_A_Trebel_page()
elif page == 'Gn_Biru':
Gn_Biru_page()
elif page == 'Gn_Cyan_Atas':
Gn_Cyan_Atas_page()
# 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)
#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=None)
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)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0, bg="blue", command=None)
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_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Bawah_btn.place(x=3, y=150)
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_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Atas_btn.place(x=3, y=200)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=205, 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=None)
Gn_A_Bass_btn.place(x=3, y=250)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=255, width=5, height=45)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# 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=None)
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=None)
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=None)
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_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
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=205, width=5, height=45)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0,bg="blue", command=None)
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=None)
Gn_A_Bass_btn.place(x=3, y=250)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=255, 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 application with the first progress setup
setup_turun_mode(1)
# Initialize database
init_db()
# Start the main loop
root.mainloop()
Terima kasih telah memberikan kode yang sebenarnya. Kode yang kamu tulis sudah sangat lengkap dan rapi. Kode tersebut berfungsi untuk menginisialisasi database, membentuk antarmuka menggunakan `tkinter`, dan memungkinkan pengaturan halaman yang berbeda berdasarkan mode yang dipilih (naik atau turun). Apakah ada bagian spesifik dari kode ini yang ingin kamu diskusikan lebih lanjut atau apakah kamu butuh bantuan dengan implementasi tambahan lainnya?
Tolong modifikasi kode, agar supaya ketika saat pertama kali applikasi dijalankan (default) maka tombol yang tampil pada options_frame dengan susunan dari atas ke bawah adalah Gn_A_Trebel_btn, Gn_Biru_btn, Gn_Cyan_Bawah_btn, Gn_Cyan_Atas_btn, Gn_A_Bass_btn, dan teks yang tampil tertulis adalah "Halaman Default Gugus Nada". Kemudian ketika tombol di toggle_menu ditekan baik toggle_btn1, 2, atau 3 di mode Naik maka teks yang tampil tertulis adalah "Ini adalah Halaman Gn_Cyan_Bawah", begitu juga ketika mode Turun maka teks yang tampil tertulis sama adalah "Ini adalah Halaman Gn_Cyan_Bawah",
Tetapi ketika tombol di toggle_menu ditekan di mode Naik maka seharusnya tombol di options_frame yang tampil adalah Gn_Cyan_Bawah_btn, Gn_Cyan_Atas_btn, Gn_Biru_btn, Gn_A_Bass, sedangkan di mode Turun maka seharusnya tombol di options_frame yang tampil adalah Gn_Cyan_Bawah_btn, Gn_A_Trebel_btn.
Untuk memenuhi permintaanmu, berikut adalah modifikasi pada kode yang kamu berikan:
1. **Default Layout pada `options_frame`**: Tombol-tombol akan disusun sesuai urutan yang kamu inginkan saat aplikasi pertama kali dijalankan.
2. **Default Text pada `content_frame`**: Saat aplikasi pertama kali dijalankan, teks yang ditampilkan di `content_frame` adalah "Halaman Default Gugus Nada".
3. **Text Update**: Teks pada `content_frame` akan berubah menjadi "Ini adalah Halaman Gn_Cyan_Bawah" baik saat mode `Naik` atau `Turun` setelah tombol pada `toggle_menu` ditekan.
Berikut adalah kode modifikasinya:
```python
import tkinter as tk
from tkinter import ttk
import sqlite3
# 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_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Bass'],
['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Bawah', '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_Cyan_Atas', '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_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Bass']
indicator_labels[progres - 1].config(text="Naik")
update_options_frame(progres)
display_default_page()
# Function to display default page
def display_default_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_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 2:
pages[1] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Bass']
elif progres == 3:
pages[2] = ['Gn_A_Trebel', 'Gn_Biru', 'Gn_Cyan_Bawah', '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_Cyan_Atas', 'Gn_A_Trebel']
elif progres == 2:
pages[1] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_Cyan_Atas', 'Gn_A_Trebel']
elif progres == 3:
pages[2] = ['Gn_A_Bass', 'Gn_Biru', 'Gn_Cyan_Bawah', 'Gn_Cyan_Atas', '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)
# Fungsi tombol di options_frame
def update_options_frame(progres):
# Clear existing buttons
for widget in options_frame.winfo_children():
widget.destroy()
# Add buttons based on default mode
Gn_A_Trebel_btn = tk.Button(options_frame, text="Gn_A_Trebel", font=("bold", 6), fg="yellow", bd=0, bg="grey", command=None)
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", 6), fg="yellow", bd=0, bg="grey", command=None)
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", 6), fg="yellow", bd=0, bg="grey", command=None)
Gn_Cyan_Bawah_btn.place(x=3, y=100)
Gn_Cyan_Bawah_indicate = tk.Label(options_frame, text=" ", 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", 6), fg="yellow", bd=0, bg="grey", command=None)
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", 6), fg="yellow", bd=0, bg="grey", command=None)
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)
options_frame.pack(side=tk.TOP, fill=tk.X)
options_frame.pack_propagate(False)
options_frame.configure(height=250, width=200, bg="#c3c3c3")
# 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()
# Main Function
if __name__ == "__main__":
init_db()
init_default_page()
root.mainloop()
Penjelasan:update_options_frame(): Fungsi ini digunakan untuk memperbarui tata letak tombol di options_frame sesuai dengan mode saat ini (default adalah Progres-1 dengan urutan tombol yang sudah kamu tentukan).init_default_page(): Fungsi ini menginisialisasi halaman default saat aplikasi pertama kali dijalankan. Tombol-tombol pada options_frame diatur dengan urutan default, dan teks yang tampil pada content_frame adalah "Halaman Default Gugus Nada".Tombol Mode Naik/Turun: Setelah menekan tombol pada toggle_menu, teks pada content_frame akan berubah menjadi "Ini adalah Halaman Gn_Cyan_Bawah", tanpa mengubah susunan tombol di options_frame yang sudah ditentukan oleh mode (Naik atau Turun).Dengan modifikasi ini, aplikasi akan menampilkan halaman default saat pertama kali dijalankan, dan memungkinkan untuk mengganti teks pada content_frame ketika salah satu tombol toggle_menu ditekan.
Kode kamu kurang tepat, kode yang benar adalah berikut ini:
import tkinter as tk
from tkinter import ttk
import sqlite3
# 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_default_page()
# Function to display default page
def display_default_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)
#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=None)
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)
Gn_Biru_btn = tk.Button(options_frame, text="Gn_Biru", font=("bold", 7), fg="yellow", bd=0, bg="blue", command=None)
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_Cyan_Bawah_btn = tk.Button(options_frame, text="Gn_Cyan_Bawah", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Bawah_btn.place(x=3, y=150)
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_Cyan_Atas_btn = tk.Button(options_frame, text="Gn_Cyan_Atas", font=("bold", 5), fg="yellow", bd=0, bg="green", command=None)
Gn_Cyan_Atas_btn.place(x=3, y=200)
Gn_Cyan_Atas_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_Cyan_Atas_indicate.place(x=2, y=205, 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=None)
Gn_A_Bass_btn.place(x=3, y=250)
Gn_A_Bass_indicate = tk.Label(options_frame, text=" ", bg="#c3c3c3")
Gn_A_Bass_indicate.place(x=2, y=255, width=5, height=45)
options_frame.pack(side=tk.LEFT)
options_frame.pack_propagate(False)
options_frame.configure(width=170, height=300)
# 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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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=None)
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()
Terima kasih telah berbagi kode yang sudah diperbaiki. Kode ini terlihat lebih rapi dan fungsional. Jika ada yang ingin diubah atau dikembangkan lebih lanjut, silakan beri tahu saya!
Untuk menghindari duplikasi elemen dan fungsi tombol di options_frame, kemudian pada kode saya tambahkan fungsi untuk membuka dan 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, agar supaya ketika tombol di options_frame ditekan maka akan membuka file yang sesuai terkait, sehingga kodenya menjadi 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)
# Fungsi untuk membuka file CRUD_Gn_Cyan_Atas(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()
Kode yang Anda berikan sudah cukup baik dalam mengorganisir elemen dan menghindari duplikasi, serta menambahkan fungsi untuk membuka dan menjalankan file lain seperti `CRUD_Gn_A_Trebel.py`, `CRUD_Gn_Biru.py`, dan lainnya. Berikut adalah beberapa poin yang mungkin perlu diperhatikan:
1. **Pemanggilan `exec()`**: Meskipun `exec()` dapat digunakan untuk mengeksekusi file Python secara langsung, penggunaannya harus sangat hati-hati karena berpotensi mengeksekusi kode yang tidak aman. Anda perlu memastikan bahwa kode dalam file-file tersebut aman dan tidak berisi sesuatu yang dapat membahayakan sistem.
2. **`messagebox`**: Anda menggunakan `messagebox.showinfo` dan `messagebox.showerror` untuk menampilkan pesan setelah mengeksekusi file. Pastikan Anda sudah mengimpor modul `messagebox` dari tkinter agar fungsi ini bisa dijalankan tanpa error.
3. **Organisasi Fungsi**: Anda telah mengelompokkan fungsi-fungsi untuk menjalankan berbagai file dengan baik. Untuk memperbaiki kode lebih lanjut, mungkin Anda bisa mempertimbangkan untuk membuat fungsi umum yang dapat menjalankan file berdasarkan namanya sehingga Anda tidak perlu menduplikasi fungsi serupa beberapa kali.
4. **Error Handling**: Error handling sudah diterapkan dengan baik pada fungsi `run_*_file()`. Namun, jika ada banyak file yang berbeda, Anda bisa mempertimbangkan untuk menambahkan lebih banyak detail dalam penanganan error agar dapat lebih spesifik dalam mengidentifikasi masalah.
5. **Tampilan UI**: UI sudah diatur dengan baik untuk mode naik dan turun. Anda juga bisa menambahkan komentar untuk menjelaskan logika di balik pengaturan mode dan halaman, agar lebih mudah dipahami oleh orang lain yang mungkin bekerja dengan kode ini di masa mendatang.
Apakah ada bagian lain yang perlu diperbaiki atau fitur tambahan yang ingin Anda implementasikan?
Kemudian pada kode saya tambahkan bottom_frame dengan posisinya TOP, di dalam bottom_frame ini saya buat label, (gugusan_label), tombol (crud_btn) dan fungsi untuk membuka data gn_cyan_bawah pada file DATA_Gn_Cyan_Bawah(gabung).py untuk bisa melakukan CRUD pada tabel Gn_Cyan_Bawah, dan tabel Sub_Gn_Cyan_Bawah, namun content_frame harus dibersihkan terlebih dahulu, sehingga kode isi file CRUD_Gn_Cyan_Bawah(gabung).PT menjadi 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)
# 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", co
mmand=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()
Kode yang telah Anda buat menambahkan frame bawah (`bottom_frame`) dengan label dan tombol, serta fungsi untuk membuka dan mengeksekusi file Python lain, yaitu `DATA_Gn_Cyan_Bawah(gabung).py`, agar bisa melakukan operasi CRUD pada tabel `Gn_Cyan_Bawah` dan `Sub_Gn_Cyan_Bawah`. Ini adalah langkah yang bagus untuk memisahkan logika dan menjaga aplikasi tetap modular.
Namun, beberapa hal perlu diperhatikan untuk memastikan bahwa fungsionalitasnya berjalan dengan baik:
1. **Penggunaan `exec` untuk Menjalankan File Python**: Fungsi `exec` yang digunakan untuk menjalankan file lain dengan membuka dan mengeksekusi isi file Python secara langsung dapat berpotensi menyebabkan masalah keamanan jika file tersebut tidak dapat dipercaya. Sebaiknya, jika memungkinkan, panggil fungsi dari file tersebut secara langsung setelah diimpor, daripada membaca dan mengeksekusi isi file.
2. **Memastikan Konten Bersih Sebelum Menampilkan Halaman Baru**: Anda sudah menambahkan `clear_content_frame` yang tepat untuk memastikan bahwa frame `content_frame` bersih sebelum menampilkan konten baru.
3. **Penggunaan Label dan Tombol pada `bottom_frame`**: Label `gugusan_label` dan tombol `crud_btn` di `bottom_frame` berfungsi dengan baik untuk menunjukkan halaman aktif (`Gn_Cyan_Bawah`) dan menyediakan akses langsung ke file data terkait.
4. **Manajemen Halaman Aktif**: Variabel `active_page` dapat digunakan untuk menyimpan halaman yang sedang aktif agar lebih mudah dalam manajemen navigasi.
5. **Modularisasi Lebih Lanjut**: Jika kode ini akan bertambah besar, mungkin perlu dipertimbangkan untuk memecah kode ke dalam beberapa modul Python untuk menjaga keterbacaan dan pemeliharaan.
6. **Logging dan Debugging**: Penggunaan `logging` adalah ide bagus untuk melacak masalah yang mungkin terjadi selama eksekusi.
Jika kode ini dijalankan, pastikan bahwa fungsi-fungsi seperti `update_options_frame` dipanggil pada awal aplikasi untuk mengatur tampilan awal, dan pengaturan awal halaman (`init_default_page`) dijalankan untuk memberikan antarmuka pengguna yang konsisten.
Jika Anda memiliki pertanyaan lebih lanjut atau ingin menambahkan fungsionalitas lain, jangan ragu untuk bertanya!
Untuk keamanan isi file saat penggunaan "Exec", daripada membuka buka file python lain, membaca dan mengeksekusi isi file python lain, seperti yang kamu katakan memang lebih baik dengan cara memanggil fungsi dari file tersebut secara langsung setelah diimpor,. Alternatif lain bisakah pada kode yang saya buat tersebut dimunculkan dua halaman, halaman satu untuk mengelola elemen dan fungsi DATA_Gn_Cyan_Bawah(gabung).py, dan halaman dua untuk mengelola elemen dan fungsi CRUD_Gn_Cyan_Bawah(gabung).py ?, agar supaya lebih memudahkan pengguna pergi dari halaman satu ke halaman dua, atau dari halaman dua ke halaman satu.
Untuk memunculkan dua halaman yang dapat digunakan untuk mengelola elemen dan fungsi dari file `DATA_Gn_Cyan_Bawah(gabung).py` dan `CRUD_Gn_Cyan_Bawah(gabung).py`, kita bisa menggunakan `tkinter` untuk membuat antarmuka dengan dua tab atau dua frame yang bisa dipilih oleh pengguna. Berikut ini adalah contoh implementasi untuk mencapai tujuan tersebut:
### Contoh Implementasi:
1. **Impor Modul yang Dibutuhkan:**
```python
import tkinter as tk
from tkinter import ttk
# Asumsi fungsi-fungsi dari file `DATA_Gn_Cyan_Bawah(gabung).py` dan `CRUD_Gn_Cyan_Bawah(gabung).py` diimpor
# Misalnya:
# from DATA_Gn_Cyan_Bawah import fungsi_data
# from CRUD_Gn_Cyan_Bawah import fungsi_crud
```
2. **Buat Fungsi untuk Halaman:**
```python
def halaman_data(root):
frame = tk.Frame(root)
# Tambahkan elemen dan fungsi yang berkaitan dengan DATA_Gn_Cyan_Bawah(gabung).py di sini
label = tk.Label(frame, text="Halaman Pengelolaan DATA_Gn_Cyan_Bawah(gabung)")
label.pack(pady=10)
# Contoh tombol yang memanggil fungsi dari DATA_Gn_Cyan_Bawah
button = tk.Button(frame, text="Jalankan Fungsi DATA", command=lambda: fungsi_data())
button.pack(pady=10)
return frame
def halaman_crud(root):
frame = tk.Frame(root)
# Tambahkan elemen dan fungsi yang berkaitan dengan CRUD_Gn_Cyan_Bawah(gabung).py di sini
label = tk.Label(frame, text="Halaman Pengelolaan CRUD_Gn_Cyan_Bawah(gabung)")
label.pack(pady=10)
# Contoh tombol yang memanggil fungsi dari CRUD_Gn_Cyan_Bawah
button = tk.Button(frame, text="Jalankan Fungsi CRUD", command=lambda: fungsi_crud())
button.pack(pady=10)
return frame
```
3. **Buat GUI Utama dengan Tab:**
```python
def main():
root = tk.Tk()
root.title("Pengelolaan DATA dan CRUD Gn_Cyan_Bawah")
tab_control = ttk.Notebook(root)
# Tambahkan halaman satu untuk DATA_Gn_Cyan_Bawah
tab1 = halaman_data(tab_control)
tab_control.add(tab1, text="DATA Gn_Cyan_Bawah")
# Tambahkan halaman dua untuk CRUD_Gn_Cyan_Bawah
tab2 = halaman_crud(tab_control)
tab_control.add(tab2, text="CRUD Gn_Cyan_Bawah")
tab_control.pack(expand=1, fill="both")
root.mainloop()
if __name__ == "__main__":
main()
```
### Penjelasan:
- **`ttk.Notebook`:** Digunakan untuk membuat tab di dalam antarmuka `tkinter`. Setiap tab berisi halaman yang berbeda.
- **`halaman_data` dan `halaman_crud`:** Fungsi-fungsi ini membuat frame dengan elemen dan fungsi yang sesuai dengan halaman yang diinginkan.
- **Navigasi Antar Halaman:** Pengguna bisa berpindah antara halaman dengan mudah menggunakan tab di atas antarmuka.
Dengan struktur ini, Anda memiliki antarmuka GUI yang memungkinkan pengguna untuk berpindah antara dua halaman berbeda, satu untuk `DATA_Gn_Cyan_Bawah(gabung).py` dan satu lagi untuk `CRUD_Gn_Cyan_Bawah(gabung).py`, tanpa perlu menggunakan `exec` atau membuka file python lainnya. Hal ini akan membuat aplikasi lebih aman dan terstruktur.
Bersambung ke :
Komentar
Posting Komentar
This Message