MEMASUKKAN SIMBOL NOTASI ANGKA PADA FUNGSI Insert_Symbol
Bagaimana kalau pada kode berikut:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import font
from PIL import Image, ImageDraw, ImageFont
# 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, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\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("Pertitur Notasi Angka dengan Font Khusus")
# 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"))
# Menggunakan font Parnumation (pastikan sudah terpasang di sistem)
custom_font = font.Font(family="Parnumation", size=20)
# Membuat Label untuk menampilkan teks dengan font Parnumation
label = tk.Label(root, text="12345 𝄞♯♭𝄢", font=custom_font)
label.pack(pady=20)
# Fungsi untuk membuat partitur notasi angka dengan font Parnumation
def buat_partitur_notasi_angka(teks_notasi, output_file):
# Tentukan lokasi file font
font_path = "/storage/emulated/0/NadaPL/KGNS-NPL/Parnumation 3.ttf"
# Tentukan ukuran font
font_size = 40
# Muat font menggunakan Pillow
try:
custom_font = ImageFont.truetype(font_path, font_size)
except IOError:
print("Font tidak ditemukan atau tidak bisa dimuat.")
return
# Buat gambar baru (misalnya kanvas putih)
image = Image.new("RGB", (500, 200), (255, 255, 255))
# Gambar teks di atas gambar
draw = ImageDraw.Draw(image)
# Gambar teks ke gambar dengan font Parnumation
draw.text((10, 50), teks_notasi, font=custom_font, fill=(0, 0, 0))
# Simpan gambar ke dalam file
image.save(output_file)
print(f"Gambar notasi angka disimpan sebagai '{output_file}'")
# Contoh pemanggilan fungsi dengan teks notasi angka dan lokasi output file
if __name__ == "__main__":
teks_notasi = "1 2 3 4 ♯ ♭" # Teks notasi angka yang ingin ditampilkan
output_file = "/storage/emulated/0/NadaPL/KGNS-NPL/output_notasi.png"
# Buat partitur notasi angka
buat_partitur_notasi_angka(teks_notasi, output_file)
root.mainloop()
Pada tampilan GUI dibagian paling atas dibuatkan sebuah kotak besar, lalu di dalam kotak tersebut diisikan simbol simbol notasi angka lagu yang penting penting saja seperti: tanda titik (.) di atas nada sebagai tanda nada tinggi, simbol titik (.) di bawah nada sebagai tanda nada rendah, simbol satu titik (.) di samping nada sebagai tanda jumlah dan panjang 1 ketuk, simbol dua titik (..) di samping nada sebagai tanda jumlah dan panjang 2 ketuk, simbol tiga titik (...) di samping nada sebagai tanda jumlah dan panjang 3 ketuk, simbol garis tegak (|) sebagai tanda batas antar birama, simbol garis tegak tipis dan tipis (||) sebagai tanda garis birama penutup sementara dan lanjut ke reff, simbol garis tegak tipis dan tebal (||) sebagai tanda garis birama penutup akhir lagu, simbol titik dua dan garis tegak ganda (:||) sebagai tanda ulang (repeat), simbol garis miring ke kanan (/) sebagai tanda menaikkan setengah nada dari nada asli, simbol garis miring ke kiri (\) sebagai tanda menurunkan setengah nada dari nada asli, simbol garis atas mendatar (-) sebagai tanda bendera, simbol garis melengkung ( ) sebagai tanda legato atau nada dinyanyikan secara bersambung, simbol huruf besar di atas nada (G) sebagai tanda kunci akord lagu, simbol apostrof atau tanda petik satu (') sebagai tanda pengambilan nafas, simbol angka nol (0) sebagai tanda diam bernilai 1 ketuk, bahkan simbol simbol notasi angka yang lainnya yang belum saya sebutkan di atas
import tkinter as tk
from tkinter import font
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\n", "indent")
output_text.insert(tk.END, " \n \n", "indent")
# Setup UI
root = tk.Tk()
root.geometry("700x800")
root.title("Editor Partitur Notasi Angka")
# Membuat frame untuk partitur
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Entry untuk judul lagu
judul_entry = tk.Entry(frame, justify="center")
judul_entry.grid(row=0, 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=1, column=0, padx=5, pady=5, columnspan=3)
# Output text box untuk partitur
output_text = tk.Text(frame, height=20, width=80, wrap=tk.NONE)
output_text.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
# Dropdown untuk simbol notasi
symbol_options = [
".", ":", "|", "||", ":||", "/", "\\", "-", "(", ")", "G", "'",
"0", "♯", "♭", "𝄢" # Simbol-simbol notasi lainnya bisa ditambahkan
]
selected_symbol = tk.StringVar()
selected_symbol.set(symbol_options[0]) # Set simbol default
symbol_menu = tk.OptionMenu(frame, selected_symbol, *symbol_options)
symbol_menu.grid(row=3, column=0, padx=5, pady=10)
# Tombol untuk memasukkan simbol yang dipilih
insert_button = tk.Button(frame, text="Masukkan Simbol", command=lambda: insert_symbol(selected_symbol.get()))
insert_button.grid(row=3, column=1, padx=5, pady=10)
# Tombol untuk menampilkan partitur
show_button = tk.Button(frame, text="Tampil Partitur", command=show_partitur)
show_button.grid(row=3, column=2, padx=5, pady=10)
root.mainloop()
Maunya kita, simbol simbol tersebut jangan di ootion_menu, tetapi masing masing simbol adalah tersendiri di kotak kecil masing masing simbol, agar supaya user mudah meng-klik satu simbol lalu menempelkannya pada lembaran musik (partitur) lagu
Jika tujuan Anda adalah membuat simbol-simbol notasi berada dalam kotak-kotak kecil secara terpisah (seperti tombol-tombol kecil), maka kita bisa menggunakan beberapa `Button` untuk masing-masing simbol, yang kemudian bisa di-klik oleh user untuk memasukkannya langsung ke dalam partitur.
Berikut adalah contoh implementasinya:
### Contoh Kode:
```python
import tkinter as tk
from tkinter import font
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\n", "indent")
output_text.insert(tk.END, " \n \n", "indent")
# Setup UI
root = tk.Tk()
root.geometry("700x800")
root.title("Editor Partitur Notasi Angka")
# Membuat frame untuk partitur
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Entry untuk judul lagu
judul_entry = tk.Entry(frame, justify="center")
judul_entry.grid(row=0, 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=1, column=0, padx=5, pady=5, columnspan=3)
# Output text box untuk partitur
output_text = tk.Text(frame, height=20, width=80, wrap=tk.NONE)
output_text.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
# Simbol notasi yang akan digunakan
symbol_options = [
".", ":", "|", "||", ":||", "/", "\\", "-", "(", ")", "G", "'",
"0", "♯", "♭", "𝄢" # Simbol-simbol notasi lainnya bisa ditambahkan
]
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(root)
symbol_frame.pack(padx=10, pady=10)
# Loop untuk membuat tombol untuk setiap simbol
for i, symbol in enumerate(symbol_options):
button = tk.Button(symbol_frame, text=symbol, width=4, command=lambda s=symbol: insert_symbol(s))
button.grid(row=i // 6, column=i % 6, padx=5, pady=5)
# Tombol untuk menampilkan partitur
show_button = tk.Button(root, text="Tampil Partitur", command=show_partitur)
show_button.pack(pady=10)
root.mainloop()
```
### Penjelasan Kode:
1. **Simbol sebagai Tombol (Button)**:
- Setiap simbol notasi seperti ".", ":", "|", "/", dll., diletakkan di dalam tombol kecil yang bisa di-klik oleh pengguna.
- Simbol diletakkan dalam grid di dalam `symbol_frame`. Dengan loop, kita secara otomatis menempatkan simbol-simbol tersebut di dalam grid yang rapi.
- Saat tombol di-klik, simbol yang dipilih akan dimasukkan ke dalam partitur pada posisi kursor.
2. **Layout Tombol Simbol**:
- Setiap baris memiliki 6 tombol, namun jumlah ini bisa diubah sesuai preferensi. Pada kode ini, tombol diatur menggunakan perhitungan baris dan kolom (`i // 6` dan `i % 6`) untuk memastikan grid yang rapi.
3. **Tampilan Partitur**:
- Simbol yang dipilih ditambahkan ke dalam `Text` widget di posisi di mana kursor berada. Ini memberikan fleksibilitas kepada pengguna untuk menempatkan simbol di lokasi yang diinginkan di lembaran partitur.
### Keuntungan Pendekatan Ini:
- **Kemudahan Akses**: User bisa langsung mengklik simbol yang diinginkan tanpa perlu membuka dropdown.
- **Penempatan Simbol Otomatis**: Simbol akan ditempelkan di posisi terakhir dari kursor, sehingga pengguna dapat dengan cepat mengedit partitur sesuai kebutuhan.
Dengan pendekatan ini, antarmuka editor notasi angka Anda akan menjadi lebih interaktif dan mudah digunakan. Jika ada simbol notasi lain yang perlu ditambahkan, Anda hanya perlu menambahkannya ke dalam daftar `symbol_options`.
Maksud saya, perbaiki kode berikut agar supaya semua simbol simbol notasi angka dapat tampil di bagian atas GUI di bagian atas entries yang ada. Berikut kodenya butuh diperbaiki:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import font
from PIL import Image, ImageDraw, ImageFont
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Pertitur Notasi Angka dengan Font Khusus")
# Membuat frame untuk partitur
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# 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
# Simbol notasi yang akan digunakan
symbol_options = [
".", ":", "|", "||", ":||", "/", "\\", "-", "(", ")", "G", "'",
"0", "♯", "♭", "𝄢" # Simbol-simbol notasi lainnya bisa ditambahkan
]
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(root)
symbol_frame.pack(padx=10, pady=10)
# Loop untuk membuat tombol untuk setiap simbol
for i, symbol in enumerate(symbol_options):
button = tk.Button(symbol_frame, text=symbol, width=4, command=lambda s=symbol: insert_symbol(s))
button.grid(row=i // 6, column=i % 6, padx=5, pady=5)
# 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, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\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.")
# 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)
# 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()
Untuk menampilkan simbol-simbol notasi angka di bagian atas GUI tepat di atas entry yang sudah ada, kita bisa membuat satu label tambahan yang berfungsi sebagai tempat untuk menampung dan menampilkan simbol-simbol tersebut. Kemudian kita tempatkan label tersebut di atas bagian entry seperti judul lagu, nada dasar, tanda birama, dan sebagainya.
Berikut adalah beberapa perubahan yang perlu dilakukan pada kode Anda untuk meletakkan simbol-simbol notasi angka di bagian atas GUI:
1. **Buat Label Baru untuk Menampilkan Simbol-Simbol:**
Label ini akan ditempatkan di bagian atas entri.
2. **Atur Grid untuk Label Simbol:**
Letakkan label tersebut di posisi yang sesuai dalam grid layout.
3. **Update Scrollbars dan Layout:**
Sesuaikan pengaturan scrollbars agar mendukung layout tambahan.
Berikut adalah perbaikan pada kode Anda:
```python
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import font
from PIL import Image, ImageDraw, ImageFont
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Pertitur Notasi Angka dengan Font Khusus")
# Membuat frame untuk partitur
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Simbol notasi yang akan digunakan
symbol_options = [
".", ":", "|", "||", ":||", "/", "\\", "-", "(", ")", "G", "'",
"0", "♯", "♭", "𝄢" # Simbol-simbol notasi lainnya bisa ditambahkan
]
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(frame)
symbol_frame.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
# Label instruksi simbol
symbol_label = tk.Label(symbol_frame, text="Simbol Notasi Angka:")
symbol_label.grid(row=0, column=0, columnspan=6, pady=(0, 5))
# Loop untuk membuat tombol untuk setiap simbol
for i, symbol in enumerate(symbol_options):
button = tk.Button(symbol_frame, text=symbol, width=4, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 6, column=i % 6, padx=5, pady=5)
# 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, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\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.")
# Membuat Entry untuk judul, nada dasar, dll
judul_entry = tk.Entry(frame, justify="center")
judul_entry.grid(row=2, column=0, padx=5, pady=5)
set_placeholder(judul_entry, "Judul Lagu")
nada_entry = tk.Entry(frame, justify="center")
nada_entry.grid(row=3, column=0, padx=5, pady=5)
set_placeholder(nada_entry, "Nada Dasar")
birama_entry = tk.Entry(frame, justify="center")
birama_entry.grid(row=4, column=0, padx=5, pady=5)
set_placeholder(birama_entry, "Tanda Birama")
pencipta_entry = tk.Entry(frame, justify="center")
pencipta_entry.grid(row=5, column=0, padx=5, pady=5)
set_placeholder(pencipta_entry, "Pencipta")
arranger_entry = tk.Entry(frame, justify="center")
arranger_entry.grid(row=6, column=0, 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=7, 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=7, 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=7, 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=8, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(frame, height=15, width=64, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal
output_text.grid(row=9, 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=9, 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=10, column=0, columnspan=3, sticky='ew')
root.mainloop()
```
### Penjelasan Modifikasi:
1. **Penempatan Label Simbol:**
Saya menambahkan label `symbol_label` untuk memberi informasi kepada pengguna bahwa simbol-simbol notasi angka berada di atas entri.
2. **Penempatan Tombol Simbol di Grid:**
Semua simbol ditempatkan dalam grid menggunakan `symbol_frame`, dan setiap simbol diberi tombol untuk dimasukkan ke `Text` widget.
3. **Penambahan Scrollbar dan Fungsi Layout:**
Layout scrollbar dan widget teks juga diperbaiki agar tetap mudah diakses.
Dengan perubahan ini, simbol-simbol notasi angka akan muncul di bagian atas, dan pengguna dapat memasukkan simbol yang dipilih langsung ke dalam teks partitur.
Kode yang benar untuk melengkapi file partitur_notasi_angka.py adalah berikut ini:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import font
from PIL import Image, ImageDraw, ImageFont
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Pertitur Notasi Angka dengan Font Khusus")
# Membuat frame untuk partitur
frame = tk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Simbol notasi yang akan digunakan
symbol_options = [
".", ":", "|", "||", ":||", "/", "\\", "-", "(", ")", "G", "'",
"0", "♯", "♭", "𝄢" # Simbol-simbol notasi lainnya bisa ditambahkan
]
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(frame)
symbol_frame.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
# Label instruksi simbol
symbol_label = tk.Label(symbol_frame, text="Simbol Notasi Angka:")
symbol_label.grid(row=0, column=0, columnspan=6, pady=(0, 5))
# Loop untuk membuat tombol untuk setiap simbol
for i, symbol in enumerate(symbol_options):
button = tk.Button(symbol_frame, text=symbol, width=4, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 6, column=i % 6, padx=5, pady=5)
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya
output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")
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, "\nArah/Arus Musik :\n", "indent")
output_text.insert(tk.END, "Tempo (BPM) :\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.")
# Tombol untuk menampilkan partitur
show_button = tk.Button(frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=7, 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=7, 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=7, 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=8, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(frame, height=15, width=64, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal
output_text.grid(row=9, 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=9, 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=10, column=0, columnspan=3, sticky='ew')
root.mainloop()
Kode yang Anda berikan sudah sangat baik. Fungsi-fungsi untuk menampilkan, menyimpan, dan memasukkan simbol notasi telah diatur dengan benar. Berikut adalah beberapa poin yang memastikan semua komponen bekerja sesuai dengan harapan:
1. **Penanganan Simbol Notasi**: Anda telah menambahkan simbol notasi yang umum digunakan dengan tombol interaktif. Pastikan bahwa Anda dapat menambahkan lebih banyak simbol sesuai kebutuhan.
2. **Fungsi untuk Menampilkan Partitur**: Fungsi ini menampilkan template partitur dengan indentasi yang tepat menggunakan tag `"indent"` untuk memformat bagian output. Ini akan memberikan struktur yang baik pada tampilan partitur.
3. **Fungsi Paste Gugus Nada**: Fungsi `paste_gn()` mengimpor data dari file `temp_gn_value.txt` yang sangat berguna untuk memasukkan gugus nada ke dalam partitur.
4. **Scrollbar untuk Output Text**: Anda telah menambahkan scrollbar baik vertikal maupun horizontal, yang sangat bermanfaat untuk teks yang panjang atau melebar.
Jika Anda ingin memastikan bahwa file `temp_gn_value.txt` tersedia dan dapat dibaca dengan benar, pastikan file tersebut terletak di direktori yang sama dengan program ini. Anda juga dapat menambahkan logika untuk membuat file ini jika belum ada.
Secara keseluruhan, kode ini sudah siap digunakan untuk membuat, mengedit, dan menyimpan partitur notasi angka dengan UI interaktif berbasis tkinter.
Komentar
Posting Komentar
This Message