MENGAMBIL DAN MENAMPILKAN DATA DARI KOLOM TREBEL BIASA DARI TABEL Gn_Cyan_Bawah DI DATABASE DATAMUSIK.db
MENGAMBIL DAN MENAMPILKAN DATA DARI KOLOM TREBEL BIASA DARI TABEL Gn_Cyan_Bawah DI DATABASE DATAMUSIK.db
Untuk data trebel_biasa dari tabel Gn_Cyan_Bawah hanya ada 3 id karena baris ke empat di kolom Trebel_Biasa adalah kosong. Untuk data Trebel_biasa dari tabel Sub_Gn_Cyan_Bawah adalah kosong karena baris ke satu di kolom Trebel_Biasa adalah kosong.
Tolong buat kode untuk fungsi yang cocok untuk def adjust_trebel_value(), sehingga data nada Trebel terpilih dari kolom Trebel_Biasa dari tabel Gn_Cyan_Bawah dapat ditampilkan pada entry_trebel berdasarkan level_gn, id, progres, dan mode, sesuai logika yang cocok diterapkan berikut ini:
Jika data gugus nada yang terpilih dari kolom Trebel_Biasa pada Gn_Cyan_Bawah:
1a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 1, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1
1b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 1,, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2
1c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 1, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3.
1d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini)
2a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 2, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1 yang setiap karakter angka datanya dikurang 1.
2b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 2,, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2 yang setiap karakter angka datanya dikurang 1.
2c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 2, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3 yang setiap karakter angka datanya dikurang 1.
2d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini)
3a. Jika data dari Trebel_Biasa id 1 maka level_gn = 1, 5, 9, dan jika progres 3, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 1 adalah menjadi Trebel_Biasa id 1 yang setiap karakter angka datanya dikurang 2.
3b. Jika data dari Trebel_Biasa id 2 maka level_gn = 2, 6, 10, dan jika progres 3,, dan jika mode Naik atau Turun,
maka data dari Trebel_Biasa id 2 adalah menjadi Trebel_Biasa id 2 yang setiap karakter angka datanya dikurang 2.
3c. Jika data dari Trebel_Biasa id 3 maka level_gn = 3, 7, 11, dan jika progres 3, dan jika mode Naik atau Turun:
maka data dari Trebel_Biasa id 3 adalah menjadi Trebel_Biasa id 3 yang setiap karakter angka datanya dikurang 2.
3d. Kolom Trebel_Biasa id 4 adalah kosong (tidak boleh menginput data di sel ini).
Berikut kode yang butuh di perbaiki:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import os
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
# Fungsi untuk mengambil data Trebel_Biasa dari Gn_Cyan_Bawah berdasarkan ID dan Level_Gn
def get_data_gn_cyan_bawah_from_db():
id_selected = entry_id.get()
if not id_selected:
messagebox.showerror("Error", "ID tidak valid!")
return
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
cursor.execute("SELECT Trebel_Biasa FROM Gn_Cyan_Bawah WHERE ID=?", (id_selected,))
result = cursor.fetchone()
if result:
entry_trebel.delete(0, 'end')
entry_trebel.insert(0, result[0])
else:
messagebox.showerror("Error", "Data tidak ditemukan!")
conn.close()
# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres
def adjust_trebel_value(trebel_value, progres):
return ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)
def adjust_trebel_value(trebel_biasa_value, adjustment):
# Implementasi logika untuk menyesuaikan nilai Trebel
try:
adjusted_value = str(int(trebel_biasa_value) + adjustment)
except ValueError:
adjusted_value = trebel_biasa_value # Jika nilai trebel_biasa bukan angka, biarkan tetap sama
return adjusted_value ''
# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan nada
def pilih_nada():
try:
# Ambil nilai ID yang dipilih dari entry_id dan level_gn
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()
nada_selected = nada_var.get()
id_selected, id_selected_sub = level_gn()
if id_selected is None or id_selected_sub is None:
return # Hentikan eksekusi jika ID tidak valid
# Fungsi untuk memilih nada berdasarkan logika yang diterapkan
level_gn_selected = level_gn()
if level_gn_selected is None:
messagebox.showerror("Error", "Data sesuaikan dengan id = level_gm")
return
data_gn_cyan_bawah = get_data_gn_cyan_bawah_from_db()
return
# Hapus data sebelumnya di EntryBox
entry_trebel.delete(0, tk.END)
# Ambil nilai Trebel_Biasa
trebel_value = data_gn_cyan_bawah[3]
# Tampilkan data pada entry_trebel dan entry_sub_trebel
entry_trebel.delete(0, 'end')
entry_trebel.insert(0, data_gn_cyan_bawah['Trebel_Biasa'])
# Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, level_gn, Progres, Mode, dan nada
if id_selected == 1:
level_gn_selected = 1 or 5 or 9
if progres_selected == 1 and progres_selected == "naik":
# Progres 1, Mode Naik
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel_biasa.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))
if id_selected == 2:
level_gn_selected =2 or 6 or 10
if progres_selected == 1 and mode_selected == "naik":
# Progres 1, Mode Naik
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
if id_selected == 3:
level_gn_selected =3 or 7 or 11
if progres_selected == 1 and mode_selected == "naik":
# Progres 1, Mode Naik
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel_biasa.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))
if id_selected == 4:
level_gn_selected = 4 or 8 or 12
if progres_selected == 1 or progres_selected == 2 or progres_selected == 3:
messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")
elif mode_selected == "naik" or mode_selected == "turun":
messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")
else:
messagebox.showerror("Error", "ID tidak valid")
return
messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")
except ValueError:
messagebox.showerror("Error", "ID dan progres harus berupa angka")
finally:
# Bersihkan atau reset entry dan combobox setelah data dipilih
entry_level_gn.delete(0, 'end')
entry_level_gn.delete(0, 'end')
entry_id.delete(0, 'end')
progres_combobox.set('') # Kosongkan combobox
mode_combobox.set('') # Kosongkan combobox
nada_combobox.set('') # Kosongkan combobox
# Fungsi untuk memastikan urutan Level_Gn dan ID
def level_gn():
try:
# Kondisi untuk Gn_Cyan_Bawah
level_gn_selected = int(entry_level_gn.get())
if level_gn_selected in [1, 5, 9]:
id_selected = 1
elif level_gn_selected in [2, 6, 10]:
id_selected = 2
elif level_gn_selected in [3, 7, 11]:
id_selected = 3
elif level_gn_selected in [4, 8, 12]:
id_selected = 4
else:
messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")
return None
# Memasukkan id_selected ke entry_id
entry_id.delete(0, 'end')
entry_id.insert(0, str(id_selected))
# Kondisi untuk Sub_Gn_Cyan_Bawah
if level_gn_selected in range(1, 13):
id_selected_sub = 1
return id_selected, id_selected_sub
except ValueError:
messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")
return None, None
# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah
Gn_Cyan_Bawah = True
Sub_Gn_Cyan_Bawah = False
frame_top = tk.Frame(root)
frame_top.pack()
label_level_gn = tk.Label(frame_top, text="Level_Gn:")
label_level_gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=2, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=4, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=5, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("trebel_biasa", "Trebel")
nada_combobox.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Hapus label, entry field, dan combobox untuk Progres dan Mode yang tidak digunakan lagi
# label_progres.grid_forget()
# progres_combobox.grid_forget()
# label_mode.grid_forget()
# mode_combobox.grid_forget()
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
#Label dan Entry Ambil Gugusan nada Teroilih
label_trebel = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel.grid(row=7, column=3, padx=5, pady=5)
entry_trebel = tk.Entry(bottom_frame)
entry_trebel.grid(row=8, column=3, padx=5, pady=5)
label_sub_trebel = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_sub_trebel.grid(row=7, column=4, padx=5, pady=5)
entry_sub_trebel = tk.
Entry(bottom_frame)
entry_sub_trebel.grid(row=8, column=4, padx=5, pady=5)
# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=pilih_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)
root.mainloop()
Untuk memperbaiki fungsi `adjust_trebel_value` dan `pilih_nada`, kita perlu memastikan bahwa logika yang diterapkan sesuai dengan ketentuan yang Anda jelaskan. Berikut adalah versi yang diperbarui dari kedua fungsi tersebut:
### Fungsi `adjust_trebel_value`
```python
def adjust_trebel_value(trebel_biasa_value, progres):
if trebel_biasa_value.isdigit():
# Kurangi nilai berdasarkan progres
adjusted_value = ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_biasa_value)
else:
# Jika bukan digit, biarkan nilainya tetap sama
adjusted_value = trebel_biasa_value
return adjusted_value
```
### Fungsi `pilih_nada`
```python
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()
nada_selected = nada_var.get()
if id_selected not in [1, 2, 3] or level_gn_selected not in [1, 2, 3, 5, 6, 7, 9, 10, 11]:
messagebox.showerror("Error", "ID atau Level_Gn tidak valid!")
return
# Dapatkan data Trebel_Biasa dari database
data_gn_cyan_bawah = get_data_gn_cyan_bawah_from_db()
trebel_biasa_value = data_gn_cyan_bawah[0]
if id_selected == 1 and level_gn_selected in [1, 5, 9]:
if progres_selected == 1:
# Progres 1, Mode Naik atau Turun
adjusted_trebel = trebel_biasa_value
elif progres_selected == 2:
# Progres 2, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)
elif progres_selected == 3:
# Progres 3, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)
elif id_selected == 2 and level_gn_selected in [2, 6, 10]:
if progres_selected == 1:
# Progres 1, Mode Naik atau Turun
adjusted_trebel = trebel_biasa_value
elif progres_selected == 2:
# Progres 2, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)
elif progres_selected == 3:
# Progres 3, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)
elif id_selected == 3 and level_gn_selected in [3, 7, 11]:
if progres_selected == 1:
# Progres 1, Mode Naik atau Turun
adjusted_trebel = trebel_biasa_value
elif progres_selected == 2:
# Progres 2, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)
elif progres_selected == 3:
# Progres 3, Mode Naik atau Turun
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 2)
else:
messagebox.showerror("Error", "ID atau Level_Gn tidak sesuai dengan logika yang diterapkan!")
return
# Tampilkan hasil pada entry_trebel
entry_trebel.delete(0, 'end')
entry_trebel.insert(0, adjusted_trebel)
except Exception as e:
messagebox.showerror("Error", str(e))
```
### Penjelasan
1. **Fungsi `adjust_trebel_value`:** Fungsi ini mengurangi nilai karakter angka dalam `trebel_biasa_value` berdasarkan nilai `progres`. Jika karakter bukan angka, nilai akan tetap sama.
2. **Fungsi `pilih_nada`:** Fungsi ini mengambil input dari `entry_id`, `entry_level_gn`, `progres_var`, dan `mode_var`, kemudian menyesuaikan nilai `Trebel_Biasa` berdasarkan ID, Level_Gn, Progres, dan Mode yang dipilih. Hasilnya ditampilkan di `entry_trebel`.
3. **Logika Pengisian**:
- **ID 1:** Jika Level_Gn adalah 1, 5, atau 9, maka nilai `Trebel_Biasa` disesuaikan berdasarkan progres.
- **ID 2:** Jika Level_Gn adalah 2, 6, atau 10, nilai `Trebel_Biasa` disesuaikan berdasarkan progres.
- **ID 3:** Jika Level_Gn adalah 3, 7, atau 11, nilai `Trebel_Biasa` juga disesuaikan berdasarkan progres.
Dengan modifikasi ini, nilai `Trebel_Biasa` akan disesuaikan dengan logika yang Anda berikan dan ditampilkan di `entry_trebel`. Pastikan juga untuk menguji kode ini pada kondisi yang berbeda untuk memastikan bahwa hasilnya sesuai dengan yang diharapkan.
Muncul pesan error':
Exception in Tkinter callback
Traceback (most recent call last):
File "/storage/emulated/0/NadaPL/KGNS-NPL/CRUD_Gn_Cyan_Bawah_Trebel.py", line 49, in pilih_nada
level_gn_selected = int(entry_level_gn.get())
^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: ''
During handling of the above exception, another exception occurred:
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/CRUD_Gn_Cyan_Bawah_Trebel.py", line 83, in pilih_nada
if id_selected == 1 and level_gn_selected in [1, 5, 9]:
^^^^^^^^^^^
UnboundLocalError: cannot access local variable 'id_selected' where it is not associa
ted with a value.
Error yang muncul disebabkan oleh dua masalah dalam kode:
1. **ValueError**: Kesalahan ini terjadi saat program mencoba mengonversi nilai dari `entry_level_gn.get()` menjadi integer (`int`). Pesan error menunjukkan bahwa `entry_level_gn.get()` mengembalikan string kosong (`''`), yang tidak dapat dikonversi menjadi integer.
2. **UnboundLocalError**: Kesalahan ini muncul karena `id_selected` diakses dalam blok kode setelah terjadinya kesalahan dalam blok `try`, sehingga variabel tersebut tidak pernah diinisialisasi.
### Cara Mengatasi
1. **Cek Input yang Kosong:**
Sebelum mencoba mengonversi nilai dari `entry_level_gn` menjadi integer, pastikan bahwa inputnya tidak kosong. Anda bisa menambahkan pengecekan untuk memastikan input sudah benar.
2. **Inisialisasi Variabel dengan Default:**
Untuk menghindari `UnboundLocalError`, Anda dapat menginisialisasi variabel `id_selected` dan `level_gn_selected` dengan nilai default di luar blok `try`.
Berikut adalah kode yang sudah diperbaiki:
```python
def pilih_nada():
# Inisialisasi variabel default
id_selected = None
level_gn_selected = None
try:
# Cek apakah entry ID dan Level_Gn tidak kosong
if entry_id.get().strip() == '' or entry_level_gn.get().strip() == '':
raise ValueError("Entry ID dan Level_Gn tidak boleh kosong")
id_selected = int(entry_id.get())
level_gn_selected = int(entry_level_gn.get())
except ValueError as ve:
print(f"Error: {ve}")
return
# Lanjutkan logika setelah try-except
if id_selected == 1 and level_gn_selected in [1, 5, 9]:
# Logika untuk ID 1 dan Level 1, 5, 9
pass
# Tambahkan kondisi lainnya sesuai dengan logika yang diinginkan
# Logika selanjutnya
```
### Penjelasan:
1. **Pengecekan Input**: Kode menambahkan pengecekan apakah `entry_id` atau `entry_level_gn` kosong sebelum mencoba mengonversinya menjadi integer.
2. **Inisialisasi Awal**: Variabel `id_selected` dan `level_gn_selected` diinisialisasi di luar blok `try` untuk menghindari `UnboundLocalError` jika terjadi kesalahan di dalam blok `try`.
Dengan perbaikan ini, program akan lebih tangguh dalam menangani kasus input yang kosong dan akan menghindari kesalahan akses variabel yang belum diinisialisasi.
Masalah unboumdLocalError, dan ValueError sudah beres dapat teratasi. Masalah penyesuaian data Trebel yang ditampilkan pada entry_trebel belum dapat teratasi agar sesuai dengan progres dan mode, ini mungkin karena data yang diambil dari kolom Trebel_Biasa adalah data angka hasil dari otomatisasi perhitungan formula dari data pada kolom Bass_1 di tabel Gn_Cyan_Atas untuk menjadi data pada kolom Trebel_Biasa di tabel Gn_Cyan_Bawah yaitu hanya karakter angka pertama saja yang ditampilkan di kolom Trebel_Biasa di tabel Gn_Cyan_Bawah, sedangkan karakter kedua dan seterusnya adalah inputan dari user. Jadi misalnya jika user meneruskan memperbanyak angka data pada kolom Trebel_Biasa, tentunya harus dipastikan bahwa data yang diinput user tersebut seharusnya tidak kembali menjadi hanya karakter angka pertama saja yang tampil di kolom Trebel_Biasa di tabel Gn_Cyan_Bawah oleh karena adanya kode untuk otomatisasi perhitungan formula tersebut.
Untuk menangani masalah ini, Anda perlu memastikan bahwa saat data otomatis dimasukkan ke dalam kolom `Trebel_Biasa` pada tabel `Gn_Cyan_Bawah`, sistem hanya mengotomatiskan pengisian karakter pertama, sementara karakter kedua dan seterusnya harus tetap sesuai dengan input yang diberikan oleh pengguna.
### Langkah Penyelesaian:
1. **Pisahkan Pengisian Otomatis dan Input Pengguna:**
Buat logika yang membedakan antara pengisian otomatis dari karakter pertama dengan input manual dari karakter-karakter selanjutnya. Ini bisa dilakukan dengan menggabungkan kedua bagian tersebut menjadi satu string.
2. **Pertahankan Input Pengguna:**
Pastikan bahwa setelah input otomatis dilakukan, input manual yang dilakukan oleh pengguna tetap dipertahankan dan tidak diubah oleh sistem.
### Implementasi Logika:
Berikut adalah contoh bagaimana Anda bisa menyesuaikan kode untuk memastikan bahwa hanya karakter pertama yang diisi secara otomatis, dan karakter kedua serta seterusnya adalah input dari pengguna:
```
python
def isi_trebel_biasa():
# Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas
bass_data = ambil_data_bass_1()
# Hanya ambil karakter pertama dari hasil otomatisasi
otomatis_angka_pertama = bass_data[0] # Mengambil karakter pertama saja
# Ambil input dari pengguna
inputan_pengguna = entry_trebel.get() # Mengambil keseluruhan input dari pengguna
# Gabungkan hasil otomatis dengan input pengguna
if len(inputan_pengguna) > 1:
data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:] # Gabungkan otomatis dan input pengguna
else:
data_trebel_biasa = otomatis_angka_pertama # Hanya gunakan otomatis jika tidak ada input lain
# Masukkan data_trebel_biasa ke Entry
entry_trebel.delete(0, tk.END)
entry_trebel.insert(0, data_trebel_biasa)
# Update data ke tabel Gn_Cyan_Bawah
update_data_trebel_biasa_ke_tabel(data_trebel_biasa)
def ambil_data_bass_1():
# Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas
# Misalnya:
return "123" # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas
def update_data_trebel_biasa_ke_tabel(data):
# Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah
pass
```
### Penjelasan:
1. **Pisahkan Otomatisasi dan Input Pengguna:**
Kode mengambil karakter pertama dari `bass_data` dan kemudian menggabungkannya dengan sisa input dari pengguna (`inputan_pengguna[1:]`).
2. **Pertahankan Input Pengguna:**
Jika pengguna menambahkan lebih dari satu karakter, kode mempertahankan karakter kedua dan seterusnya yang diinput oleh pengguna.
3. **Update Entry dan Tabel:**
Setelah penggabungan selesai, kode memperbarui `entry_trebel` dan menyimpan hasilnya ke tabel `Gn_Cyan_Bawah`.
### Penggunaan Fungsi:
Anda bisa memanggil fungsi `isi_trebel_biasa()` di bagian kode di mana otomatisasi pengisian `Trebel_Biasa` diperlukan, seperti dalam callback untuk tombol atau event tertentu.
Dengan implementasi ini, input manual dari pengguna akan tetap dipertahankan setelah pengisian otomatis karakter pertama dilakukan. Sistem akan menggabungkan hasil otomatisasi dengan input manual sehingga hasil akhir sesuai dengan yang diharapkan.
Sudah saya periksa tabel Gn_Cyan_Bawah, dan isian data pada kolom Trebel_Biasa sudah saya buat secara manual untuk menguji fungsi def adjust_trebel_value() agar data Trebel terpilih yang tampil pada entry_trebel apakah benar atau tidak berdasarkan progres dan mode, dan ternyata masih salah dan kesalahan ada pada kode perintah adjust_trebel_value() yaitu penyesuaian nilai data Trebel yang didapat adalah tidak tepat. Untuk tolong beri arti dari kode berikut:
elif id_selected == 2 and level_gn_selected in [2, 6, 10]:
if progres_selected == 2 and mode_selected == "naik":
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)
Kemudian perbaiki kode kembali ya.
Baik, mari kita analisis dan berikan arti dari kode berikut:
```
python
elif id_selected == 2 and level_gn_selected in [2, 6, 10]:
if progres_selected == 2 and mode_selected == "naik":
adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)
```
### Penjelasan Kode:
1. **`elif id_selected == 2 and level_gn_selected in [2, 6, 10]`:**
- Kode ini memeriksa apakah `id_selected` memiliki nilai `2` dan apakah `level_gn_selected` termasuk dalam daftar [2, 6, 10].
- Jika kondisi ini benar, maka blok kode berikutnya akan dijalankan.
2. **`if progres_selected == 2 and mode_selected == "naik":`:**
- Kode ini memeriksa dua kondisi:
- `progres_selected` harus sama dengan `2`.
- `mode_selected` harus sama dengan `"naik"`.
- Jika kedua kondisi ini benar, maka kode dalam blok ini akan dieksekusi.
3. **`adjusted_trebel = adjust_trebel_value(trebel_biasa_value, 1)`:**
- Fungsi `adjust_trebel_value()` dipanggil dengan dua argumen:
- `trebel_biasa_value`: Ini adalah nilai yang ada di kolom `Trebel_Biasa` yang diambil dari tabel `Gn_Cyan_Bawah`.
- `1`: Ini adalah nilai yang akan ditambahkan atau diubah pada `trebel_biasa_value` untuk menghasilkan `adjusted_trebel`.
- Hasil dari fungsi `adjust_trebel_value()` akan disimpan ke dalam variabel `adjusted_trebel`.
### Arti dari Kode:
Kode di atas digunakan untuk menyesuaikan nilai `Trebel_Biasa` berdasarkan `id_selected`, `level_gn_selected`, `progres_selected`, dan `mode_selected`. Jika `id_selected` adalah `2`, `level_gn_selected` adalah salah satu dari [2, 6, 10], `progres_selected` adalah `2`, dan `mode_selected` adalah `"naik"`, maka nilai `Trebel_Biasa` akan disesuaikan dengan menambahkan (atau mengubah) nilai sebesar `1` menggunakan fungsi `adjust_trebel_value()`.
### Perbaikan Kode:
Jika penyesuaian nilai Trebel tidak tepat, maka Anda mungkin perlu mengubah logika di dalam fungsi `adjust_trebel_value()` atau memeriksa kembali nilai yang digunakan dalam kondisi `if`.
#### Contoh Perbaikan Fungsi `adjust_trebel_value()`:
Misalnya, jika fungsi `adjust_trebel_value()` saat ini hanya menambahkan angka tanpa mempertimbangkan konteks lain, Anda mungkin ingin menyesuaikan fungsi tersebut agar lebih dinamis.
```
python
def adjust_trebel_value(trebel_biasa_value, adjustment):
# Pastikan trebel_biasa_value adalah string yang valid
if trebel_biasa_value.isdigit():
# Ambil karakter pertama untuk penyesuaian
first_char = int(trebel_biasa_value[0])
# Lakukan penyesuaian pada karakter pertama
adjusted_first_char = first_char + adjustment
# Pertahankan karakter lainnya (input pengguna)
remaining_chars = trebel_biasa_value[1:]
# Gabungkan hasil penyesuaian dengan sisa input pengguna
return str(adjusted_first_char) + remaining_chars
else:
# Jika nilai tidak valid, kembalikan tanpa perubahan atau log error
return trebel_biasa_value
```
### Penjelasan Perbaikan:
- Fungsi `adjust_trebel_value()` di atas hanya menyesuaikan karakter pertama, sementara karakter kedua dan seterusnya tetap dipertahankan dari input pengguna.
- Logika ini bisa disesuaikan berdasarkan kebutuhan Anda. Misalnya, jika Anda ingin karakter kedua dan seterusnya juga diubah, Anda dapat memperluas logika ini.
### Integrasi dengan Kode yang Ada:
Jika `adjust_trebel_value()` telah diperbaiki, pastikan juga untuk mengecek apakah `id_selected`, `level_gn_selected`, `progres_selected`, dan `mode_selected` sudah benar sesuai dengan logika yang diinginkan.
Pastikan juga bahwa nilai yang diterima oleh `trebel_biasa_value` adalah nilai yang sesuai dan dapat diolah oleh fungsi `adjust_trebel_value()`.
Jika masih ada kesalahan atau tidak sesuai, kita bisa memperbaiki lebih lanjut berdasarkan masalah yang muncul.
Apa arti dari kode berikut:
elif progres == 2 and mode == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
Kode tersebut yang dipakai pada fungsi berikut:
def adjust_trebel_value(trebel_value, progres):
return ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)
Apakah fungsi tersebut bisa dipakai cocok untuk mendapatkan data trebel_biasa yang sesuai menurut progres, dan mode
Mari kita analisis arti dari kode yang Anda berikan.
### Kode:
```python
elif progres == 2 and mode == "naik":
entry_trebel_1.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
```
### Penjelasan Kode:
1. **`elif progres == 2 and mode == "naik":`**
- Kode ini memeriksa apakah nilai `progres` adalah `2` dan `mode` adalah `"naik"`.
- Jika kedua kondisi ini benar, maka blok kode berikutnya akan dijalankan.
2. **`get_data_from_db(3)[3]`:**
- Fungsi `get_data_from_db(3)` kemungkinan mengembalikan data dari database berdasarkan argumen `3`.
- `[3]` berarti mengambil elemen ke-4 dari hasil yang dikembalikan oleh `get_data_from_db(3)`.
- Dengan demikian, `get_data_from_db(3)[3]` adalah nilai yang diambil dari database.
3. **`adjust_trebel_value(get_data_from_db(3)[3], 1)`:**
- Fungsi `adjust_trebel_value()` dipanggil dengan dua argumen:
- Argumen pertama adalah nilai `trebel_value`, yang diperoleh dari `get_data_from_db(3)[3]`.
- Argumen kedua adalah `progres`, dalam hal ini bernilai `1`.
- Fungsi ini menyesuaikan `trebel_value` sesuai dengan logika yang ada dalam `adjust_trebel_value()`.
4. **`entry_trebel_1.insert(0, ...)`**
- Setelah nilai `trebel_value` disesuaikan oleh fungsi `adjust_trebel_value()`, hasilnya dimasukkan ke dalam `entry_trebel_1` pada posisi pertama (`index 0`).
### Fungsi `adjust_trebel_value()`:
```python
def adjust_trebel_value(trebel_value, progres):
return ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)
```
### Cara Kerja Fungsi:
1. **`''.join(...)`**:
- Menggabungkan hasil dari setiap elemen dalam generator menjadi satu string.
2. **`for char in trebel_value`**:
- Looping melalui setiap karakter (`char`) dalam `trebel_value`.
3. **`if char.isdigit()`:**
- Memeriksa apakah `char` adalah digit (angka).
- Jika `char` adalah digit, maka:
```python
str(int(char) - progres)
```
- `char` diubah menjadi integer, kemudian dikurangi dengan nilai `progres`, lalu diubah kembali menjadi string.
- Jika `char` bukan digit, karakter tersebut tetap dimasukkan tanpa perubahan.
### Cocok atau Tidak?
- **Cocok untuk Mengurangi Nilai Digit:**
- Fungsi `adjust_trebel_value()` cocok jika Anda ingin mengurangi nilai digit dalam `trebel_value` dengan nilai `progres`. Misalnya, jika `trebel_value` adalah "53" dan `progres` adalah `1`, maka hasilnya akan menjadi "42".
- **Tidak Cocok untuk Menambah Nilai Digit:**
- Jika tujuan Anda adalah untuk **menambah** nilai digit berdasarkan progres, maka fungsi ini tidak cocok karena hanya mengurangi nilai digit.
### Kesimpulan:
- **Fungsi `adjust_trebel_value()`** cocok untuk mendapatkan data `trebel_biasa` jika Anda ingin mengurangi nilai digit dalam string `trebel_value` sesuai dengan `progres`.
- Jika Anda perlu menambahkan nilai atau mengubah logika lainnya, Anda perlu memodifikasi fungsi tersebut.
Jika Anda ingin menambah nilai digit atau menyesuaikan dengan logika lain, berikut adalah modifikasi fungsi:
### Modifikasi untuk Menambah Nilai:
```
python
def adjust_trebel_value(trebel_value, progres):
return ''.join(str(int(char) + progres) if char.isdigit() else char for char in trebel_value)
```
- Fungsi ini akan **menambahkan** nilai `progres` ke setiap digit dalam `trebel_value`.
Jika ini sesuai dengan kebutuhan Anda, Anda bisa menggunakan modifikasi tersebut untuk mendapatkan data `trebel_biasa` yang sesuai menurut `progres` dan `mode`.
Nilai data Trebel_Biasa yang tampil di entry_trebel masih tetap dalam progres 1, data Trebel yang diharapkan seharusnya sesuai dengan progres, bila progres 2 maka digit data Trebel_Biasa harus berkurang 1, dan bila progres 3 maka digit data Trebel_Biasa harus berkurang 2. Lagi pula pada kode yang dieksekusi, muncul pesan di message_box: "None Type: object is not subscriptable
Dari penjelasan Anda, tampaknya ada dua masalah yang perlu diatasi:
1. **Data `Trebel_Biasa` yang Tampil Tidak Berubah Sesuai dengan Progres:**
- Anda mengharapkan nilai `Trebel_Biasa` yang tampil di `entry_trebel` untuk disesuaikan berdasarkan `progres`, di mana setiap progres seharusnya mengurangi nilai digit dari `Trebel_Biasa`.
2. **Pesan Error "NoneType: object is not subscriptable":**
- Error ini mengindikasikan bahwa Anda mencoba mengakses elemen dari objek yang bernilai `None`, yang tidak bisa diakses seperti sebuah list atau string.
Mari kita coba atasi kedua masalah ini.
### 1. Mengatasi Masalah Data `Trebel_Biasa` yang Tidak Berubah Sesuai Progres
Pastikan bahwa fungsi `adjust_trebel_value()` dipanggil dengan benar dan nilai `trebel_value` disesuaikan dengan progres. Berikut adalah fungsi yang mungkin Anda butuhkan:
```python
def adjust_trebel_value(trebel_value, progres):
# Mengurangi nilai digit sesuai progres
return ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)
```
Lalu, saat menampilkan data di `entry_trebel`, pastikan Anda menyesuaikan dengan progres, misalnya:
```python
def update_trebel_entry():
# Asumsi get_data_from_db mengembalikan nilai yang benar
trebel_biasa_value = get_data_from_db(id_selected)[index_trebel_biasa]
if progres == 1:
entry_trebel.insert(0, trebel_biasa_value)
elif progres == 2:
entry_trebel.insert(0, adjust_trebel_value(trebel_biasa_value, 1))
elif progres == 3:
entry_trebel.insert(0, adjust_trebel_value(trebel_biasa_value, 2))
```
### 2. Mengatasi Error "NoneType: object is not subscriptable"
Error ini mungkin muncul dari fungsi `get_data_from_db()` yang mengembalikan `None` atau dari proses di mana Anda mengakses nilai yang seharusnya berupa list atau string, tetapi ternyata `None`.
Untuk mengatasi ini, Anda bisa menambahkan pengecekan pada nilai yang diambil dari `get_data_from_db()`:
```python
def get_data_from_db(id):
# Fungsi untuk mengambil data dari database
# Misal, data diambil dalam bentuk tuple/list
# Jika tidak ditemukan data, kembalikan tuple/list kosong atau default value
data = ... # Ambil data dari database
return data if data is not None else []
# Kemudian dalam fungsi Anda
trebel_biasa_value = get_data_from_db(id_selected)
if trebel_biasa_value:
trebel_biasa_value = trebel_biasa_value[index_trebel_biasa]
else:
messagebox.showerror("Error", "Data not found for ID selected")
return
```
Penting untuk memastikan bahwa `get_data_from_db()` selalu mengembalikan nilai yang valid, atau setidaknya menangani kasus di mana tidak ada data yang ditemukan.
### Kesimpulan:
- Pastikan fungsi `adjust_trebel_value()` digunakan dengan benar untuk mengurangi nilai digit sesuai dengan `progres`.
- Tangani kasus di mana `get_data_from_db()` mungkin mengembalikan `None`, dan pastikan bahwa nilai yang diambil dari database adalah valid sebelum digunakan. Jika tidak, berikan pesan kesalahan yang informatif kepada pengguna.
Coba implementasi perubahan ini, dan lihat apakah masalahnya teratasi.
Saya rasa yang cocok kita pakai untuk menampilkan data Trebel_Biasa pada entry_trebel yang telah sesuai menurut progres dan dengan mode adalah dengan memakai fungsi def adjust_trebel_value(trebel_value, progres):
return ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_value)
Kemudian untuk memasukkan data Trebel_Biasa yang telah sesuai ke dalam entry_trebel adalah dengan memakai kode berikut (sebagai contoh) adalah:
elif progres == 1 and mode == "naik":
entry_trebel.insert(0, data_gn_cyan_bawah[2])
elif progres == 2 and mode == "naik": entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
elif progres == 3 and mode == "naik": entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
Penerapan fungsi `adjust_trebel_value()` seperti yang Anda sebutkan sudah tepat untuk menampilkan data `Trebel_Biasa` pada `entry_trebel` sesuai dengan progres dan mode. Fungsi tersebut secara efektif mengurangi nilai digit dalam string `Trebel_Biasa` sesuai dengan progres yang dipilih. Berikut adalah penjelasan lebih lanjut untuk memastikan kode tersebut bekerja sesuai harapan:
### Fungsi `adjust_trebel_value`
Fungsi ini bekerja dengan cara mengurangi setiap karakter angka dalam string `Trebel_Biasa` sesuai dengan nilai `progres`. Jika karakter tersebut bukan angka, karakter tersebut akan tetap tidak berubah.
### Kode untuk Menampilkan Data `Trebel_Biasa`
Anda telah memberikan contoh kode yang menampilkan data `Trebel_Biasa` pada `entry_trebel`. Mari kita tinjau kembali dan pastikan semuanya berfungsi dengan baik:
```python
# Misal get_data_from_db(1)[3] adalah Trebel_Biasa yang ingin diambil
# Pada progres 1, tidak ada penyesuaian pada nilai Trebel_Biasa
elif progres == 1 and mode == "naik":
entry_trebel.insert(0, data_gn_cyan_bawah[2])
# Pada progres 2, kurangi digit pada Trebel_Biasa sebanyak 1
elif progres == 2 and mode == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
# Pada progres 3, kurangi digit pada Trebel_Biasa sebanyak 2
elif progres == 3 and mode == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
```
### Penjelasan Kode
1. **Progres 1:**
- Nilai `Trebel_Biasa` ditampilkan langsung tanpa perubahan karena progres 1 berarti tidak ada penyesuaian yang diperlukan.
2. **Progres 2:**
- Fungsi `adjust_trebel_value()` digunakan untuk mengurangi setiap digit angka dalam `Trebel_Biasa` sebanyak 1.
3. **Progres 3:**
- Fungsi `adjust_trebel_value()` digunakan untuk mengurangi setiap digit angka dalam `Trebel_Biasa` sebanyak 2.
### Catatan Tambahan:
- Pastikan bahwa `get_data_from_db(1)[3]` mengembalikan nilai yang benar, yaitu nilai `Trebel_Biasa` yang diinginkan.
- Pastikan tidak ada kesalahan pada pengindeksan `data_gn_cyan_bawah[2]` dan `get_data_from_db(1)[3]`.
- Jika terjadi error seperti `NoneType: object is not subscriptable`, pastikan `get_data_from_db` benar-benar mengembalikan nilai yang diharapkan.
Dengan penyesuaian ini, data `Trebel_Biasa` yang ditampilkan di `entry_trebel` akan disesuaikan berdasarkan progres dan mode, sesuai yang Anda harapkan. Coba implementasikan ini dan periksa hasilnya untuk memastikan apakah sudah sesuai dengan kebutuhan Anda.
Untuk progres 2 dan Progres 3 sudah saya dapatkan. Tolong perbaiki kode dibawah ini untuk mendapatkan nilai data Trebel_Biasa di progres 1 yang hasilnya ditampilkan pada entry_trebel.
Berikut kode:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import os
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
def isi_trebel_biasa():
# Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas
bass_data = ambil_data_bass_1()
# Hanya ambil karakter pertama dari hasil otomatisasi
otomatis_angka_pertama = bass_data[0] # Mengambil karakter pertama saja
# Ambil input dari pengguna
inputan_pengguna = entry_trebel.get() # Mengambil keseluruhan input dari pengguna
# Gabungkan hasil otomatis dengan input pengguna
if len(inputan_pengguna) > 1:
data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:] # Gabungkan otomatis dan input pengguna
else:
data_trebel_biasa = otomatis_angka_pertama # Hanya gunakan otomatis jika tidak ada input lain
# Masukkan data_trebel_biasa ke Entry
entry_trebel.delete(0, tk.END)
entry_trebel.insert(0, data_trebel_biasa)
# Update data ke tabel Gn_Cyan_Bawah
update_data_trebel_biasa_ke_tabel(data_trebel_biasa)
def ambil_data_bass_1():
# Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas
# Misalnya:
return "123" # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas
def update_data_trebel_biasa_ke_tabel(data):
# Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah
pass
# Fungsi untuk mengambil data Trebel_Biasa dari Gn_Cyan_Bawah berdasarkan ID dan Level_Gn
# Fungsi untuk mengambil data dari database berdasarkan ID
def get_data_from_db(id_selected):
conn = sqlite3.connect("DATAMUSIK.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (id_selected,))
data = cursor.fetchone()
conn.close()
return data
# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres
def adjust_trebel_value(trebel_biasa_value, progres):
if trebel_biasa_value.isdigit():
# Kurangi nilai berdasarkan progres
adjusted_value = ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_biasa_value)
else:
# Jika bukan digit, biarkan nilainya tetap sama
adjusted_value = trebel_biasa_value
return adjusted_value
# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan 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()
nada_selected = nada_var.get().lower()
# Dapatkan data dari database
data_gn_cyan_bawah = get_data_from_db(id_selected)
if not data_gn_cyan_bawah:
messagebox.showerror("Error", "Data tidak ditemukan")
return
# Hapus data sebelumnya di EntryBox
entry_trebel.delete(0, tk.END)
# Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, Level_gn, Progres, Mode, dan Nada
if id_selected == 1 and level_gn_selected in [1, 5, 9]:
if progres_selected == 1 and progres_selected == "naik":
# Progres 1, Mode Naik
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 0))
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(1)[3], 2))
elif id_selected == 2 and level_gn_selected in [2, 6, 10]:
if progres_selected == 1 and mode_selected == "naik":
# Progres 1, Mode Naik
entry_trebel.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(2)[3], 2))
elif id_selected == 3 and level_gn_selected in [3, 7, 11]:
if progres_selected == 1 and mode_selected == "naik":
# Progres 1, Mode Naik
entry_trebel.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
elif progres_selected == 3 and mode_selected == "naik":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))
elif progres_selected == 1 and mode_selected == "turun":
# Progres 1, Mode Turun
entry_trebel.insert(0, trebel_biasa_value)
elif progres_selected == 2 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 1))
elif progres_selected == 3 and mode_selected == "turun":
entry_trebel.insert(0, adjust_trebel_value(get_data_from_db(3)[3], 2))
elif id_selected == 4 and level_gn_selected in [4, 8, 12]:
if progres_selected == 1 or progres_selected == 2 or progres_selected == 3:
messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")
elif mode_selected == "naik" or mode_selected == "turun":
messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")
else:
messagebox.showerror("Error", "ID dan Level_Gn tidak sesuai dengan logika")
return
messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")
except ValueError:
messagebox.showerror("Error", "ID dan progres harus berupa angka")
finally:
# Bersihkan atau reset entry dan combobox setelah data dipilih
entry_level_gn.delete(0, 'end')
entry_level_gn.delete(0, 'end')
entry_id.delete(0, 'end')
progres_combobox.set('') # Kosongkan combobox
mode_combobox.set('') # Kosongkan combobox
nada_combobox.set('') # Kosongkan combobox
# Fungsi untuk memastikan urutan Level_Gn dan ID
def level_gn():
try:
# Kondisi untuk Gn_Cyan_Bawah
level_gn_selected = int(entry_level_gn.get())
if level_gn_selected in [1, 5, 9]:
id_selected = 1
elif level_gn_selected in [2, 6, 10]:
id_selected = 2
elif level_gn_selected in [3, 7, 11]:
id_selected = 3
elif level_gn_selected in [4, 8, 12]:
id_selected = 4
else:
messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")
return None
# Memasukkan id_selected ke entry_id
entry_id.delete(0, 'end')
entry_id.insert(0, str(id_selected))
# Kondisi untuk Sub_Gn_Cyan_Bawah
if level_gn_selected in range(1, 13):
id_selected_sub = 1
return id_selected, id_selected_sub
except ValueError:
messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")
return None, None
# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah
Gn_Cyan_Bawah = True
Sub_Gn_Cyan_Bawah = False
frame_top = tk.Frame(root)
frame_top.pack()
label_level_gn = tk.Label(frame_top, text="Level_Gn:")
label_level_gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=2, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(frame_top, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=3, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(frame_top, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=4, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=5, column=0, padx=5, pady=5)
nada_var = tk.StringVar()
nada_combobox = ttk.Combobox(frame_top, textvariable=nada_var)
nada_combobox['values'] = ("trebel_biasa", "Trebel")
nada_combobox.grid(row=5, column=1, padx=5, pady=5)
separator = ttk.Separator(frame_top, orient='horizontal')
separator.grid(row=6, column=0, sticky="ew", pady=15)
# Hapus label, entry field, dan combobox untuk Progres dan Mode yang tidak digunakan lagi
# label_progres.grid_forget()
# progres_combobox.grid_forget()
# label_mode.grid_forget()
# mode_combobox.grid_forget()
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
#Label dan Entry Ambil Gugusan nada Teroilih
label_trebel = tk.Label(bottom_frame, text="Trebel Gn Cyan Bawah")
label_trebel.grid(row=7, column=3, padx=5, pady=5)
entry_trebel = tk.Entry(bottom_frame)
entry_trebel.grid(row=8, column=3, padx=5, pady=5)
label_sub_trebel = tk.Label(bottom_frame, text="Trebel Sub Gn Cyan Bawah:")
label_sub_trebel.grid(row=7, column=4, padx=5, pady=5)
entry_sub_trebel = tk.Entry(bottom_frame)
entry_sub_trebel.grid
(row=8, column=4, padx=5, pady=5)
# Tombol untuk memilih nada
select_button = tk.Button(bottom_frame, text="Pilih Nada", bg="green", fg="white", command=pilih_nada)
select_button.grid(row=5, column=1, padx=5, pady=5)
root.mainloop()
Untuk memperbaiki kode di bawah ini agar dapat memperoleh nilai `Trebel_Biasa` pada progres 1 dan menampilkannya di `entry_trebel`, beberapa perbaikan diperlukan, terutama pada logika di dalam fungsi `pilih_nada()`. Berikut adalah beberapa perubahan yang dilakukan:
1. **Memperbaiki Logika Pengisian `entry_trebel`:** Logika untuk pengisian `entry_trebel` di progres 1 diatur agar sesuai dengan logika pada tabel `Gn_Cyan_Bawah`.
2. **Menghapus Duplikasi Kode:** Menghindari pengulangan kode yang tidak perlu dengan menyederhanakan fungsi `pilih_nada()`.
Berikut adalah kode yang sudah diperbaiki:
```python
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
from tkinter import Tk, Label, Entry, Button, Frame, StringVar
import os
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik")
def isi_trebel_biasa():
# Ambil data otomatis dari Bass_1 di Gn_Cyan_Atas
bass_data = ambil_data_bass_1()
# Hanya ambil karakter pertama dari hasil otomatisasi
otomatis_angka_pertama = bass_data[0] # Mengambil karakter pertama saja
# Ambil input dari pengguna
inputan_pengguna = entry_trebel.get() # Mengambil keseluruhan input dari pengguna
# Gabungkan hasil otomatis dengan input pengguna
if len(inputan_pengguna) > 1:
data_trebel_biasa = otomatis_angka_pertama + inputan_pengguna[1:] # Gabungkan otomatis dan input pengguna
else:
data_trebel_biasa = otomatis_angka_pertama # Hanya gunakan otomatis jika tidak ada input lain
# Masukkan data_trebel_biasa ke Entry
entry_trebel.delete(0, tk.END)
entry_trebel.insert(0, data_trebel_biasa)
# Update data ke tabel Gn_Cyan_Bawah
update_data_trebel_biasa_ke_tabel(data_trebel_biasa)
def ambil_data_bass_1():
# Implementasikan logika untuk mengambil data Bass_1 dari Gn_Cyan_Atas
# Misalnya:
return "123" # Ini hanya contoh, sesuaikan dengan pengambilan data dari tabel Gn_Cyan_Atas
def update_data_trebel_biasa_ke_tabel(data):
# Implementasikan logika untuk mengupdate data ke tabel Gn_Cyan_Bawah
pass
# Fungsi untuk mengambil data dari database berdasarkan ID
def get_data_from_db(id_selected):
conn = sqlite3.connect("DATAMUSIK.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM Gn_Cyan_Bawah WHERE ID = ?", (id_selected,))
data = cursor.fetchone()
conn.close()
return data
# Fungsi untuk menyesuaikan nilai Trebel berdasarkan progres
def adjust_trebel_value(trebel_biasa_value, progres):
if trebel_biasa_value.isdigit():
# Kurangi nilai berdasarkan progres
adjusted_value = ''.join(str(int(char) - progres) if char.isdigit() else char for char in trebel_biasa_value)
else:
# Jika bukan digit, biarkan nilainya tetap sama
adjusted_value = trebel_biasa_value
return adjusted_value
# Fungsi untuk memilih nada Trebel_Biasa berdasarkan ID, progres, mode, level_gn, dan 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()
nada_selected = nada_var.get().lower()
# Dapatkan data dari database
data_gn_cyan_bawah = get_data_from_db(id_selected)
if not data_gn_cyan_bawah:
messagebox.showerror("Error", "Data tidak ditemukan")
return
# Hapus data sebelumnya di EntryBox
entry_trebel.delete(0, tk.END)
# Logika pengisian data Trebel_Biasa ke EntryBox berdasarkan ID, Level_gn, Progres, Mode, dan Nada
if progres_selected == 1:
# Progres 1 untuk Mode Naik dan Turun
entry_trebel.insert(0, data_gn_cyan_bawah[3])
else:
if id_selected == 1 and level_gn_selected in [1, 5, 9]:
entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))
elif id_selected == 2 and level_gn_selected in [2, 6, 10]:
entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))
elif id_selected == 3 and level_gn_selected in [3, 7, 11]:
entry_trebel.insert(0, adjust_trebel_value(data_gn_cyan_bawah[3], progres_selected - 1))
elif id_selected == 4 and level_gn_selected in [4, 8, 12]:
messagebox.showerror("Error", "ID hanya ada 3 baris boleh diinput")
return
else:
messagebox.showerror("Error", "ID dan Level_Gn tidak sesuai dengan logika")
return
messagebox.showinfo("Success", "Data berhasil diambil dan disesuaikan")
except ValueError:
messagebox.showerror("Error", "ID dan progres harus berupa angka")
finally:
# Bersihkan atau reset entry dan combobox setelah data dipilih
entry_level_gn.delete(0, 'end')
entry_id.delete(0, 'end')
progres_combobox.set('') # Kosongkan combobox
mode_combobox.set('') # Kosongkan combobox
nada_combobox.set('') # Kosongkan combobox
# Fungsi untuk memastikan urutan Level_Gn dan ID
def level_gn():
try:
# Kondisi untuk Gn_Cyan_Bawah
level_gn_selected = int(entry_level_gn.get())
if level_gn_selected in [1, 5, 9]:
id_selected = 1
elif level_gn_selected in [2, 6, 10]:
id_selected = 2
elif level_gn_selected in [3, 7, 11]:
id_selected = 3
elif level_gn_selected in [4, 8, 12]:
id_selected = 4
else:
messagebox.showerror("Error", "Level_Gn ada 1-12. L-1 = L-5 = L-9 = ID 1, L-2 = L-6 = L-10 = ID 2, L-3 = L-7 = L-11 = ID 3, L-4 = L-8 = L-12 = ID 4")
return None
# Memasukkan id_selected ke entry_id
entry_id.delete(0, 'end')
entry_id.insert(0, str(id_selected))
# Kondisi untuk Sub_Gn_Cyan_Bawah
if level_gn_selected in range(1, 13):
id_selected_sub = 1
return id_selected, id_selected_sub
except ValueError:
messagebox.showerror("Error", "Masukkan nilai Level_Gn yang valid!")
return None, None
# Misalkan ini adalah daftar data untuk Gn_Cyan_Bawah atau Sub_Gn_Cyan_Bawah
Gn_Cyan_Bawah = True
Sub_Gn_Cyan_Bawah = False
frame_top = tk.Frame(root)
frame_top.pack()
label_level_gn = tk.Label(frame_top, text="Level_Gn:")
label_level_gn.grid(row=1, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(frame_top)
entry_level_gn.grid(row=1, column=1, padx=5, pady=5)
label_id = tk.Label(frame_top, text="ID:")
label_id.grid(row=2, column=0, padx=5, pady=5)
entry_id = tk.Entry(frame_top)
entry_id.grid(row=2, column=1, padx=5, pady=5)
label_progres = tk.Label(frame_top, text="Progres:")
label_progres.grid(row=3, column=0, padx=5, pady=5)
progres_combobox = ttk.Combobox(frame_top, textvariable=StringVar(), values=[1, 2, 3])
progres_combobox.grid(row=3, column=1, padx=5, pady=5)
label_mode = tk.Label(frame_top, text="Mode:")
label_mode.grid(row=4, column=0, padx=5, pady=5)
mode_combobox = ttk.Combobox(frame_top, textvariable=StringVar(), values=["nai
k", "turun"])
mode_combobox.grid(row=4, column=1, padx=5, pady=5)
label_nada = tk.Label(frame_top, text="Nada:")
label_nada.grid(row=5, column=0, padx=5, pady=5)
Selesai......
Komentar
Posting Komentar
This Message