FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_Biru DARI DATABASE DATAMUSIK.db, DAN MENGATUR BASS/TREBEL SESUAI Level_gn, Progres, dan Mode. (Part-2)
FUNGSI UNTUK MENGAMBIL DATA TABEL Gn_Biru DARI DATABASE DATAMUSIK.db, DAN MENGATUR BASS/TREBEL SESUAI Level_gn, Progres, dan Mode. (Part-2)
Tolong perbaiki kode berikut pada bagian pengaturan validate level_gn, sebab muncul pesan error':
Exception in Tkinter callback
Traceback (most recent call last):
File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.11/tkinter/__init__.py", line 1948, in __call__
return self.func(*args)
^^^^^^^^^^^^^^^^
File "/storage/emulated/0/NadaPL/KGNS-NPL/coba gn biru Bass trebel1.py", line 20, in validate_level_gn
# Tampilkan data ke dalam entry
^^^^^^^^^^
NameError: name 'messagebox' is not
defined
Berikut kode yang butuh diperbaiki:
import tkinter as tk
from tkinter import ttk
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn == 1:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 2:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 3:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 4:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 5:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 6:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 7:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 8:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 9:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 10:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 11:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 12:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_trebel_progres2_naik(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_trebel_progres2_naik(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_trebel_progres2_turun(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_trebel_progres2_turun(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_trebel_progres3_naik(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_trebel_progres3_naik(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_trebel_progres3_turun(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_trebel_progres3_turun(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi adjust untuk berbagai progres dan mode
def adjust_trebel_progres2_naik(trebel_value, new_id_value, pengurang):
return adjust_trebel(trebel_value, new_id_value, pengurang, -2)
def adjust_trebel_progres2_turun(trebel_value, new_id_value, pengurang):
return adjust_trebel(trebel_value, new_id_value, pengurang, -2)
def adjust_trebel_progres3_naik(trebel_value, new_id_value, pengurang):
return adjust_trebel(trebel_value, new_id_value, pengurang, -3)
def adjust_trebel_progres3_turun(trebel_value, new_id_value, pengurang):
return adjust_trebel(trebel_value, new_id_value, pengurang, -3)
# Fungsi umum untuk penyesuaian trebel
def adjust_trebel(trebel_value, new_id_value, pengurang, adjustment_value):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) + adjustment_value) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
# Fungsi untuk mengambil data Trebel dari ID lain
def ambil_data_trebel(id, target_id, kolom):
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = f"SELECT {kolom} FROM Gn_Biru WHERE ID = ?"
cursor.execute(query, (target_id,))
data = cursor.fetchone()
conn.close()
return data[0]
# Fungsi untuk memastikan urutan Level_Gn berdsarkan ID dan kolom
def level_gn(table_name):
try:
level_gn_selected = int(entry_level_gn.get()) # Mendapatkan Level_Gn dari input
# Variabel awal untuk ID, kolom, dan modifikasi angka
id_selected = None
kolom_selected = None
modifikasi_angka = 0 # Default 0, tidak ada pengurangan
if table_name == 'Gn_Biru':
# Logika untuk tabel Gn_Biru
if level_gn_selected == 1:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 4:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 7:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 10:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 2:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 5:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 8:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 11:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 3:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 6:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 9:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 12:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")
return None, None
else:
messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")
return None, None, None
else:
messagebox.showerror("Error", "Nama tabel tidak valid!")
return None, None, None
# Menyisipkan ID dan kolom yang dipilih ke dalam entry box
entry_id.delete(0, 'end')
entry_id.insert(0, str(id_selected))
entry_kolom.delete(0, 'end')
entry_kolom.insert(0, kolom_selected)
if table_name == 'Gn_Biru':
return id_selected, kolom_selected
except ValueError:
messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")
return None, None, None
# Labels dan Entries
label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")
label_level_gn_selected.grid(row=1, column=0, padx=5, pady=7)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=7)
label_id_selected = tk.Label(frame_top, text="ID:")
label_id_selected.grid(row=2, column=0, padx=5, pady=7)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=5, pady=7)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=5, pady=7)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var, values=(1, 2, 3))
progres_combobox.grid(row=3, column=1, padx=5, pady=7)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=5, pady=7)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_combobox.grid(row=4, column=1, padx=5, pady=7)
# Frame untuk hasil input
frame_bottom = tk.Frame(root)
frame_bottom.pack(pady=10)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=5, column=1, padx=15, pady=5)
separator = ttk.Separator(frame_bottom, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Labels dan Entry untuk Bass dan Trebel
labels = ["Bass_1", "Trebel_1", "Bass_2", "Trebel_2", "Bass_3"]
entries = []
for i, label in enumerate(labels, start=7):
lbl = tk.Labe
l(frame_bottom, text=label)
lbl.grid(row=7, column=i-6, padx=5, pady=5)
entry = tk.Entry(frame_bottom, bg="white")
entry.grid(row=8, column=i-6, padx=5, pady=5)
entries.append(entry)
entry_bass_1, entry_trebel_1, entry_bass_2, entry_trebel_2, entry_bass_3 = entries
root.mainloop()
Error yang terjadi di kode Anda adalah karena `messagebox` belum diimpor. Anda menggunakan `messagebox.showinfo()` dan `messagebox.showerror()`, tetapi `messagebox` belum dideklarasikan sebelumnya. Untuk memperbaiki masalah ini, tambahkan impor `messagebox` dari modul `tkinter`.
Berikut adalah kode yang telah diperbaiki dengan menambahkan impor `messagebox` dan beberapa perbaikan lain jika diperlukan:
```python
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox # Tambahkan ini untuk mengimpor messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn == 1:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 2:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 3:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 4:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 5:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 6:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 7:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 8:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 9:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 10:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 11:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 12:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_trebel_progres2_naik(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_trebel_progres2_naik(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_trebel_progres2_turun(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_trebel_progres2_turun(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_trebel_progres3_naik(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_trebel_progres3_naik(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_trebel_progres3_turun(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_trebel_progres3_turun(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi-fungsi lain (adjust_trebel, ambil_data_trebel, dll.) tetap sama seperti sebelumnya.
```
Perubahan utama adalah impor `messagebox` dari `tkinter`. Jika pesan kesalahan lain muncul, pastikan untuk mengecek apakah setiap variabel dan fungsi sudah diinisialisasi dengan benar.
Maksud. saya, Beberapa kode berikut ini: def get_data_by_id(id): # Contoh data dari tabel gn_biru data_bass_trebel = { 1: {'Bass': '3456', 'Trebel': '7890'}, # Data ID 1 2: {'Bass': '2345', 'Trebel': '6789'}, # Data ID 2 3: {'Bass': '1234', 'Trebel': '5678'} # Data ID 3 }return data_bass_trebel.get(id)def reduce_digits(data, reduction): bass = data['Bass'] trebel = data['Trebel']# Kurangi setiap digit
reduced_bass = ''.join([str(max(int(digit) - reduction, 0)) for digit in bass])
reduced_trebel = ''.join([str(max(int(digit) - reduction, 0)) for digit in trebel])
return {'Bass': reduced_bass, 'Trebel': reduced_trebel}def apply_level_gn_logic(level_gn): # Aturan level_gn sesuai dengan ID level_gn_to_id_map = { 1: 3, 2: 2, 3: 1, # Level_gn 1-3 (ID asli) 4: 3, 5: 2, 6: 1, # Level_gn 4-6 (Kurangi 1) 7: 3, 8: 2, 9: 1, # Level_gn 7-9 (Kurangi 2) 10: 3, 11: 2, 12: 1 # Level_gn 10-12 (Kurangi 3) }# Tentukan pengurangan digit berdasarkan level_gn
reduction_map = {
1: 0, 2: 0, 3: 0, # Level_gn 1-3 (tidak ada pengurangan)
4: 1, 5: 1, 6: 1, # Level_gn 4-6 (kurangi 1)
7: 2, 8: 2, 9: 2, # Level_gn 7-9 (kurangi 2)
10: 3, 11: 3, 12: 3 # Level_gn 10-12 (kurangi 3)
}
# Ambil ID berdasarkan level_gn
id = level_gn_to_id_map.get(level_gn)
if id is None:
return None # Jika level_gn tidak valid
# Ambil data dari tabel berdasarkan ID
data = get_data_by_id(id)
# Kurangi data sesuai aturan
reduction = reduction_map.get(level_gn, 0)
modified_data = reduce_digits(data, reduction)
return modified_datadef on_level_gn_selected(event): level_gn = int(entry_level_gn.get())modified_data = apply_level_gn_logic(level_gn)
if modified_data:
# Tampilkan hasil modifikasi
print(f"Level_gn {level_gn}: Bass = {modified_data['Bass']}, Trebel = {modified_data['Trebel']}")
else:
print("Data tidak ditemukan.")Entry untuk level_gn dengan event bindingentry_level_gn = ttk.Combobox(frame, values=list(range(1, 13)), state="readonly") entry_level_gn.grid(row=1, column=0) entry_level_gn.bind("<>", on_level_gn_selected)Tolong ditambahkan ke kode yang ini:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn == 1:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 2:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 3:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 4:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 5:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 6:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 7:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 8:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 9:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
elif level_gn == 10:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn == 11:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn == 12:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi adjust untuk berbagai progres dan mode
def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def ambil_data_trebel(id, target_id, kolom):
# Fungsi untuk mengambil data Trebel dari ID yang berbeda
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = f"""
SELECT {kolom}
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (target_id,))
data = cursor.fetchone()
conn.close()
return data[0]
# Letakkan entry dan combobox di bawah
label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")
label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=0, pady=7)
label_id_selected = tk.Label(frame_top, text="ID:")
label_id_selected.grid(row=2, column=0, padx=0, pady=7)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=0, pady=7)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=0, pady=7)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=0, pady=7)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=0, pady=7)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_combobox.grid(row=4, column=1, padx=0, pady=7)
# Fungsi untuk memastikan urutan Level_Gn berdsarkan ID dan kolom
def level_gn(table_name):
try:
level_gn_selected = int(entry_level_gn.get()) # Mendapatkan Level_Gn dari input
# Variabel awal untuk ID, kolom, dan modifikasi angka
id_selected = None
kolom_selected = None
modifikasi_angka = 0 # Default 0, tidak ada pengurangan
if table_name == 'Gn_Biru':
# Logika untuk tabel Gn_Biru
if level_gn_selected == 1:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 4:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 7:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 10:
id_selected = 3
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 2:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 5:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 8:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 11:
id_selected = 2
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 3:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 6:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 9:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
elif level_gn_selected == 12:
id_selected = 1
kolom_selected = 'Bass_1' or 'Trebel_1' or 'Bass_2' or 'Trebel_2' or 'Bass_3'
messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")
return None, None
else:
messagebox.showerror("Error", "Level_Gn harus antara 1 hingga 12.")
return None, None, None
else:
messagebox.showerror("Error", "Nama tabel tidak valid!")
return None, None, None
# Menyisipkan ID dan kolom yang dipilih ke dalam entry box
entry_id.delete(0, 'end')
entry_id.insert(0, str(id_selected))
entry_kolom.delete(0, 'end')
entry_kolom.insert(0, kolom_selected)
if table_name == 'Gn_Biru':
return id_selected, kolom_selected
except ValueError:
messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")
return None, None, None
# Frame untuk hasil adaptasi
frame_bottom = tk.Frame(root)
frame_bottom.pack(pady=10)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_bottom, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Labels dan Entry untuk Bass dan Trebel
gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")
gugusan_nada_bass_1_label.grid(row=7, column=1, padx=5, pady=5)
gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")
gugusan_nada_trebel_1_label.grid(row=7, column=2, padx=5, pady=5)
gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")
gugusan_nada_bass_2_label.grid(row=7, column=3, padx=5, pady=5)
gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")
gugusan_nada_trebel_2_label.grid(row=7, column=4, padx=5, pady=5)
gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")
gugusan_nada_bass_3_label.grid(row=7, column=5, padx=5, pady=5)
# Entry box untuk Bass dan Trebel
entry_bass_1 = tk.Entry(frame_bottom, bg="white")
entry_bass_1.grid(row=8, column=1, padx=5, pady=5)
entry_trebel_1 = tk.Entry(frame_bottom, bg="white")
entry_trebel_1.grid(row=8, column=2, padx=5, pady=5)
entry_bass_2 = tk.Entry(frame_bottom, bg="white")
entry_bass_2.grid(row=8, column=3, padx=5, pady=5)
entry_trebel_2 = tk.Entry(frame_bottom, bg="white")
entry_trebel_2.grid(row=8, column=4, padx=5, pady=5)
entry_bass_3 = tk.Entry(frame_bottom, bg="white")
entry_bass_3.grid(row=8, column=5, padx=5, pady=5)
root.mainloop()
Untuk menambahkan kode `apply_level_gn_logic` ke dalam kode tkinter Anda, kita perlu mengintegrasikan fungsionalitas yang sudah Anda sebutkan sebelumnya, yaitu logika Level_Gn, ke dalam fungsi event binding dan sistem entry tkinter yang sudah Anda buat. Berikut adalah integrasi tersebut:
### Modifikasi Kode:
1. **Panggil `apply_level_gn_logic` setelah pemilihan Level_Gn.**
2. **Tampilkan hasil `Bass` dan `Trebel` di EntryBox.**
3. **Event binding untuk `entry_level_gn` akan memicu logika Level_Gn dan menampilkan hasilnya.**
Berikut adalah kode yang sudah diperbarui dengan integrasi `apply_level_gn_logic`:
```python
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk mendapatkan data Bass dan Trebel dari ID
def get_data_by_id(id):
# Contoh data dari tabel gn_biru
data_bass_trebel = {
1: {'Bass': '3456', 'Trebel': '7890'}, # Data ID 1
2: {'Bass': '2345', 'Trebel': '6789'}, # Data ID 2
3: {'Bass': '1234', 'Trebel': '5678'} # Data ID 3
}
return data_bass_trebel.get(id)
# Fungsi untuk mengurangi setiap digit dari data Bass dan Trebel
def reduce_digits(data, reduction):
bass = data['Bass']
trebel = data['Trebel']
reduced_bass = ''.join([str(max(int(digit) - reduction, 0)) for digit in bass])
reduced_trebel = ''.join([str(max(int(digit) - reduction, 0)) for digit in trebel])
return {'Bass': reduced_bass, 'Trebel': reduced_trebel}
# Fungsi untuk logika Level_Gn
def apply_level_gn_logic(level_gn):
level_gn_to_id_map = {
1: 3, 2: 2, 3: 1, # Level_gn 1-3 (ID asli)
4: 3, 5: 2, 6: 1, # Level_gn 4-6 (Kurangi 1)
7: 3, 8: 2, 9: 1, # Level_gn 7-9 (Kurangi 2)
10: 3, 11: 2, 12: 1 # Level_gn 10-12 (Kurangi 3)
}
# Tentukan pengurangan digit berdasarkan level_gn
reduction_map = {
1: 0, 2: 0, 3: 0, # Level_gn 1-3 (tidak ada pengurangan)
4: 1, 5: 1, 6: 1, # Level_gn 4-6 (kurangi 1)
7: 2, 8: 2, 9: 2, # Level_gn 7-9 (kurangi 2)
10: 3, 11: 3, 12: 3 # Level_gn 10-12 (kurangi 3)
}
# Ambil ID berdasarkan level_gn
id = level_gn_to_id_map.get(level_gn)
if id is None:
return None # Jika level_gn tidak valid
# Ambil data dari tabel berdasarkan ID
data = get_data_by_id(id)
# Kurangi data sesuai aturan
reduction = reduction_map.get(level_gn, 0)
modified_data = reduce_digits(data, reduction)
return modified_data
# Fungsi untuk event binding pada pemilihan Level_Gn
def on_level_gn_selected(event):
try:
level_gn = int(entry_level_gn.get())
modified_data = apply_level_gn_logic(level_gn)
if modified_data:
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, modified_data['Bass'])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, modified_data['Trebel'])
else:
messagebox.showerror("Error", "Data tidak ditemukan untuk Level Gn yang dipilih.")
except ValueError:
messagebox.showerror("Error", "Masukkan Level Gn yang valid.")
# Entry untuk level_gn dengan event binding
entry_level_gn = ttk.Combobox(frame_top, values=list(range(1, 13)), state="readonly")
entry_level_gn.grid(row=1, column=0)
entry_level_gn.bind("<<ComboboxSelected>>", on_level_gn_selected)
# Tambahkan entry untuk Bass dan Trebel
entry_bass_1 = tk.Entry(frame_top)
entry_bass_1.grid(row=2, column=0, padx=5, pady=5)
entry_trebel_1 = tk.Entry(frame_top)
entry_trebel_1.grid(row=2, column=1, padx=5, pady=5)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=lambda: on_level_gn_selected(None))
validate_button.grid(row=1, column=2, padx=5, pady=5)
root.mainloop()
```
### Penjelasan:
1. **Logika Level_Gn**: Saat Level_Gn dipilih dari `Combobox`, fungsi `on_level_gn_selected` akan dipanggil. Ini akan mengakses logika Level_Gn (`apply_level_gn_logic`) dan menampilkan hasilnya pada EntryBox (`entry_bass_1` dan `entry_trebel_1`).
2. **Event Binding**: `entry_level_gn.bind("<<ComboboxSelected>>", on_level_gn_selected)` memastikan bahwa ketika pengguna memilih Level_Gn dari `Combobox`, data yang sesuai akan otomatis ditampilkan.
3. **Validasi**: Jika data Level_Gn tidak valid atau kosong, maka akan muncul pesan error.
Dengan kode ini, aplikasi Anda akan dapat secara otomatis mengambil dan memodifikasi data sesuai dengan Level_Gn yang dipilih, lalu menampilkannya di EntryBox.
Maksud saya kode yang ini, perbaiki kode agar supaya:
pada level_gn 1 maka data Bass dan Trebel yang di id 3 akan mengalami tanpa pengurangan digit data. Pada level_gn 4 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 1. Pada level_gn 7 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 2. Pada level_gn 10 maka data Bass dan Trebel yang di id 3 akan mengalami setiap digit dikurang 3. Kemudian pada level_gn 2 maka data Bass dan Trebel yang di id 2 akan mengalami tanpa pengurangan digit data. Pada level_gn 5 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 1. Pada level_gn 8 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 2. Pada level_gn 11 maka data Bass dan Trebel yang di id 2 akan mengalami setiap digit dikurang 3. Kemudian pada level_gn 3 maka data Bass dan Trebel yang di id 1 akan mengalami tanpa pengurangan digit data. Pada level_gn 6 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 1. Pada level_gn 9 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 2. Pada level_gn 12 maka data Bass dan Trebel yang di id 1 akan mengalami setiap digit dikurang 3.
Berikut kode yang butuh diperbaiki:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn in [1, 4, 7, 10]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn in [2, 5, 8, 11]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn in [3, 6, 9, 12]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi adjust untuk berbagai progres dan mode
def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def ambil_data_trebel(id, target_id, kolom):
# Fungsi untuk mengambil data Trebel dari ID yang berbeda
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = f"""
SELECT {kolom}
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (target_id,))
data = cursor.fetchone()
conn.close()
return data[0]
# Letakkan entry dan combobox di bawah
label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")
label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=0, pady=7)
label_id_selected = tk.Label(frame_top, text="ID:")
label_id_selected.grid(row=2, column=0, padx=0, pady=7)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=0, pady=7)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=0, pady=7)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=0, pady=7)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=0, pady=7)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_combobox.grid(row=4, column=1, padx=0, pady=7)
# Frame untuk hasil adaptasi
frame_bottom = tk.Frame(root)
frame_bottom.pack(pady=10)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_bottom, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Labels dan Entry untuk Bass dan Trebel
gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")
gugusan_nada_bass_1_label.grid(row=7, column=1, padx=5, pady=5)
gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")
gugusan_nada_trebel_1_label.grid(row=7, column=2, padx=5, pady=5)
gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")
gugusan_nada_bass_2_label.grid(row=7, column=3, padx=5, pady=5)
gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")
gugusan_nada_trebel_2_label.grid(row=7, column=4, padx=5, pady=5)
gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")
gugusan_nada_bass_3_label.grid(row=7, column=5, padx=5, pady=5)
# Entry box untuk Bass dan Trebel
entry_bass_1 = tk.Entry(frame_bottom, bg="white")
entry_bass_1.grid(row=8, column=1, padx=5, pady=5)
entry_trebel_1 = tk.Entry(frame_bottom, bg="white")
entry_trebel_1.grid(row=8, column=2, padx=5, pady=5)
entry_bass_2 = tk.Entry(frame_bottom, bg="white")
entry_bass_2.grid(row=8, column=3, padx=5, pady=5)
entry_trebel_2 = tk.Entry(frame_bottom, bg="white")
entry_trebel_2.grid(row=8, column=4, padx=5, pady=5)
entry_bass_3 = tk.Entry(frame_bottom, bg="white")
entry_bass_3.grid(row=8, column=5, padx=5, pady=5)
root.mainloop()
Untuk memenuhi kebutuhan Anda yang menginginkan pengurangan digit pada data Bass dan Trebel sesuai dengan Level Gn yang berbeda, berikut adalah penjelasan modifikasi yang akan saya lakukan pada kode Anda:
1. **Pada Level Gn 1, 2, 3:**
- Tidak ada pengurangan digit pada data Bass dan Trebel untuk ID yang relevan (3, 2, 1).
2. **Pada Level Gn 4, 5, 6:**
- Data Bass dan Trebel akan mengalami pengurangan 1 digit untuk ID yang relevan.
3. **Pada Level Gn 7, 8, 9:**
- Data Bass dan Trebel akan mengalami pengurangan 2 digit untuk ID yang relevan.
4. **Pada Level Gn 10, 11, 12:**
- Data Bass dan Trebel akan mengalami pengurangan 3 digit untuk ID yang relevan.
Kode yang dimodifikasi untuk mencakup aturan ini:
```python
def level_gn(id, progres, mode, level_gn_selected):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Tentukan pengurang berdasarkan level_gn
pengurang = 0
if level_gn_selected in [4, 5, 6]:
pengurang = 1
elif level_gn_selected in [7, 8, 9]:
pengurang = 2
elif level_gn_selected in [10, 11, 12]:
pengurang = 3
# Fungsi untuk mengurangi setiap digit pada bass dan trebel
def adjust_value(value, pengurang):
if value.isdigit():
adjusted_value = ''.join(str(int(digit) - pengurang) if digit.isdigit() else digit for digit in value)
return adjusted_value
return value
# Pengurangan pada Bass dan Trebel tergantung pada Level Gn
if level_gn_selected in [1, 4, 7, 10]:
bass_1 = adjust_value(bass_1, pengurang)
trebel_1 = adjust_value(data[1], pengurang)
if level_gn_selected in [2, 5, 8, 11]:
bass_2 = adjust_value(bass_2, pengurang)
trebel_2 = adjust_value(data[3], pengurang)
if level_gn_selected in [3, 6, 9, 12]:
bass_3 = adjust_value(bass_3, pengurang)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
```
Penjelasan:
- **Fungsi `adjust_value`**: Mengambil setiap digit dalam string dan mengurangi nilainya sesuai dengan `pengurang` yang dihitung berdasarkan Level Gn.
- **Logika Level Gn**: Setiap Level Gn dari 1 hingga 12 akan mengatur ID yang relevan dan menentukan apakah akan mengurangi nilai digit atau tidak.
Dengan modifikasi ini, aturan pengurangan digit berdasarkan Level Gn akan diterapkan secara otomatis pada data Bass dan Trebel sesuai dengan ID yang telah diatur.
Tolong applikasikan kode berikut:
def level_gn(id, progres, mode, level_gn_selected):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Tentukan pengurang berdasarkan level_gn
pengurang = 0
if level_gn_selected in [4, 5, 6]:
pengurang = 1
elif level_gn_selected in [7, 8, 9]:
pengurang = 2
elif level_gn_selected in [10, 11, 12]:
pengurang = 3
# Fungsi untuk mengurangi setiap digit pada bass dan trebel
def adjust_value(value, pengurang):
if value.isdigit():
adjusted_value = ''.join(str(int(digit) - pengurang) if digit.isdigit() else digit for digit in value)
return adjusted_value
return value
# Pengurangan pada Bass dan Trebel tergantung pada Level Gn
if level_gn_selected in [1, 4, 7, 10]:
bass_1 = adjust_value(bass_1, pengurang)
trebel_1 = adjust_value(data[1], pengurang)
if level_gn_selected in [2, 5, 8, 11]:
bass_2 = adjust_value(bass_2, pengurang)
trebel_2 = adjust_value(data[3], pengurang)
if level_gn_selected in [3, 6, 9, 12]:
bass_3 = adjust_value(bass_3, pengurang)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
Terhadap kode yang ini:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn in [1, 4, 7, 10]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn in [2, 5, 8, 11]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn in [3, 6, 9, 12]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi adjust untuk berbagai progres dan mode
def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def ambil_data_trebel(id, target_id, kolom):
# Fungsi untuk mengambil data Trebel dari ID yang berbeda
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = f"""
SELECT {kolom}
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (target_id,))
data = cursor.fetchone()
conn.close()
return data[0]
# Letakkan entry dan combobox di bawah
label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")
label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=0, pady=7)
label_id_selected = tk.Label(frame_top, text="ID:")
label_id_selected.grid(row=2, column=0, padx=0, pady=7)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=0, pady=7)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=0, pady=7)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=0, pady=7)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=0, pady=7)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_combobox.grid(row=4, column=1, padx=0, pady=7)
# Frame untuk hasil adaptasi
frame_bottom = tk.Frame(root)
frame_bottom.pack(pady=10)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_bottom, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Labels dan Entry untuk Bass dan Trebel
gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")
gugusan_nada_bass_1_label.grid(row=7, column=1, padx=5, pady=5)
gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")
gugusan_nada_trebel_1_label.grid(row=7, column=2, padx=5, pady=5)
gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")
gugusan_nada_bass_2_label.grid(row=7, column=3, padx=5, pady=5)
gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")
gugusan_nada_trebel_2_label.grid(row=7, column=4, padx=5, pady=5)
gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")
gugusan_nada_bass_3_label.grid(row=7, column=5, padx=5, pady=5)
# Entry box untuk Bass dan Trebel
entry_bass_1 = tk.Entry(frame_bottom, bg="white")
entry_bass_1.grid(row=8, column=1, padx=5, pady=5)
entry_trebel_1 = tk.Entry(frame_bottom, bg="white")
entry_trebel_1.grid(row=8, column=2, padx=5, pady=5)
entry_bass_2 = tk.Entry(frame_bottom, bg="white")
entry_bass_2.grid(row=8, column=3, padx=5, pady=5)
entry_trebel_2 = tk.Entry(frame_bottom, bg="white")
entry_trebel_2.grid(row=8, column=4, padx=5, pady=5)
entry_bass_3 = tk.Entry(frame_bottom, bg="white")
entry_bass_3.grid(row=8, column=5, padx=5, pady=5)
root.mainloop()
Agar supaya untuk Bass, setiap digit data Bass yang terpilih akan berkurang hanya bila menurut level_gn dan id yang sesuai saja, tapi bila menurut progres dan mode maka data Bass terpilih akan tanpa pengurangan digit data.
Kemudian untuk Trebel, setiap digit data Trebel yang terpilih akan berkurang menurut level_gn dan id yang sesuai, dan juga berlanjut berkurang lagi digitnya menurut progres dan mode yang sesuai (data Trebel mengalami dua kali proses pengurangan digit data).
Berikut adalah pengintegrasian kode yang diinginkan dengan modifikasi yang telah diminta. Kode ini menggabungkan logika validasi **level_gn**, pengambilan data dari database, serta logika pengurangan pada **Bass** dan **Trebel** sesuai dengan progres dan mode yang dipilih.
```python
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn in [1, 4, 7, 10]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn in [2, 5, 8, 11]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn in [3, 6, 9, 12]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode, level_gn_selected):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Tentukan pengurang berdasarkan level_gn
pengurang = 0
if level_gn_selected in [4, 5, 6]:
pengurang = 1
elif level_gn_selected in [7, 8, 9]:
pengurang = 2
elif level_gn_selected in [10, 11, 12]:
pengurang = 3
# Fungsi untuk mengurangi setiap digit pada bass dan trebel
def adjust_value(value, pengurang):
if value.isdigit():
adjusted_value = ''.join(str(int(digit) - pengurang) if digit.isdigit() else digit for digit in value)
return adjusted_value
return value
# Pengurangan pada Bass dan Trebel tergantung pada Level Gn
if level_gn_selected in [1, 4, 7, 10]:
bass_1 = adjust_value(bass_1, pengurang)
trebel_1 = adjust_value(data[1], pengurang)
if level_gn_selected in [2, 5, 8, 11]:
bass_2 = adjust_value(bass_2, pengurang)
trebel_2 = adjust_value(data[3], pengurang)
if level_gn_selected in [3, 6, 9, 12]:
bass_3 = adjust_value(bass_3, pengurang)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Entry untuk level_gn dan ID
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=0, column=1)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=1, column=1)
# Entry untuk bass dan trebel
entry_bass_1 = tk.Entry(frame_top)
entry_bass_1.grid(row=2, column=1)
entry_trebel_1 = tk.Entry(frame_top)
entry_trebel_1.grid(row=2, column=2)
entry_bass_2 = tk.Entry(frame_top)
entry_bass_2.grid(row=3, column=1)
entry_trebel_2 = tk.Entry(frame_top)
entry_trebel_2.grid(row=3, column=2)
entry_bass_3 = tk.Entry(frame_top)
entry_bass_3.grid(row=4, column=1)
# Dropdown untuk progres dan mode
progres_var = tk.IntVar()
progres_dropdown = ttk.Combobox(frame_top, textvariable=progres_var, values=[1, 2, 3])
progres_dropdown.grid(row=5, column=1)
mode_var = tk.StringVar()
mode_dropdown = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_dropdown.grid(row=5, column=2)
# Tombol untuk memilih nada
pilih_button = tk.Button(frame_top, text="Pilih Nada", command=pilih_nada)
pilih_button.grid(row=6, column=1)
root.mainloop()
```
Kode di atas akan melakukan hal berikut:
1. Validasi `level_gn` dan mengatur ID yang sesuai.
2. Mengambil data dari tabel **Gn_Biru** di dalam database `DATAMUSIK.db`.
3. Mengurangi nilai pada kolom **Bass** dan **Trebel** berdasarkan `level_gn`, progres, dan mode yang dipilih.
4. Menampilkan hasilnya di dalam form input (entry).
Jika ada yang masih perlu diperbaiki atau disesuaikan, silakan beritahu!
Tolong perbaiki kode berikut:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10) # Pengaturan padding agar tidak terlalu dekat dengan elemen lainnya
frame_top.grid_columnconfigure(0, minsize=-20) # Tambahkan kolom negatif (menggeser ke kiri)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn in [1, 4, 7, 10]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn in [2, 5, 8, 11]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn in [3, 6, 9, 12]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode):
# Koneksi ke database
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1 = data[0]
bass_2 = data[2]
bass_3 = data[4]
# Tentukan pengurang berdasarkan level_gn
pengurang = 0
if level_gn_selected in [4, 5, 6]:
pengurang = 1
elif level_gn_selected in [7, 8, 9]:
pengurang = 2
elif level_gn_selected in [10, 11, 12]:
pengurang = 3
# Fungsi untuk mengurangi setiap digit pada bass dan trebel
def adjust_value(value, pengurang):
if value.isdigit():
adjusted_value = ''.join(str(int(digit) - pengurang) if digit.isdigit() else digit for digit in value)
return adjusted_value
return value
# Pengurangan pada Bass dan Trebel tergantung pada Level Gn
if level_gn_selected in [1, 4, 7, 10]:
bass_1 = adjust_value(bass_1, pengurang)
trebel_1 = adjust_value(data[1], pengurang)
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
if level_gn_selected in [2, 5, 8, 11]:
bass_2 = adjust_value(bass_2, pengurang)
trebel_2 = adjust_value(data[3], pengurang)
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
if level_gn_selected in [3, 6, 9, 12]:
bass_3 = adjust_value(bass_3, pengurang)
# Pengaturan Trebel berdasarkan progres dan mode
if progres == 1:
if mode == "naik" or mode == "turun":
trebel_1 = data[1]
trebel_2 = data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres2_naik_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_naik_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 1)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres2_turun_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 1)
trebel_2 = adjust_id_trebel_progres2_turun_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_id_trebel_progres3_naik_value(data[1], ambil_data_trebel(id, 2, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_naik_value(data[3], ambil_data_trebel(id, 2, 'Trebel_2'), 2)
elif mode == "turun":
trebel_1 = adjust_id_trebel_progres3_turun_value(data[1], ambil_data_trebel(id, 3, 'Trebel_1'), 2)
trebel_2 = adjust_id_trebel_progres3_turun_value(data[3], ambil_data_trebel(id, 3, 'Trebel_2'), 2)
conn.close()
# Return hasil
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
return result
# Fungsi adjust untuk berbagai progres dan mode
def adjust_id_trebel_progres2_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres2_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 2) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_naik_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def adjust_id_trebel_progres3_turun_value(trebel_value, new_id_value, pengurang):
if trebel_value.isdigit():
digit_pertama = str(int(trebel_value[0]) - pengurang)
else:
digit_pertama = trebel_value
if new_id_value.isdigit():
digit_kedua_dan_seterusnya = ''.join(str(int(char) - 3) for char in new_id_value[1:])
else:
digit_kedua_dan_seterusnya = new_id_value[1:]
adjusted_value = digit_pertama + digit_kedua_dan_seterusnya
return adjusted_value
def ambil_data_trebel(id, target_id, kolom):
# Fungsi untuk mengambil data Trebel dari ID yang berbeda
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
query = f"""
SELECT {kolom}
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (target_id,))
data = cursor.fetchone()
conn.close()
return data[0]
# Letakkan entry dan combobox di bawah
label_level_gn_selected = tk.Label(frame_top, text="Level Gn:")
label_level_gn_selected.grid(row=1, column=0, padx=0, pady=7)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=0, pady=7)
label_id_selected = tk.Label(frame_top, text="ID:")
label_id_selected.grid(row=2, column=0, padx=0, pady=7)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=0, pady=7)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=0, pady=7)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=0, pady=7)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=0, pady=7)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var, values=["naik", "turun"])
mode_combobox.grid(row=4, column=1, padx=0, pady=7)
# Frame untuk hasil adaptasi
frame_bottom = tk.Frame(root)
frame_bottom.pack(pady=10)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(frame_bottom, text="Pilih Nada", bg="#158aff", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_bottom, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Labels dan Entry untuk Bass dan Trebel
gugusan_nada_bass_1_label = tk.Label(frame_bottom, text="Bass_1")
gugusan_nada_bass_1_label.grid(row=7, column=1, padx=5, pady=5)
gugusan_nada_trebel_1_label = tk.Label(frame_bottom, text="Trebel_1")
gugusan_nada_trebel_1_label.grid(row=7, column=2, padx=5, pady=5)
gugusan_nada_bass_2_label = tk.Label(frame_bottom, text="Bass_2")
gugusan_nada_bass_2_label.grid(row=7, column=3, padx=5, pady=5)
gugusan_nada_trebel_2_label = tk.Label(frame_bottom, text="Trebel_2")
gugusan_nada_trebel_2_label.grid(row=7, column=4, padx=5, pady=5)
gugusan_nada_bass_3_label = tk.Label(frame_bottom, text="Bass_3")
gugusan_nada_bass_3_label.grid(row=7, column=5, padx=5, pady=5)
# Entry box untuk Bass dan Trebel
entry_bass_1 = tk.Entry(frame_bottom, bg="white")
entry_bass_1.grid(row=8, column=1, padx=5, pady=5)
entry_trebel_1 = tk.Entry(frame_bottom, bg="white")
entry_trebel_1.grid(row=8, column=2, padx=5, pady=5)
entry_bass_2 = tk.Entry(frame_bottom, bg="white")
entry_bass_2.grid(row=8, column=3, padx=5, pady=5)
entry_trebel_2 = tk.Entry(frame_bottom, bg="white")
entry_trebel_2.grid(row=8, column=4, padx=5, pady=5)
entry_bass_3 = tk.Entry(frame_bottom, bg="white")
entry_bass_3.grid(row=8, column=5, padx=5, pady=5)
root.mainloop()
Agar supaya applikasi dapat berjalan dengan baik dan tanpa error, di mana setiap digit data Bass yang terpilih akan berkurang hanya bila menurut level_gn dan id yang sesuai saja, tapi bila menurut progres dan mode maka data Bass terpilih akan tanpa pengurangan digit data. Kemudian untuk Trebel, setiap digit data Trebel yang terpilih akan berkurang menurut level_gn dan id yang sesuai, dan juga berlanjut berkurang lagi digitnya menurut progres dan mode yang sesuai (data Trebel mengalami dua kali proses pengurangan digit data).
Berikut adalah perbaikan kode Anda, dengan beberapa penyesuaian untuk menjaga logika tetap konsisten dan menghindari kesalahan. Saya menyarankan beberapa perubahan untuk menyederhanakan logika, terutama dalam bagian yang mengatur trebel dan bass:
### Perubahan Kunci:
1. **`level_gn_selected`** perlu diambil sebagai parameter dalam fungsi `level_gn()`.
2. Fungsi `adjust_value()` telah diperbaiki agar menangani nilai angka secara benar.
3. Struktur logika pengisian data trebel disederhanakan.
4. Logika yang berulang untuk menangani progres dan mode sekarang lebih modular.
### Kode yang Diperbaiki:
```python
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
root = tk.Tk()
root.title("Pilihan Nada")
root.geometry("600x400")
# Buat frame_top di dalam inner_frame
frame_top = tk.Frame(root)
frame_top.pack(pady=10)
frame_top.grid_columnconfigure(0, minsize=-20)
# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn
def validate_level_gn():
try:
level_gn = int(entry_level_gn.get())
if level_gn in [1, 4, 7, 10]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")
set_id_entry(3)
elif level_gn in [2, 5, 8, 11]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")
set_id_entry(2)
elif level_gn in [3, 6, 9, 12]:
messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")
set_id_entry(1)
else:
messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")
reset_entries()
except ValueError:
messagebox.showerror("Error", "Input harus berupa angka.")
reset_entries()
# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid
def set_id_entry(valid_id):
entry_id.delete(0, tk.END)
entry_id.insert(0, valid_id)
entry_id.config(state='readonly')
# Fungsi untuk mereset entries jika input level_gn tidak valid
def reset_entries():
entry_level_gn.delete(0, tk.END)
entry_id.config(state='normal')
entry_id.delete(0, tk.END)
# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada
def pilih_nada():
try:
level_gn_selected = int(entry_level_gn.get())
id_selected = int(entry_id.get())
progres_selected = int(progres_var.get())
mode_selected = mode_var.get().lower()
# Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected
result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)
# Tampilkan data ke dalam entry
entry_bass_1.delete(0, tk.END)
entry_bass_1.insert(0, result["Bass_1"])
entry_trebel_1.delete(0, tk.END)
entry_trebel_1.insert(0, result["Trebel_1"])
entry_bass_2.delete(0, tk.END)
entry_bass_2.insert(0, result["Bass_2"])
entry_trebel_2.delete(0, tk.END)
entry_trebel_2.insert(0, result["Trebel_2"])
entry_bass_3.delete(0, tk.END)
entry_bass_3.insert(0, result["Bass_3"])
except Exception as e:
print("Error:", e)
# Fungsi untuk mengambil data dari database dan mengatur trebel/bass sesuai progres dan mode
def level_gn(id, progres, mode, level_gn_selected):
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_Biru
query = """
SELECT Bass_1, Trebel_1, Bass_2, Trebel_2, Bass_3
FROM Gn_Biru
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
bass_1, trebel_1, bass_2, trebel_2, bass_3 = data
# Tentukan pengurang berdasarkan level_gn
pengurang = 0
if level_gn_selected in [4, 5, 6]:
pengurang = 1
elif level_gn_selected in [7, 8, 9]:
pengurang = 2
elif level_gn_selected in [10, 11, 12]:
pengurang = 3
# Fungsi untuk mengurangi setiap digit pada bass dan trebel
def adjust_value(value, pengurang):
adjusted_value = ''.join(str(max(0, int(digit) - pengurang)) if digit.isdigit() else digit for digit in value)
return adjusted_value
# Pengurangan pada Bass dan Trebel tergantung pada Level Gn
if level_gn_selected in [1, 4, 7, 10]:
bass_1 = adjust_value(bass_1, pengurang)
trebel_1 = adjust_value(trebel_1, pengurang)
elif level_gn_selected in [2, 5, 8, 11]:
bass_2 = adjust_value(bass_2, pengurang)
trebel_2 = adjust_value(trebel_2, pengurang)
elif level_gn_selected in [3, 6, 9, 12]:
bass_3 = adjust_value(bass_3, pengurang)
# Sesuaikan trebel dengan progres dan mode
if progres == 1:
trebel_1, trebel_2 = data[1], data[3]
elif progres == 2:
if mode == "naik":
trebel_1 = adjust_value(data[1], 1)
trebel_2 = adjust_value(data[3], 1)
elif mode == "turun":
trebel_1 = adjust_value(data[1], -1)
trebel_2 = adjust_value(data[3], -1)
elif progres == 3:
if mode == "naik":
trebel_1 = adjust_value(data[1], 2)
trebel_2 = adjust_value(data[3], 2)
elif mode == "turun":
trebel_1 = adjust_value(data[1], -2)
trebel_2 = adjust_value(data[3], -2)
result = {
"Bass_1": bass_1,
"Trebel_1": trebel_1,
"Bass_2": bass_2,
"Trebel_2": trebel_2,
"Bass_3": bass_3
}
conn.close()
return result
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(frame_top, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=1, column=2, padx=0, pady=7)
# Entry dan widget lainnya (progress, mode, dll.) di sini...
# ...
root.mainloop()
```
### Penjelasan Perubahan:
1. **Struktur Pengaturan Trebel dan Bass**: Saya menyesuaikan logika untuk mengurangi pengulangan, sehingga pengaturan nilai trebel dan bass lebih modular.
2. **Fungsi `adjust_value()`**: Fungsi ini sekarang menangani pengurangan digit dengan aman, menghindari nilai negatif, dan hanya mengubah karakter numerik.
3. **Penggunaan Mode**: Mode dan progres sekarang lebih terstruktur, mengurangi kompleksitas kode yang tidak perlu.
Dengan perubahan ini, kode akan menjadi lebih modular dan mudah di-maintain.
Bersambung ke...
Komentar
Posting Komentar
This Message