Langsung ke konten utama

MEMASUKKAN SIMBOL NOTASI ANGKA PADA FUNGSI Insert_Symbol

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

Postingan populer dari blog ini

Pemograman R Studio

  Metode Numerik Menggunakan R Pengantar Gambaran Isi Buku Cara Berkontribusi dalam Buku Ini Ucapan Terima Kasih Lisensi 1  Bahasa Pemrograman R 1.1  Sejarah R 1.2  Fitur dan Karakteristik R 1.3  Kelebihan dan Kekurangan R 1.4  RStudio 1.5  Menginstall R dan RStudio 1.6  Working Directory 1.6.1  Mengubah Lokasi Working Directory 1.6.2  Mengubah Lokasi Working Directory Default 1.7  Memasang dan Mengaktifkan Paket R 1.8  Fasilitas Help 1.8.1  Mencari Help dari Suatu Perintah Tertentu 1.8.2  General Help 1.8.3  Fasilitas Help Lainnya 1.9  Referensi 2  Kalkulasi Menggunakan R 2.1  Operator Aritmatik 2.2  Fungsi Aritmetik 2.3  Operator Relasi 2.4  Operator Logika 2.5  Memasukkan Nilai Kedalam Variabel 2.6  Tipe dan Struktur Data 2.7  Vektor 2.7.1  Membuat vektor 2.7.2  Missing Values 2.7.3  Subset Pada Vektor 2.7.4  Operasi Matematis Menggunakan Vektor ...

MIGRASI DATABASE DARI SQLite KE MySQL (Part-1)

  MIGRASI DATABASE DARI SQLite KE MySQL (Part-1) Pemakaian yang mana lebih baik dalam membuat database_musik di mysql atau Exel yang cell Cell pada tabel dilakukan operasi fungsi logika matematika. Untuk keperluan membuat database atau tabel yang memerlukan operasi logika atau matematika, seperti yang Anda sebutkan, MySQL jauh lebih baik dibandingkan Excel. Berikut adalah beberapa alasan mengapa MySQL lebih disarankan: 1. **Kapasitas dan Skalabilitas**: MySQL dapat menangani jumlah data yang jauh lebih besar daripada Excel. Ini penting jika Anda berencana untuk menyimpan banyak data atau melakukan operasi yang kompleks di atas data tersebut. 2. **Kekuatan dan Kinerja**: MySQL dirancang khusus untuk memproses query dan operasi basis data dengan cepat. Ini termasuk operasi matematika, logika, dan agregasi data yang umum dilakukan dalam aplikasi. 3. **Fleksibilitas Struktur**: Dalam MySQL, Anda dapat dengan mudah menentukan struktur tabel yang kompleks dan melakukan kueri yang lebih r...

Cara Menjadi Pengembang Front End – Keterampilan Front End Web Dev

  Menyumbangkan Belajar coding —  kurikulum 3.000 jam gratis 10 JUNI 2022 / #PENGEMBANGAN UJUNG DEPAN Bagaimana Menjadi Pengembang Front End – Keterampilan Front End Web Dev Joel Olawanle Beberapa profesional dengan bayaran tertinggi di dunia adalah pengembang front-end.  Mereka menggunakan pengetahuan dan bakat mereka untuk merancang situs web yang menarik dan ramah pengguna. Pengembang front-end tidak memerlukan gelar atau sertifikat sekolah untuk bekerja.  Sebaliknya, mereka harus memahami dasar-dasar pengembangan front-end, bahasa pemrograman, dan kerangka kerja pengembangan front-end. Dalam panduan ini, Anda akan belajar bagaimana menjadi pengembang front end dengan terlebih dahulu memahami apa yang dimaksud dengan pengembangan front end, keterampilan teknis dan soft skill yang diperlukan, bahasa dan kerangka kerja yang tersedia, dan beberapa langkah untuk memulai. Seorang pengembang front-end di Amerika Serikat dapat memperoleh rata-rata $86,178 per tahun, menu...