PEMBUATAN PARTITURE NOTASI ANGKA LAGU (Part-3)
Maunya kita, pengguliran ada pada semua konten isi file partitur_notasi_angka.py sehingga semua elemen GUI dapat digulir ke segala arah.
Untuk menambahkan fungsi pengguliran ke segala arah (baik vertikal maupun horizontal) pada semua elemen GUI dalam aplikasi tkinter, kamu bisa menggunakan widget `tk.Canvas` dan `tk.Scrollbar`. Berikut adalah cara menambahkan fitur ini di sekitar seluruh konten agar aplikasi kamu dapat digulir ke segala arah.
Pada dasarnya, kita akan meletakkan semua elemen GUI ke dalam sebuah `Frame` yang kemudian dimasukkan ke dalam `Canvas`. Lalu, kita menambahkan scrollbars vertikal dan horizontal di sekitar `Canvas` tersebut.
Berikut adalah modifikasi kode `partitur_notasi_angka.py` yang mendukung scroll di segala arah:
```python
import tkinter as tk
from tkinter import filedialog, messagebox
# Fungsi untuk menampilkan placeholder pada entry
def set_placeholder(entry, placeholder_text):
entry.insert(0, placeholder_text)
entry.config(fg="grey")
def on_focus_in(event):
if entry.get() == placeholder_text:
entry.delete(0, tk.END)
entry.config(fg="black")
def on_focus_out(event):
if entry.get() == "":
entry.insert(0, placeholder_text)
entry.config(fg="grey")
entry.bind("<FocusIn>", on_focus_in)
entry.bind("<FocusOut>", on_focus_out)
# Fungsi untuk menampilkan partitur dengan detail tambahan dan memungkinkan pengguna mengedit notasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, f"Judul Lagu : \n")
output_text.insert(tk.END, f"Nada Dasar : \n")
output_text.insert(tk.END, f"Tanda Birama : \n")
output_text.insert(tk.END, f"Pencipta : \n")
output_text.insert(tk.END, f"Arranger : \n")
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n")
output_text.insert(tk.END, " \n \n")
# Fungsi untuk menyimpan perubahan
def save_partitur():
edited_text = output_text.get(1.0, tk.END).strip()
file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])
if file_path:
try:
with open(file_path, 'w') as file:
file.write(edited_text)
messagebox.showinfo("Sukses", "Partitur berhasil disimpan.")
except Exception as e:
messagebox.showerror("Error", f"Gagal menyimpan partitur: {e}")
# Fungsi untuk mempastekan data dari temp_gn_value.txt ke output_text
def paste_gn():
try:
with open("temp_gn_value.txt", "r") as temp_file:
gn_value = temp_file.read()
output_text.insert(tk.END, gn_value)
except FileNotFoundError:
output_text.insert(tk.END, "Tidak ada data yang dicopy.")
# Setup UI
root = tk.Tk()
root.title("Notasi Angka Lagu")
# Membuat Canvas untuk scrollbars
canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Membuat Scrollbars vertikal dan horizontal
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
# Membuat Frame dalam Canvas untuk menempatkan semua elemen
frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=frame, anchor="nw")
# Fungsi untuk mengatur scroll region sesuai ukuran konten
def update_scroll_region(event):
canvas.config(scrollregion=canvas.bbox("all"))
frame.bind("<Configure>", update_scroll_region)
# Entry untuk judul lagu
judul_entry = tk.Entry(frame, justify="center")
judul_entry.grid(row=0, column=1, padx=5, pady=5)
set_placeholder(judul_entry, "Judul Lagu")
# Entry untuk nada dasar lagu
nada_entry = tk.Entry(frame, justify="center")
nada_entry.grid(row=1, column=1, padx=5, pady=5)
set_placeholder(nada_entry, "Nada Dasar")
# Entry untuk tanda sukat (birama) lagu
birama_entry = tk.Entry(frame, justify="center")
birama_entry.grid(row=2, column=1, padx=5, pady=5)
set_placeholder(birama_entry, "Tanda Birama")
# Entry untuk pencipta lagu
pencipta_entry = tk.Entry(frame, justify="center")
pencipta_entry.grid(row=3, column=1, padx=5, pady=5)
set_placeholder(pencipta_entry, "Pencipta")
# Entry untuk arranger lagu
arranger_entry = tk.Entry(frame, justify="center")
arranger_entry.grid(row=4, column=1, padx=5, pady=5)
set_placeholder(arranger_entry, "Arranger")
# Tombol untuk menampilkan partitur
show_button = tk.Button(frame, text="Tampilkan Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=5, column=0, padx=5, pady=10)
# Tombol untuk menyimpan partitur
save_button = tk.Button(frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=5, column=2, padx=5, pady=10)
# Tombol untuk mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=5, column=1, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=6, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(frame, height=25, width=80, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal
output_text.grid(row=7, column=0, columnspan=3, padx=10, pady=10)
# Scrollbar khusus untuk Text Box (output_text)
text_scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL, command=output_text.yview)
output_text.configure(yscrollcommand=text_scrollbar_y.set)
text_scrollbar_y.grid(row=7, column=3, sticky='ns')
text_scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=output_text.xview)
output_text.configure(xscrollcommand=text_scrollbar_x.set)
text_scrollbar_x.grid(row=8, column=0, columnspan=3, sticky='ew')
# Mengaktifkan scroll di canvas
canvas.bind_all("<MouseWheel>", lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
canvas.bind_all("<Shift-MouseWheel>", lambda event: canvas.xview_scroll(int(-1*(event.delta/120)), "units"))
root.mainloop()
```
### Perubahan utama:
1. **Canvas**: Membuat `Canvas` sebagai wadah untuk elemen-elemen lain agar bisa digulir ke segala arah.
2. **Scrollbars**: Ditambahkan `Scrollbar` vertikal dan horizontal, serta disambungkan dengan `Canvas`.
3. **Text Widget**: Untuk `Text` (area teks yang dapat diedit), scrollbars vertikal dan horizontal khusus diterapkan dengan `wrap=tk.NONE` agar memungkinkan pengguliran horizontal.
### Penggunaan:
- Seluruh elemen GUI sekarang bisa digulir ke atas, bawah, kiri, dan kanan.
- Text box juga mendukung scroll ke segala arah, sehingga pengguna dapat mengedit partitur dengan nyaman.
Bagian mana yang mengatur tulisan teks pada output_text agar masuk (menjorot) ke dalam
Bagian yang mengatur agar teks pada `output_text` bisa masuk (atau menjorot) ke dalam biasanya melibatkan fungsi **indentasi**. Sayangnya, `Text` widget di tkinter tidak memiliki dukungan bawaan untuk indentasi otomatis seperti pada editor teks biasa, namun kita dapat mengatur indentasi secara manual dengan menggunakan tag.
Berikut adalah langkah-langkah untuk menambahkan indentasi pada `Text` widget dengan menggunakan tag:
1. **Menambahkan tag untuk indentasi**: Tag pada `Text` widget digunakan untuk mengubah format pada bagian tertentu dari teks (misalnya, menambahkan indentasi).
2. **Mengatur tab stop**: Kita bisa mengatur tab stop sehingga ketika pengguna menekan tombol `Tab` atau menggunakan format tertentu, teks akan ter-indentasi.
Contoh modifikasi pada kode yang mengatur indentasi teks di dalam `Text` widget (`output_text`):
```python
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40) # lmargin1 untuk baris pertama, lmargin2 untuk baris berikutnya
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, f"Judul Lagu : \n", "indent")
output_text.insert(tk.END, f"Nada Dasar : \n", "indent")
output_text.insert(tk.END, f"Tanda Birama : \n", "indent")
output_text.insert(tk.END, f"Pencipta : \n", "indent")
output_text.insert(tk.END, f"Arranger : \n", "indent")
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
output_text.insert(tk.END, " \n \n", "indent")
```
### Penjelasan:
- **`tag_configure("indent", lmargin1=40, lmargin2=40)`**: Membuat tag bernama `"indent"` yang mengatur margin kiri untuk teks. `lmargin1` adalah margin untuk baris pertama, dan `lmargin2` adalah margin untuk baris-baris berikutnya.
- **`output_text.insert(..., "indent")`**: Setiap kali teks dimasukkan ke dalam `Text` widget, tag `"indent"` ditambahkan sebagai parameter agar teks tersebut mengikuti aturan indentasi yang sudah kita atur.
Dengan konfigurasi di atas, teks yang dihasilkan dalam `output_text` akan otomatis menjorot ke dalam dengan jarak margin yang kamu tentukan.
Kamu bisa menyesuaikan nilai `lmargin1` dan `lmargin2` sesuai kebutuhan untuk mengatur seberapa jauh indentasinya.
Dari deskripsi kode dan tujuan untuk indentasi teks di `output_text`, bagian yang mengatur indentasi adalah baris yang menggunakan `tag_configure` pada widget `Text`. Berikut adalah langkah-langkah penjelasan dan bagian penting yang berperan dalam mengatur indentasi:
1. **Tag Configuration for Indentation**:
Di dalam kode `partitur_notasi_angka.py`, bagian yang menangani indentasi adalah:
```python
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
```
Pada baris ini:
- `lmargin1=40` mengatur jarak indentasi untuk baris pertama setiap paragraf.
- `lmargin2=40` mengatur jarak indentasi untuk baris-baris berikutnya dari paragraf yang sama.
2. **Penerapan Tag ke Teks**:
Saat menambahkan teks ke widget `Text`, tag `indent` diterapkan dengan menggunakan perintah:
```python
output_text.insert(tk.END, "Teks yang ingin ditampilkan", "indent")
```
Di sini, teks yang diinsert ke dalam `output_text` akan menerima indentasi yang sudah ditentukan oleh tag `indent`.
### Penerapan:
Jika ingin menampilkan teks dengan indentasi (menjorok ke dalam), pastikan setiap teks yang ingin diindentasikan menggunakan tag `"indent"`. Kode untuk menampilkan teks dengan indentasi adalah sebagai berikut:
```python
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, f"Judul Lagu : \n", "indent")
output_text.insert(tk.END, f"Nada Dasar : \n", "indent")
output_text.insert(tk.END, f"Tanda Birama : \n", "indent")
output_text.insert(tk.END, f"Pencipta : \n", "indent")
output_text.insert(tk.END, f"Arranger : \n", "indent")
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
output_text.insert(tk.END, " \n \n", "indent")
```
Ini akan menampilkan setiap teks di dalam `output_text` dengan jarak indentasi yang sama, baik untuk baris pertama maupun baris selanjutnya, seperti yang diatur oleh `lmargin1` dan `lmargin2`.
Jadi kode selengkapnya untuk file partitur_notasi_angka.py adalah berikut:
import tkinter as tk
from tkinter import filedialog, messagebox
# Fungsi untuk menampilkan placeholder pada entry
def set_placeholder(entry, placeholder_text):
entry.insert(0, placeholder_text)
entry.config(fg="grey")
def on_focus_in(event):
if entry.get() == placeholder_text:
entry.delete(0, tk.END)
entry.config(fg="black")
def on_focus_out(event):
if entry.get() == "":
entry.insert(0, placeholder_text)
entry.config(fg="grey")
entry.bind("<FocusIn>", on_focus_in)
entry.bind("<FocusOut>", on_focus_out)
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, f"Judul Lagu : \n", "indent")
output_text.insert(tk.END, f"Nada Dasar : \n", "indent")
output_text.insert(tk.END, f"Tanda Birama : \n", "indent")
output_text.insert(tk.END, f"Pencipta : \n", "indent")
output_text.insert(tk.END, f"Arranger : \n", "indent")
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
output_text.insert(tk.END, " \n \n", "indent")
# Fungsi untuk menyimpan perubahan
def save_partitur():
edited_text = output_text.get(1.0, tk.END).strip()
file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])
if file_path:
try:
with open(file_path, 'w') as file:
file.write(edited_text)
messagebox.showinfo("Sukses", "Partitur berhasil disimpan.")
except Exception as e:
messagebox.showerror("Error", f"Gagal menyimpan partitur: {e}")
# Fungsi untuk mempastekan data dari temp_gn_value.txt ke output_text
def paste_gn():
try:
with open("temp_gn_value.txt", "r") as temp_file:
gn_value = temp_file.read()
output_text.insert(tk.END, gn_value)
except FileNotFoundError:
output_text.insert(tk.END, "Tidak ada data yang dicopy.")
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Notasi Angka Lagu")
# Membuat Canvas untuk scrollbars
canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Membuat Scrollbars vertikal dan horizontal
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
# Membuat Frame dalam Canvas untuk menempatkan semua elemen
frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=frame, anchor="nw")
# Fungsi untuk mengatur scroll region sesuai ukuran konten
def update_scroll_region(event):
canvas.config(scrollregion=canvas.bbox("all"))
frame.bind("<Configure>", update_scroll_region)
# Entry untuk judul lagu
judul_entry = tk.Entry(frame, justify="center")
judul_entry.grid(row=0, column=1, padx=5, pady=5)
set_placeholder(judul_entry, "Judul Lagu")
# Entry untuk nada dasar lagu
nada_entry = tk.Entry(frame, justify="center")
nada_entry.grid(row=1, column=1, padx=5, pady=5)
set_placeholder(nada_entry, "Nada Dasar")
# Entry untuk tanda sukat (birama) lagu
birama_entry = tk.Entry(frame, justify="center")
birama_entry.grid(row=2, column=1, padx=5, pady=5)
set_placeholder(birama_entry, "Tanda Birama")
# Entry untuk pencipta lagu
pencipta_entry = tk.Entry(frame, justify="center")
pencipta_entry.grid(row=3, column=1, padx=5, pady=5)
set_placeholder(pencipta_entry, "Pencipta")
# Entry untuk arranger lagu
arranger_entry = tk.Entry(frame, justify="center")
arranger_entry.grid(row=4, column=1, padx=5, pady=5)
set_placeholder(arranger_entry, "Arranger")
# Tombol untuk menampilkan partitur
show_button = tk.Button(frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=5, column=0, padx=5, pady=10)
# Tombol untuk mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=5, column=1, padx=5, pady=5)
# Tombol untuk menyimpan partitur
save_button = tk.Button(frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=5, column=2, padx=5, pady=10)
# Label instruksi di atas output_text
instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=6, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(frame, height=60, width=64, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal
output_text.grid(row=7, column=0, columnspan=3, padx=10, pady=10)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40) # lmargin1 untuk baris pertama, lmargin2 untuk baris berikutnya
# Scrollbar khusus untuk Text Box (output_text)
text_scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL, command=output_text.yview)
output_text.configure(yscrollcommand=text_scrollbar_y.set)
text_scrollbar_y.grid(row=7, column=3, sticky='ns')
text_scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=output_text.xview)
output_text.configure(xscrollcommand=text_scrollbar_x.set)
text_scrollbar_x.grid(row=8, column=0, columnspan=3, sticky='ew')
# Mengaktifkan scroll di canvas
canvas.bind_all("<MouseWheel>", lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
canvas.bind_all("<Shift-MouseWheel>", lambda event: canvas.xview_scroll(int(-1*(event.delta/120)), "units"))
root.mainloop()
Dan kode selengkapnya untuk file CRUD gn a bass.py adalah berikut:
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import sqlite3
import os # untuk membuka file partitur_notasi_angka.py
# Initialize the main window
root = tk.Tk()
root.geometry("690x1390")
root.title("Arah Arus Musik Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas")
# Bottom Frame
bottom_frame = tk.Frame(root, bg="#e2e2e2")
bottom_frame.pack(side=tk.TOP, fill=tk.X)
# 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 = 1")
set_id_entry(1)
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 = 3")
set_id_entry(3)
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)
# 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
gn_a_bass_entry.delete(0, tk.END)
gn_a_bass_entry.insert(0, result["Gugusan_nada"])
except Exception as e:
print("Error:", e)
finally:
# Menghapus status read-only sementara
entry_id.config(state='normal')
# Bersihkan atau reset entry dan combobox setelah tombol pilih_nada ditekan
entry_level_gn.delete(0, 'end')
entry_id.delete(0, 'end')
progres_combobox.set('')
mode_combobox.set('')
# Kembalikan status read-only setelah menghapus isinya
entry_id.config(state='readonly')
reset_entries()
# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres
def apply_level_adjustment(value, level_gn_selected):
# Tentukan pengurang berdasarkan level_gn
if level_gn_selected in [1, 2, 3]:
pengurang = 0
elif 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
# Sesuaikan nilai string berdasarkan pengurang
adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())
return adjusted_value
# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada
def level_gn(id, progres_selected, mode_selected, level_gn_selected):
conn = sqlite3.connect('DATAMUSIK.db')
cursor = conn.cursor()
# Query untuk pengambilan data dari tabel Gn_A_Bass
query = """
SELECT Gugusan_nada
FROM Gn_A_Bass
WHERE ID = ?
"""
cursor.execute(query, (id,))
data = cursor.fetchone()
gugusan_nada = data[0]
# Sesuaikan nilai Bass hanya berdasarkan level_gn
gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)
conn.close()
# Return hasil
result = {
"Gugusan_nada": gugusan_nada
}
return result
# Tambahkan tombol untuk memvalidasi level_gn
validate_button = tk.Button(bottom_frame, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)
validate_button.grid(row=3, column=2, padx=0, pady=7)
# Tombol untuk memproses pemilihan nada
button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)
button_pilih_nada.grid(row=8, column=1, padx=5, pady=5)
separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=9, column=0, sticky="ew", pady=15)
#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih
gugusan_label = tk.Label(bottom_frame, text="Gn_A_Bass", fg="tomato")
gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")
# Labels dan Entries
label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")
label_level_gn.grid(row=3, column=0, padx=5, pady=5)
entry_level_gn = tk.Entry(bottom_frame)
entry_level_gn.grid(row=3, column=1, padx=5, pady=5)
label_id = tk.Label(bottom_frame, text="ID:")
label_id.grid(row=4, column=0, padx=5, pady=5)
entry_id = tk.Entry(bottom_frame)
entry_id.grid(row=4, column=1, padx=5, pady=5)
label_progres = tk.Label(bottom_frame, text="Progres:")
label_progres.grid(row=5, column=0, padx=5, pady=5)
progres_var = tk.StringVar()
progres_combobox = ttk.Combobox(bottom_frame, textvariable=progres_var)
progres_combobox['values'] = (1, 2, 3)
progres_combobox.grid(row=5, column=1, padx=5, pady=5)
label_mode = tk.Label(bottom_frame, text="Mode:")
label_mode.grid(row=6, column=0, padx=5, pady=5)
mode_var = tk.StringVar()
mode_combobox = ttk.Combobox(bottom_frame, textvariable=mode_var)
mode_combobox['values'] = ("Naik", "Turun")
mode_combobox.grid(row=6, column=1, padx=5, pady=5)
separator = ttk.Separator(bottom_frame, orient='horizontal')
separator.grid(row=7, column=0, sticky="ew", pady=4)
# Gugusan Nada Terpilih Field
Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")
Gn_tetpilih_label.grid(row=11, column=0, padx=5, pady=5)
# Label dan Entry
gn_a_bass_label = tk.Label(bottom_frame, text="Bass")
gn_a_bass_label.grid(row=10, column=1, padx=10, pady=5)
gn_a_bass_entry = tk.Entry(bottom_frame, bg="white")
gn_a_bass_entry.grid(row=11, column=1, padx=10, pady=5)
def buka_partitur():
filepath = "partitur_notasi_angka.py"
try:
with open(filepath, 'r') as file:
exec(file.read(), globals())
messagebox.showinfo("Success", "File executed successfully")
except Exception as e:
messagebox.showerror("Error", f"Failed to execute file: {e}")
def copy_gn():
# Ambil nilai dari entry gn_a_bass_entry
gn_value = gn_a_bass_entry.get()
# Simpan nilai ke clipboard (opsional)
root.clipboard_clear()
root.clipboard_append(gn_value)
# Simpan nilai gn_value ke file sementara
with open("temp_gn_value.txt", "w") as temp_file:
temp_file.write(gn_value)
# Buka file partitur_notasi_angka.py
os.system('python partitur_notasi_angka.py')
def copy_dan_buka_partitur():
# Copy gn_a_bass_entry
copy_gn()
# Buka partitur
buka_partitur()
# Tombol Copy sekaligus Buka Partitur
button_copy_gn_buka = tk.Butt
on(bottom_frame, text="Copy & Buka Partitur", bg="grey", fg="white", command=copy_dan_buka_partitur)
button_copy_gn_buka.grid(row=12, column=1)
button_buka_partitur = tk.Button(bottom_frame, text="Buka Partitur", bg="grey", fg="white", command=buka_partitur)
button_buka_partitur.grid(row=12, column=2, padx=5, pady=5)
root.mainloop()
Kode yang Anda bagikan terlihat sudah mendekati lengkap untuk kedua file yang Anda ingin buat, yaitu `partitur_notasi_angka.py` dan `CRUD gn a bass.py`. Namun, ada sedikit bagian di akhir pada fungsi `apply_level_adjustment` yang belum selesai, serta beberapa area kecil yang mungkin bisa diperbaiki untuk menjaga konsistensi dan kesesuaian fungsionalitas.
Saya akan melengkapi kode yang hilang dan memberikan saran lebih lanjut.
### Lengkapi Fungsi `apply_level_adjustment`:
Pada file `CRUD gn a bass.py`, fungsi `apply_level_adjustment` perlu dilengkapi dengan logika pengurangan nilai berdasarkan `level_gn`. Anda mungkin ingin menggunakan ini untuk menyesuaikan nilai tertentu berdasarkan level, tergantung pada kebutuhan aplikasi.
Berikut adalah kelengkapan untuk fungsi tersebut:
```python
# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres
def apply_level_adjustment(value, level_gn_selected):
# Tentukan pengurang berdasarkan level_gn
if level_gn_selected in [1, 2, 3]:
pengurang = 0
elif 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
# Sesuaikan nilai string berdasarkan pengurang
adjusted_value = ''.join(
str(int(char) - pengurang) if char.isdigit() else char for char in value
)
return adjusted_value
```
Pada fungsi ini, nilai `value` (yang diasumsikan sebagai string) akan disesuaikan berdasarkan level `gn_selected`, dengan setiap karakter numerik dikurangi oleh `pengurang` sesuai level.
### Pengelolaan Scroll dan Ukuran Tampilan
Di bagian file `partitur_notasi_angka.py`, pengaturan scroll dan kanvas sudah baik, namun pastikan ukuran jendela (`690x1390`) sesuai dengan kebutuhan layar pengguna. Jika ukuran terlalu besar atau kecil, Anda bisa mempertimbangkan opsi untuk mengubahnya secara dinamis.
Dengan modifikasi-modifikasi ini, kedua file Anda sudah lengkap dan siap untuk diimplementasikan dalam aplikasi berbasis tkinter. Jika ada pertanyaan lebih lanjut atau butuh bantuan tambahan untuk bagian spesifik, jangan ragu untuk bertanya!
Selesai...
Komentar
Posting Komentar
This Message