MEMBUAT TEMPLATE DAN KELENGKAPAN PARTITUR NOTASI ANGKA LAGU (Part-1)
Bgaimana kalau kode berikut kita modifikasi di mana output_text kita buat pada canvas. Berikut kodenya:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageDraw, ImageFont, ImageTk
import os
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
output_text.insert(tk.INSERT, chord, "superscript")
output_text.insert(tk.INSERT, "")
# Simbol notasi yang akan digunakan (tambahkan nada panjang satu, dua, dan tiga ketuk)
symbol_options = [
"•", "••", "•••", "\u007C", "||", ":||", "/", "\\", "'",
"0", "♯", "♭", "\u2323", "\u0305", "\u0818", "\u07EB", "\u135E", "\u135F", "\u135D", "\u1A18", "\u0324", "\u1CDF", "" # Nada panjang satu, dua, dan tiga ketuk
]
# Akord Mayor dan Minor
akord_mayor = ["C", "D", "E", "F", "G", "A", "B"]
akord_minor = ["Am", "Bm", "Cm", "Dm", "Em", "Fm", "Gm"]
# Setup Canvas for scrolling
canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Create a scrollbar
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)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all')))
# Create a frame inside the canvas
frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=frame, anchor="nw")
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(frame)
symbol_frame.grid(row=0, column=0, pady=5)
# 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=2, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 8, column=i % 8, padx=5, pady=5)
# Frame untuk dropdown akord
chord_frame = tk.Frame(frame)
chord_frame.grid(row=1, column=0, pady=5)
# Dropdown Akord Mayor
mayor_label = tk.Label(chord_frame, text="Akord Mayor:")
mayor_label.grid(row=0, column=0, padx=10, pady=5)
mayor_dropdown = ttk.Combobox(chord_frame, values=akord_mayor, state="readonly")
mayor_dropdown.grid(row=0, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord mayor yang dipilih ke partitur
mayor_button = tk.Button(chord_frame, text="Tambah Akord Mayor", command=lambda: insert_chord(mayor_dropdown.get()))
mayor_button.grid(row=0, column=2, padx=10, pady=5)
# Dropdown Akord Minor
minor_label = tk.Label(chord_frame, text="Akord Minor:")
minor_label.grid(row=1, column=0, padx=10, pady=5)
minor_dropdown = ttk.Combobox(chord_frame, values=akord_minor, state="readonly")
minor_dropdown.grid(row=1, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord minor yang dipilih ke partitur
minor_button = tk.Button(chord_frame, text="Tambah Akord Minor", command=lambda: insert_chord(minor_dropdown.get()))
minor_button.grid(row=1, column=2, padx=10, pady=5)
# Fungsi untuk menampilkan partitur dengan indentasi dan menonaktifkan tombol
def show_partitur():
output_text.delete(1.0, tk.END)
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")
# Menonaktifkan tombol setelah ditekan
show_button.config(state=tk.DISABLED, bg="lightgrey", text="Tombol Tidak Aktif")
# Fungsi untuk mengaktifkan kembali tombol Tampil Partitur
def reset_button():
show_button.config(state=tk.NORMAL, bg="grey", text="Tampil Partitur")
# 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 mem-paste 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=5)
# Tombol untuk mengaktifkan kembali tombol Tampil Partitur
reset_button = tk.Button(frame, text="Reset", bg="blue", fg="white", command=reset_button)
reset_button.grid(row=7, column=1, padx=5, pady=5)
# 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=8, column=0, 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=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=9, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(frame, height=62, width=64, wrap=tk.NONE)
output_text.grid(row=10, column=0, padx=5, pady=5)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
output_text.tag_configure("superscript", offset=10)
output_text.tag_configure("chord_color", foreground="blue") # Tambahkan tag untuk warna akord
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
output_text.insert(tk.INSERT, chord, ("superscript", "chord_color")) # Gunakan tag superscript dan chord_colorjv
output_text.insert(tk.INSERT, "")
# Loop utama aplikasi tkinter
root.mainloop()
,Untuk memodifikasi kode agar output_text ditampilkan pada sebuah Canvas, kita bisa mengganti Text widget dengan Canvas. Namun, karena Canvas tidak langsung mendukung teks yang bisa di-edit oleh pengguna seperti Text widget, kita bisa menggunakan pendekatan lain untuk menggambar teks pada Canvas sebagai output. Di sini, saya akan menunjukkan bagaimana cara memodifikasi kode tersebut untuk menggunakan Canvas sebagai tempat output teks:
1. Kita akan menggunakan Canvas.create_text() untuk menampilkan teks di dalam Canvas.
2. Kita akan tetap mempertahankan kemampuan scroll baik secara horizontal maupun vertikal.
3. Kita akan mengubah semua interaksi dengan Text widget (misalnya, fungsi insert, delete, dll.) untuk bekerja dengan Canvas.
Berikut modifikasi kode untuk menampilkan output_text pada Canvas:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageDraw, ImageFont, ImageTk
import os
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Variabel untuk menyimpan teks yang akan ditampilkan
output_text_content = ""
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
global output_text_content
output_text_content += symbol
display_text()
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
global output_text_content
output_text_content += chord + " "
display_text()
# Simbol notasi yang akan digunakan (tambahkan nada panjang satu, dua, dan tiga ketuk)
symbol_options = [
"•", "••", "•••", "\u007C", "||", ":||", "/", "\\", "'",
"0", "♯", "♭", "\u2323", "\u0305", "\u0818", "\u07EB", "\u135E", "\u135F", "\u135D", "\u1A18", "\u0324", "\u1CDF", "" # Nada panjang satu, dua, dan tiga ketuk
]
# Akord Mayor dan Minor
akord_mayor = ["C", "D", "E", "F", "G", "A", "B"]
akord_minor = ["Am", "Bm", "Cm", "Dm", "Em", "Fm", "Gm"]
# Setup Canvas for scrolling
canvas = tk.Canvas(root)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Create a scrollbar
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)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all')))
# Create a frame inside the canvas
frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=frame, anchor="nw")
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(frame)
symbol_frame.grid(row=0, column=0, pady=5)
# 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=2, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 8, column=i % 8, padx=5, pady=5)
# Frame untuk dropdown akord
chord_frame = tk.Frame(frame)
chord_frame.grid(row=1, column=0, pady=5)
# Dropdown Akord Mayor
mayor_label = tk.Label(chord_frame, text="Akord Mayor:")
mayor_label.grid(row=0, column=0, padx=10, pady=5)
mayor_dropdown = ttk.Combobox(chord_frame, values=akord_mayor, state="readonly")
mayor_dropdown.grid(row=0, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord mayor yang dipilih ke partitur
mayor_button = tk.Button(chord_frame, text="Tambah Akord Mayor", command=lambda: insert_chord(mayor_dropdown.get()))
mayor_button.grid(row=0, column=2, padx=10, pady=5)
# Dropdown Akord Minor
minor_label = tk.Label(chord_frame, text="Akord Minor:")
minor_label.grid(row=1, column=0, padx=10, pady=5)
minor_dropdown = ttk.Combobox(chord_frame, values=akord_minor, state="readonly")
minor_dropdown.grid(row=1, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord minor yang dipilih ke partitur
minor_button = tk.Button(chord_frame, text="Tambah Akord Minor", command=lambda: insert_chord(minor_dropdown.get()))
minor_button.grid(row=1, column=2, padx=10, pady=5)
# Fungsi untuk menampilkan teks di canvas
def display_text():
canvas.delete("all")
canvas.create_text(10, 10, anchor="nw", text=output_text_content, font=("Helvetica", 14), fill="black")
# Fungsi untuk menampilkan partitur dengan indentasi dan menonaktifkan tombol
def show_partitur():
global output_text_content
output_text_content = "\nPartitur Notasi Angka :\n" \
"Judul Lagu : \n" \
"Nada Dasar : \n" \
"Tanda Birama : \n" \
"Pencipta : \n" \
"Arranger : \n\n" \
"Arah/Arus Musik :\n" \
"Tempo (BPM) :\n\n\n"
display_text()
# Menonaktifkan tombol setelah ditekan
show_button.config(state=tk.DISABLED, bg="lightgrey", text="Tombol Tidak Aktif")
# Fungsi untuk mengaktifkan kembali tombol Tampil Partitur
def reset_button():
show_button.config(state=tk.NORMAL, bg="grey", text="Tampil Partitur")
# Fungsi untuk menyimpan perubahan
def save_partitur():
file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])
if file_path:
try:
with open(file_path, 'w') as file:
file.write(output_text_content)
messagebox.showinfo("Sukses", "Partitur berhasil disimpan.")
except Exception as e:
messagebox.showerror("Error", f"Gagal menyimpan partitur: {e}")
# Fungsi untuk mem-paste data dari temp_gn_value.txt ke output_text
def paste_gn():
global output_text_content
try:
with open("temp_gn_value.txt", "r") as temp_file:
gn_value = temp_file.read()
output_text_content += gn_value
display_text()
except FileNotFoundError:
output_text_content += "Tidak ada data yang dicopy."
display_text()
# 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=5)
# Tombol untuk mengaktifkan kembali tombol Tampil Partitur
reset_button = tk.Button(frame, text="Reset", bg="blue", fg="white", command=reset_button)
reset_button.grid(row=7, column=1, padx=5, pady=5)
# 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=8, column=0, 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=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=9, column=0, padx=5, pady=5)
# Loop utama aplikasi tkinter
root.mainloop()
Penjelasan perubahan:
Penggunaan Canvas: Output teks yang sebelumnya menggunakan Text widget digantikan dengan Canvas.create_text(). Semua konten teks ditampilkan dalam satu blok teks pada Canvas.
Variabel output_text_content: Teks output sekarang disimpan dalam variabel global output_text_content, yang akan diperbarui setiap kali pengguna memasukkan simbol atau akord.
Fungsi display_text(): Digunakan untuk menggambar teks ke Canvas dan memperbarui tampilannya setiap kali
Kita buat ukutan root.geometry "690x600", lalu di bawahnya untuk tampilan output_text_content
Berikut adalah modifikasi kode yang memperkecil ukuran jendela root dengan geometry("690x600") serta menambahkan canvas khusus di bawahnya untuk menampilkan konten dari output_text. Saya juga akan memastikan scroll bekerja pada canvas untuk tampilan yang lebih besar:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageDraw, ImageFont, ImageTk
import os
# Setup UI
root = tk.Tk()
root.geometry("690x600")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
output_text.insert(tk.INSERT, chord, ("superscript", "chord_color"))
output_text.insert(tk.INSERT, "")
# Simbol notasi yang akan digunakan (tambahkan nada panjang satu, dua, dan tiga ketuk)
symbol_options = [
"•", "••", "•••", "\u007C", "||", ":||", "/", "\\", "'",
"0", "♯", "♭", "\u2323", "\u0305", "\u0818", "\u07EB", "\u135E", "\u135F", "\u135D", "\u1A18", "\u0324", "\u1CDF", "" # Nada panjang satu, dua, dan tiga ketuk
]
# Akord Mayor dan Minor
akord_mayor = ["C", "D", "E", "F", "G", "A", "B"]
akord_minor = ["Am", "Bm", "Cm", "Dm", "Em", "Fm", "Gm"]
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=output_text_canvas.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(output_frame)
symbol_frame.grid(row=0, column=0, pady=5)
# 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=2, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 8, column=i % 8, padx=5, pady=5)
# Frame untuk dropdown akord
chord_frame = tk.Frame(output_frame)
chord_frame.grid(row=1, column=0, pady=5)
# Dropdown Akord Mayor
mayor_label = tk.Label(chord_frame, text="Akord Mayor:")
mayor_label.grid(row=0, column=0, padx=10, pady=5)
mayor_dropdown = ttk.Combobox(chord_frame, values=akord_mayor, state="readonly")
mayor_dropdown.grid(row=0, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord mayor yang dipilih ke partitur
mayor_button = tk.Button(chord_frame, text="Tambah Akord Mayor", command=lambda: insert_chord(mayor_dropdown.get()))
mayor_button.grid(row=0, column=2, padx=10, pady=5)
# Dropdown Akord Minor
minor_label = tk.Label(chord_frame, text="Akord Minor:")
minor_label.grid(row=1, column=0, padx=10, pady=5)
minor_dropdown = ttk.Combobox(chord_frame, values=akord_minor, state="readonly")
minor_dropdown.grid(row=1, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord minor yang dipilih ke partitur
minor_button = tk.Button(chord_frame, text="Tambah Akord Minor", command=lambda: insert_chord(minor_dropdown.get()))
minor_button.grid(row=1, column=2, padx=10, pady=5)
# Fungsi untuk menampilkan partitur dengan indentasi dan menonaktifkan tombol
def show_partitur():
output_text.delete(1.0, tk.END)
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")
# Menonaktifkan tombol setelah ditekan
show_button.config(state=tk.DISABLED, bg="lightgrey", text="Tombol Tidak Aktif")
# Fungsi untuk mengaktifkan kembali tombol Tampil Partitur
def reset_button():
show_button.config(state=tk.NORMAL, bg="grey", text="Tampil Partitur")
# 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 mem-paste 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(output_frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=7, column=0, padx=5, pady=5)
# Tombol untuk mengaktifkan kembali tombol Tampil Partitur
reset_button = tk.Button(output_frame, text="Reset", bg="blue", fg="white", command=reset_button)
reset_button.grid(row=7, column=1, padx=5, pady=5)
# Tombol untuk mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=8, column=0, padx=5, pady=5)
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=7, column=2, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=9, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=20, width=64, wrap=tk.NONE)
output_text.grid(row=10, column=0, padx=5, pady=5)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
output_text.tag_configure("superscript", offset=10)
output_text.tag_configure("chord_color", foreground="blue") # Tambahkan tag untuk warna akord
# Loop utama aplikasi tkinter
root.mainloop()
Dalam modifikasi ini:
Ukuran jendela diatur menjadi 690x600 untuk memperkecil tampilan.
output_text dimasukkan dalam sebuah frame di dalam canvas
Bisakah output_teks diatur dibuat semacam template baris demi baris di mana baris satu akan memuat nada nada dimana garis birama sudah tertera teratur dibarisnya, jadi user tinggal hanya memasukkan nada nada, bila ke birama berikutnya maka akan melompat melewati garis birama yang sudah ada sehingga user hanya melanjutkan memasukkan nada nada berikutnya, begitu seterusnya, dan di baris dua tentunya pasti untuk lirik lagu. Lalu ke bawah di baris baris berikutnya adalah sama seperti sebelumnya
Untuk membuat template di mana setiap baris output_text memiliki garis birama yang sudah teratur dan pengguna hanya memasukkan nada pada tempat yang tersedia, serta memiliki lirik pada baris kedua (di bawah nada), kita dapat membuat pendekatan berikut:
1. Template birama: Setiap baris pertama akan memiliki garis birama dan tempat-tempat yang kosong untuk mengisi nada. Misalnya, kita menggunakan karakter "|" sebagai garis birama, dan di antara garis birama tersebut, kita sediakan tempat kosong untuk pengguna memasukkan nada.
2. Lirik di bawah nada: Baris kedua di bawah birama akan berfungsi sebagai lirik. Jadi, pengguna akan memasukkan nada di baris pertama dan kemudian lirik di baris kedua.
3. Melompat ke birama berikutnya: Setelah satu birama terisi dengan nada, pengguna dapat otomatis pindah ke tempat yang sudah disediakan untuk birama berikutnya.
Berikut contoh kode modifikasi yang memungkinkan ini:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x600")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
output_text.insert(tk.INSERT, note)
# Template birama (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}\n")
output_text.insert(tk.END, f"Lirik: \n") # Baris untuk lirik di bawah nada
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=20, width=64, wrap=tk.NONE)
output_text.grid(row=2, column=0, padx=5, pady=5)
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Penjelasan Kode:
1. Template birama: Fungsi create_birama_template() membuat template birama dalam format | | | | | di mana karakter | adalah garis birama, dan spasi di antara mereka adalah tempat untuk mengisi nada.
2. Baris untuk lirik: Setelah setiap birama, secara otomatis menambahkan baris "Lirik: " di mana pengguna bisa memasukkan lirik lagunya.
3. Tombol untuk menambah birama: Tombol "Tambah Birama" menambah baris birama dan lirik baru di bawah partitur yang ada.
4. Simpan Partitur: Tombol "Simpan Partitur" menyimpan konten partitur dalam format teks.
5. Paste Nada Gn: Tombol untuk menambahkan gugus nada yang diambil dari file eksternal.
Dengan pendekatan ini, pengguna bisa langsung mengisi nada di baris yang sesuai di antara garis birama, dan melanjutkan dengan lirik di baris berikutnya. Setiap kali pengguna menambah birama baru, garis birama akan ditambahkan secara otomatis.
Tapi sebelumnya perlu diatur panjang dan lebar output_text yaitu dengan ukuran kertas folio, untuk itu ukuran output_text pada kode: output_text = tk.Text(output_frame, height=62, width=64, wrap=tk.NONE)
output_text.grid(row=10, column=0, padx=5, pady=5)
harus dirubah sesuai ukuran kertas folio. Kemudian diatur margin kiri, kanan, dan bawah agar supaya nada nada yang diketikkan userbdapat kelihatan tetsusun rapi.
Untuk mengatur ukuran output_text agar sesuai dengan ukuran kertas folio dan mengatur margin agar nada-nada tersusun rapi, kita bisa melakukan beberapa penyesuaian.
Ukuran Kertas Folio:
Ukuran kertas folio dalam satuan piksel dapat bervariasi, tetapi umumnya sekitar 8.5 x 13 inci. Mengingat setiap inci di tkinter biasanya mewakili sekitar 72 piksel, kita bisa menghitung ukuran tinggi dan lebar yang sesuai dengan ukuran folio ini.
Misalkan kita asumsikan ukuran kertas folio adalah 612 piksel lebar (8.5 inci) dan 936 piksel tinggi (13 inci). Kita dapat menggunakan asumsi ini untuk menentukan width dan height dari output_text.
Pengaturan Margin:
Untuk mengatur margin, kita dapat memanfaatkan beberapa pendekatan seperti:
Menambahkan padx dan pady pada grid untuk mengatur margin.
Menggunakan spasi atau tab pada setiap baris teks yang diinputkan oleh pengguna agar format lebih rapi.
Kode Diperbarui:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x1000") # Ukuran total window menyesuaikan dengan panjang kertas folio
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
output_text.insert(tk.INSERT, note)
# Template birama (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}\n")
output_text.insert(tk.END, f"Lirik: \n") # Baris untuk lirik di bawah nada
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=50, width=85, wrap=tk.NONE) # Height dan Width diatur agar menyerupai ukuran kertas folio
output_text.grid(row=10, column=0, padx=50, pady=(10, 30)) # Mengatur margin kiri, kanan, atas, dan bawah
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Penyesuaian:
1. output_text:
height=50 dan width=85: Diatur untuk menyerupai panjang dan lebar kertas folio dalam format teks. width lebih lebar karena teks kertas folio memerlukan lebih banyak spasi horizontal.
Margin kiri dan kanan diatur dengan parameter padx=50 dan pady untuk margin atas dan bawah.
2. Ukuran jendela: root.geometry("690x1000") menyesuaikan agar semua konten terlihat dalam ukuran kertas folio.
3. Margin teks: padx digunakan untuk mengatur margin kiri-kanan agar tampilan lebih rapi, sedangkan pady digunakan untuk margin atas dan bawah pada output.
Dengan pengaturan ini, area teks di dalam output_text akan disesuaikan untuk menciptakan efek tampilan yang lebih menyerupai lembar kertas folio, dan spasi untuk margin ditambahkan agar tulisan lebih rapi.
Baris ketiga tentunya adalah kosong atau separator agar ada jarak antara baris lirik dengan baris birama berikutnya, demikian seterusnya juga untuk baris keenam, kesembilan dan seterusnya.
Baik, untuk menambahkan baris kosong atau separator antara baris lirik dan birama berikutnya, kita bisa memperbarui fungsi add_birama() agar mengikuti pola yang Anda inginkan, yaitu:
Baris pertama: Birama (untuk nada-nada)
Baris kedua: Lirik
Baris ketiga: Kosong atau separator
Kemudian ulangi pola tersebut untuk birama berikutnya.
Berikut adalah kode yang diperbarui untuk menambahkan baris kosong sebagai separator:
Kode Diperbarui:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x1000") # Ukuran total window menyesuaikan dengan panjang kertas folio
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
output_text.insert(tk.INSERT, note)
# Template birama (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}\n") # Baris pertama: birama untuk nada
output_text.insert(tk.END, f"Lirik: \n") # Baris kedua: tempat lirik
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=50, width=85, wrap=tk.NONE) # Height dan Width diatur agar menyerupai ukuran kertas folio
output_text.grid(row=10, column=0, padx=50, pady=(10, 30)) # Mengatur margin kiri, kanan, atas, dan bawah
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Penjelasan Perubahan:
1. add_birama():
Menambahkan 3 baris setiap kali fungsi ini dipanggil:
Baris pertama untuk template birama (nada).
Baris kedua untuk lirik.
Baris ketiga untuk separator (baris kosong).
2. Separator:
Baris ketiga setiap set adalah kosong untuk memisahkan antara birama sebelumnya dengan birama berikutnya, yang memberikan tampilan lebih rapi dan teratur.
Cara Kerja:
Ketika Anda menekan tombol "Tambah Birama", tiga baris akan ditambahkan ke output_text:
Baris pertama adalah tempat untuk memasukkan nada di antara garis birama.
Baris kedua adalah tempat untuk lirik.
Baris ketiga adalah baris kosong yang berfungsi sebagai separator atau jarak sebelum birama berikutnya.
Dengan cara ini, struktur partitur akan terlihat lebih rapi dan mudah dibaca, dengan jarak yang cukup antara baris lirik dan baris nada berikutnya.
Tolong perbaiki kode tersebut agar garis birama dan lirik di posisi akhir baris dibuat pembatas, agar supaya ketika user terlanjur menambah nada agar tidak hilang teks yang di sebelah kiri, tapi lanjutan teks yang diinput akan turun ke bawah ke baris berikutnya
Untuk mencapai hasil di mana garis birama dan lirik memiliki pembatas di posisi akhir, dan teks yang diinput secara otomatis turun ke baris berikutnya ketika melebihi panjang garis tersebut, kita dapat memodifikasi kode dengan melakukan dua hal:
1. Pembatas di akhir baris birama dan lirik:
Kita tambahkan garis | di akhir birama dan di akhir lirik, sehingga saat pengguna menambah nada, jika panjangnya melebihi batas, nada tersebut akan turun ke baris berikutnya secara otomatis.
2. Penanganan teks yang melebihi panjang baris:
Kita akan mengatur panjang maksimal baris agar tetap konsisten, dan jika pengguna menambahkan teks melebihi batas tersebut, maka secara otomatis akan terpotong dan dilanjutkan di baris baru.
Kode yang diperbarui:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x1000") # Ukuran total window menyesuaikan dengan panjang kertas folio
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
output_text.insert(tk.INSERT, note)
# Template birama dengan pembatas di akhir baris (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text dengan pembatas di akhir
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}| \n") # Baris pertama: birama untuk nada (dengan pembatas di akhir)
output_text.insert(tk.END, f"Lirik: |\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=50, width=85, wrap=tk.NONE) # Height dan Width diatur agar menyerupai ukuran kertas folio
output_text.grid(row=10, column=0, padx=50, pady=(10, 30)) # Mengatur margin kiri, kanan, atas, dan bawah
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Penjelasan Perubahan:
1. Pembatas di Akhir Baris:
Pada setiap akhir baris birama (|) dan lirik (|), saya menambahkan pembatas vertikal di akhir teks:
Birama: Baris birama berakhir dengan karakter |, jadi jika pengguna menambah lebih banyak nada, teks tambahan akan pindah ke baris berikutnya secara otomatis.
Lirik: Pada baris lirik, juga ada pembatas di akhir baris untuk memastikan panjang teks tetap konsisten dan tidak berantakan.
2. Panjang Teks Terjaga:
Panjang setiap baris untuk birama dan lirik diatur secara statis, sehingga ketika user menambahkan nada atau lirik yang melebihi panjang baris, teks tersebut akan otomatis melompat ke baris berikutnya.
3. Baris Kosong:
Baris kosong atau separator tetap ada sebagai pemisah antara birama dan lirik selanjutnya untuk menjaga keteraturan partitur.
Alur Kerja:
Menambah Birama: Saat tombol "Tambah Birama" ditekan, tiga baris akan ditambahkan:
Baris pertama untuk nada dengan pembatas di akhir (|).
Baris kedua untuk lirik dengan pembatas di akhir (|).
Baris ketiga adalah baris kosong sebagai separator antar birama.
Memasukkan Nada dan Lirik: Ketika pengguna memasukkan nada atau lirik, jika jumlah karakter melebihi panjang yang diizinkan pada baris tersebut, teks akan turun ke baris baru secara otomatis.
Hasilnya, partitur Anda akan terlihat rapi dengan garis pemisah di akhir setiap birama dan lirik, sehingga pengguna tidak perlu khawatir teks yang mereka ketik hilang atau tertimpa.
Teks belum juga mau turun ke baris bawah, malahan teks yang paling pinggir kiri menjadi hilang
Untuk memperbaiki masalah di mana teks tidak turun ke baris berikutnya dan teks pada bagian kiri hilang, kita perlu menyesuaikan pengaturan lebar baris (agar tidak ada teks yang keluar dari area tampilan) serta memastikan agar teks yang melebihi batas panjang baris berpindah ke baris baru secara otomatis.
Ada beberapa hal yang perlu diatur:
1. Pengaturan Lebar Baris: Kita bisa menggunakan fitur wrap=tk.CHAR untuk menghindari teks keluar dari jangkauan tampilan. Ini akan memastikan bahwa jika ada teks yang melebihi batas panjang, maka akan secara otomatis turun ke baris berikutnya.
2. Pengaturan Pembatas Baris: Kita bisa menggunakan format pembatas pada setiap baris untuk memastikan teks yang diinputkan tidak menghapus teks lain di baris yang sama.
Berikut kode yang telah diperbaiki agar sesuai dengan kebutuhan tersebut:
Kode yang Diperbarui:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x1000") # Ukuran total window menyesuaikan dengan panjang kertas folio
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
output_text.insert(tk.INSERT, note)
# Template birama dengan pembatas di akhir baris (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text dengan pembatas di akhir
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}|\n") # Baris pertama: birama untuk nada (dengan pembatas di akhir)
output_text.insert(tk.END, "Lirik: " + " " * (len(birama) - 7) + "|\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=50, width=85, wrap=tk.CHAR) # Menggunakan wrap=tk.CHAR agar teks tidak hilang
output_text.grid(row=10, column=0, padx=50, pady=(10, 30)) # Mengatur margin kiri, kanan, atas, dan bawah
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Perubahan dan Perbaikan yang Dilakukan:
1. Penggunaan wrap=tk.CHAR:
Sebelumnya, wrap=tk.NONE digunakan, yang menyebabkan teks tidak otomatis berpindah ke baris berikutnya. Sekarang saya menggunakan wrap=tk.CHAR agar teks berpindah ke baris baru jika melebihi lebar area input. Ini mencegah teks hilang dari tampilan.
2. Pembatas di Akhir Baris:
Pada baris birama, kita sekarang menambahkan karakter pembatas (|) di akhir baris. Ini membantu mencegah teks yang dimasukkan menimpa teks sebelumnya, dan teks baru akan otomatis turun ke baris berikutnya jika melebihi panjang baris.
3. Penanganan Panjang Teks:
Ketika pengguna mengetik lirik atau nada, panjang teks akan diatur agar tidak melebihi panjang maksimal yang sudah ditentukan. Jika teks melebihi panjang tersebut, ia akan pindah ke baris baru tanpa menghapus teks di sebelah kiri.
4. Penambahan Template Birama:
Template birama yang ditambahkan menggunakan | | | | | memungkinkan pengguna untuk memasukkan nada dalam pola yang konsisten, dengan ruang yang cukup untuk masing-masing nada.
Hasilnya:
Teks tidak lagi hilang dari tampilan dan akan otomatis berpindah ke baris berikutnya jika melebihi batas.
Baris untuk birama dan lirik memiliki pembatas di akhir yang menjaga konsistensi format.
Format output tetap rapi dan teratur, dengan jarak antar birama untuk menjaga keterbacaan partitur.
Benar dengan wrap=tk.CHAR maka teks berpindan ke baris berikutnya, tapi maunya kita bahwa teks berpindah ke baris baru setelah baris lirik
Ah, saya mengerti sekarang. Anda ingin agar ketika pengguna mengetik nada-nada, teks tersebut pindah ke baris berikutnya setelah baris lirik (yaitu baris kosong yang berfungsi sebagai pemisah), bukan langsung di baris berikutnya dalam satu rangkaian.
Untuk mewujudkan ini, kita perlu memodifikasi logika agar ketika panjang teks birama atau lirik melebihi panjang tertentu (yang sudah ditentukan dalam template birama), aplikasi secara otomatis akan memindahkan teks ke baris lirik dan baris pemisah berikutnya. Begitu pula, jika nada yang diketik pengguna melebihi batas dalam satu birama, teks tersebut akan otomatis pindah ke baris birama baru, lengkap dengan lirik di bawahnya dan baris pemisah.
Pendekatan:
1. Pindahkan teks setelah mencapai batas birama ke baris lirik dan baris pemisah: Jadi, jika pengguna menambahkan lebih dari batas maksimal di satu baris, teks akan melompat ke baris baru, setelah lirik dan pemisah.
2. Penggunaan template untuk birama, lirik, dan separator: Dengan cara ini, kita akan mengatur baris pertama untuk birama, baris kedua untuk lirik, dan baris ketiga sebagai pemisah kosong.
Berikut adalah implementasi kode yang telah diperbaiki sesuai kebutuhan:
Kode yang Diperbarui:
import tkinter as tk
from tkinter import filedialog, messagebox
# Setup UI
root = tk.Tk()
root.geometry("690x1000") # Ukuran total window menyesuaikan dengan panjang kertas folio
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan nada ke partitur pada posisi tertentu
def insert_note(note):
current_content = output_text.get("1.0", tk.END)
lines = current_content.split("\n")
# Cari baris terakhir birama
last_birama_line_index = None
for i, line in enumerate(reversed(lines)):
if "|" in line: # Cek untuk birama
last_birama_line_index = len(lines) - i - 1
break
# Pindah ke baris baru jika nada terlalu panjang untuk satu birama
if last_birama_line_index is not None:
if len(lines[last_birama_line_index]) + len(note) > 30: # Contoh batas maksimal birama
output_text.insert(tk.END, f"\n{create_birama_template()}|\nLirik: \n\n")
output_text.insert(tk.INSERT, note)
# Template birama dengan pembatas di akhir baris (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text dengan pembatas di akhir
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}|\n") # Baris pertama: birama untuk nada (dengan pembatas di akhir)
output_text.insert(tk.END, "Lirik: " + " " * (len(birama) - 7) + "|\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=0, column=0, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=1, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=50, width=85, wrap=tk.NONE) # Menggunakan wrap=tk.NONE
output_text.grid(row=10, column=0, padx=50, pady=(10, 30)) # Mengatur margin kiri, kanan, atas, dan bawah
# Fungsi untuk menyimpan partitur
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}")
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=3, column=0, padx=5, pady=5)
# Fungsi untuk mem-paste 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 mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=4, column=0, padx=5, pady=5)
# Tambahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Penjelasan Utama:
1. Pindah ke Baris Birama Berikutnya:
Saya menambahkan logika untuk mengecek panjang baris birama terakhir. Jika pengguna menambahkan lebih dari batas maksimal (contohnya 30 karakter), baris baru untuk birama dan lirik akan otomatis ditambahkan.
2. Template Birama, Lirik, dan Separator:
Setiap kali birama baru ditambahkan, baris birama pertama diikuti oleh baris lirik, dan kemudian baris pemisah. Ini membuat birama, lirik, dan jarak antar baris lebih teratur.
3. Penanganan Input:
Fungsi insert_note() menangani input pengguna. Jika panjang baris birama melebihi batas maksimal, teks akan pindah ke baris birama dan lirik berikutnya, menjaga format agar tetap rapi.
Hasil:
Teks tidak akan lagi hilang dari tampilan atau keluar dari batas area.
Setiap birama diikuti oleh baris lirik, dengan jarak antar birama yang konsisten.
Jika nada melebihi batas birama, teks akan otomatis pindah ke baris birama baru yang lengkap dengan lirik di bawahnya.
Apa memang tidak bisa ya, toh saja di baris kedua, bukan di baris setelah lirik.
Ya, seharusnya teks yang dimasukkan pada baris nada berpindah ke baris birama baru setelah baris lirik, bukan ke baris kedua. Bila teks berpindah ke baris kedua setelah baris nada tanpa memperhatikan lirik, ini berarti logika dalam pengelolaan input dan pindahan baris mungkin tidak sesuai dengan yang diinginkan.
Saya akan memberikan solusi untuk memastikan teks nada akan berpindah setelah baris lirik, bukan langsung ke baris di bawahnya. Untuk mengatasi masalah ini, kita bisa membuat mekanisme manual di mana setelah satu baris birama penuh dengan nada, aplikasi akan secara otomatis memindahkan cursor ke baris lirik, lalu baris kosong (separator), dan baru kemudian kembali ke birama baru.
Mari kita coba logika sederhana seperti ini:
1. Memisahkan Input: Saat user memasukkan nada, kita deteksi panjang inputnya. Jika sudah mencapai panjang tertentu (misalnya satu birama penuh), maka kita tambahkan baris lirik dan separator secara otomatis.
2. Memaksa Pemindahan Baris: Setelah baris lirik dan separator, kita secara eksplisit memindahkan cursor ke baris birama berikutnya.
Berikut adalah modifikasi logika yang lebih baik:
# Fungsi untuk memasukkan nada ke dalam output_text dan memindahkan baris
def insert_note(note):
current_content = output_text.get("1.0", tk.END) # Ambil semua isi teks
current_lines = current_content.splitlines() # Pisahkan ke dalam baris
# Deteksi panjang input dalam baris nada (baris 1, 4, 7, dst)
birama_length = 32 # Misalnya kita batasi panjang satu birama dengan 32 karakter
# Temukan baris nada dan lirik secara berurutan
line_number = len(current_lines)
if line_number % 3 == 1: # Jika berada di baris nada (baris pertama birama baru)
# Ambil isi baris nada saat ini
current_nada = current_lines[-1] if current_lines else ""
# Jika panjang nada mencapai batas, pindahkan ke baris berikutnya
if len(current_nada) >= birama_length:
output_text.insert(tk.END, "\n") # Pindahkan ke baris lirik
output_text.insert(tk.END, "\n") # Tambahkan baris separator
output_text.insert(tk.END, "\n") # Tambahkan birama baru (baris nada berikutnya)
# Masukkan nada ke dalam teks
output_text.insert(tk.END, note)
output_text.see(tk.END) # Scroll otomatis ke bagian paling bawah
# Scroll configuration
output_text_canvas.configure(yscrollcommand=scrollbar_y.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox("all")))
# Frame untuk menempatkan output_text di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Output text (tempat menampilkan partitur)
output_text = tk.Text(output_frame, height=62, width=64, wrap=tk.NONE)
output_text.grid(row=0, column=0, padx=5, pady=5)
# Horizontal scrollbar untuk output_text
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=output_text.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
output_text.configure(xscrollcommand=scrollbar_x.set)
# Tombol untuk menambahkan birama baru
def add_new_birama():
output_text.insert(tk.END, "|---|") # Tambahkan garis birama
output_text.insert(tk.END, "\n") # Baris kosong untuk lirik
output_text.insert(tk.END, "\n") # Baris separator untuk lirik
# Setelah separator, tambahkan birama baru
output_text.insert(tk.END, "|---|")
output_text.see(tk.END) # Scroll otomatis ke bawah
# Tambahkan tombol untuk menambahkan birama baru
add_birama_button = tk.Button(button_frame, text="Tambah Birama", command=add_new_birama)
add_birama_button.pack(side=tk.LEFT, padx=10, pady=10)
# Inisialisasi pertama kali (menambahkan birama pertama)
add_birama()
# Main loop tkinter
root.mainloop()
Penjelasan logika:
1. Fungsi insert_note():
Setiap kali user menambahkan nada, kita cek apakah sudah mencapai panjang satu birama (diatur dengan variabel birama_length, misal 32 karakter).
Jika panjang sudah tercapai, maka secara otomatis pindah ke baris berikutnya, menambahkan lirik, separator, dan birama baru.
2. Tombol 'Tambah Birama':
Tombol ini digunakan untuk secara manual menambah baris birama, lirik, dan separator jika dibutuhkan secara eksplisit.
3. Pengaturan Scroll:
Menggunakan scroll agar teks tidak terpotong atau hilang saat sudah melebihi kapasitas tampilan.
Dengan logika ini, ketika teks nada mencapai panjang maksimal untuk satu birama, program akan otomatis memindahkan cursor ke baris lirik dan menambahkan birama baru di bawahnya.
Tolong applikasikan kode tersebut pada kode berikut ini:
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from PIL import Image, ImageDraw, ImageFont, ImageTk
import os
# Setup UI
root = tk.Tk()
root.geometry("690x1390")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
output_text.insert(tk.INSERT, chord, ("superscript", "chord_color"))
output_text.insert(tk.INSERT, "")
# Simbol notasi yang akan digunakan (tambahkan nada panjang satu, dua, dan tiga ketuk)
symbol_options = [
"•", "••", "•••", "\u007C", "||", ":||", "/", "\\", "'",
"0", "♯", "♭", "\u2323", "\u0305", "\u0818", "\u07EB", "\u135E", "\u135F", "\u135D", "\u1A18", "\u0324", "\u1CDF", "" # Nada panjang satu, dua, dan tiga ketuk
]
# Akord Mayor dan Minor
akord_mayor = ["C", "D", "E", "F", "G", "A", "B"]
akord_minor = ["Am", "Bm", "Cm", "Dm", "Em", "Fm", "Gm"]
# Template birama (misal 4/4, dengan tempat kosong untuk nada di antara garis birama)
def create_birama_template():
template = "| | | | | | | | | | | | | | | | | | | |" # Garis birama 4/4 dengan tempat untuk nada
return template
# Fungsi untuk menambahkan birama ke output_text dengan pembatas di akhir
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}| \n") # Baris pertama: birama untuk nada (dengan pembatas di akhir)
output_text.insert(tk.END, f"Lirik: |\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=output_text_canvas.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(output_frame)
symbol_frame.grid(row=0, column=0, pady=5)
# 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=2, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 8, column=i % 8, padx=5, pady=5)
# Frame untuk dropdown akord
chord_frame = tk.Frame(output_frame)
chord_frame.grid(row=1, column=0, pady=5)
# Dropdown Akord Mayor
mayor_label = tk.Label(chord_frame, text="Akord Mayor:")
mayor_label.grid(row=0, column=0, padx=10, pady=5)
mayor_dropdown = ttk.Combobox(chord_frame, values=akord_mayor, state="readonly")
mayor_dropdown.grid(row=0, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord mayor yang dipilih ke partitur
mayor_button = tk.Button(chord_frame, text="Tambah Akord Mayor", command=lambda: insert_chord(mayor_dropdown.get()))
mayor_button.grid(row=0, column=2, padx=10, pady=5)
# Dropdown Akord Minor
minor_label = tk.Label(chord_frame, text="Akord Minor:")
minor_label.grid(row=1, column=0, padx=10, pady=5)
minor_dropdown = ttk.Combobox(chord_frame, values=akord_minor, state="readonly")
minor_dropdown.grid(row=1, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord minor yang dipilih ke partitur
minor_button = tk.Button(chord_frame, text="Tambah Akord Minor", command=lambda: insert_chord(minor_dropdown.get()))
minor_button.grid(row=1, column=2, padx=10, pady=5)
# Fungsi untuk menampilkan partitur dengan indentasi dan menonaktifkan tombol
def show_partitur():
output_text.delete(1.0, tk.END)
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")
# Menonaktifkan tombol setelah ditekan
show_button.config(state=tk.DISABLED, bg="lightgrey", text="Tombol Tidak Aktif")
# Fungsi untuk mengaktifkan kembali tombol Tampil Partitur
def reset_button():
show_button.config(state=tk.NORMAL, bg="grey", text="Tampil Partitur")
# 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 mem-paste 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(output_frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=7, column=0, padx=5, pady=5)
# Tombol untuk mengaktifkan kembali tombol Tampil Partitur
reset_button = tk.Button(output_frame, text="Reset", bg="blue", fg="white", command=reset_button)
reset_button.grid(row=7, column=1, padx=5, pady=5)
# Tombol untuk mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=8, column=0, padx=5, pady=5)
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=7, column=2, padx=5, pady=5)
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=8, column=1, padx=5, pady=5)
# Label instruksi di atas output_text
instruksi_label = tk.Label(output_frame, text="Partitur Notasi Angka (Edit di bawah sini):")
instruksi_label.grid(row=9, column=0, padx=5, pady=5)
# Output text box yang bisa di-edit oleh user
output_text = tk.Text(output_frame, height=62, width=64, wrap=tk.NONE)
output_text.grid(row=10, column=0, padx=50, pady=5)
# Tambahkan tag untuk indentasi di output_text
output_text.tag_configure("indent", lmargin1=40, lmargin2=40)
output_text.tag_configure("superscript", offset=10)
output_text.tag_configure("chord_color", foreground="blue") # Tambahkan tag untuk warna akord
# Ta:mbahkan birama awal saat aplikasi dimulai
add_birama()
# Loop utama aplikasi tkinter
root.mainloop()
Untuk menerapkan logika yang kamu maksud dalam kode, saya akan memodifikasi logika penambahan birama dan lirik agar teks nada yang panjang pindah ke baris terakhir, lalu teks lirik disisipkan ke baris kedua, dan jika ada teks nada yang berpindah ke baris kedua, teks lirik dipindahkan ke baris ketiga, sehingga susunan birama tetap sesuai dengan aturan yang kamu inginkan.
Berikut adalah modifikasi fungsi add_birama() untuk mengikuti aturan tersebut:
# Fungsi untuk menambahkan birama ke output_text dengan pembatas di akhir dan penanganan teks nada yang panjang
def add_birama():
birama = create_birama_template()
lines = output_text.get("1.0", tk.END).split("\n")
# Cek apakah baris terakhir sudah penuh dengan nada
if lines and len(lines[-2]) > 60: # Anggap panjang 60 karakter sudah dianggap penuh
output_text.insert(tk.END, f"Lirik: |\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, f"{birama}| \n") # Baris pertama: birama baru untuk nada
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
else:
# Jika belum penuh, tambahkan birama biasa
output_text.insert(tk.END, f"{birama}| \n") # Baris pertama: birama untuk nada (dengan pembatas di akhir)
output_text.insert(tk.END, f"Lirik: |\n") # Baris kedua: tempat lirik (dengan pembatas di akhir)
output_text.insert(tk.END, "\n") # Baris ketiga: separator kosong untuk jarak antar birama
Penjelasan:
1. Pengecekan Panjang Baris: Sebelum menambahkan birama baru, kita memeriksa apakah baris terakhir di output_text sudah penuh (lebih dari 60 karakter, sebagai contoh). Jika baris nada penuh, maka lirik dimasukkan ke baris kedua dan birama baru dimulai di baris ketiga.
2. Pengaturan Baris: Birama akan ditambahkan dengan format standar, tetapi jika baris sebelumnya penuh, nada birama berikutnya akan otomatis dipindah ke baris terakhir, lirik dipindah ke baris kedua, dan disisipkan birama baru di baris terakhir.
Dengan penambahan logika ini, birama akan tetap tertata dengan baik meskipun teks nada melebihi panjang baris. Silakan jalankan kode ini untuk melihat hasilnya dalam aplikasi.
Tolong perbaiki kodenya agar supaya :
1. Teks nada dapat di input pada barisnya yang sesuai.
2. Kursor dapat digerakkan ke kiri.
3. Ketika teks nada melebihi panjang di barisnya, maka teks nada akan turun atau pindah ke bawah ke baris sambungan nada setelah baris teks lirik.
Berikut adalah modifikasi kode yang diharapkan, di mana teks nada bisa diinput pada baris yang sesuai, kursor dapat digerakkan ke kiri, dan ketika teks melebihi panjang di barisnya, maka teks akan berpindah ke bawah setelah baris teks lirik.
Langkah utama dalam perbaikan ini mencakup:
1. Memastikan baris-baris input untuk nada dan lirik sesuai.
2. Mengaktifkan pergerakan kursor ke kiri (atau secara umum ke segala arah).
3. Memastikan teks nada yang melebihi batas akan diturunkan ke baris berikutnya.
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
# Setup UI
root = tk.Tk()
root.geometry("690x800")
root.title("Partitur Notasi Angka dengan Font Khusus")
# Fungsi untuk memasukkan simbol notasi yang dipilih ke partitur
def insert_symbol(symbol):
output_text.insert(tk.INSERT, symbol)
# Fungsi untuk memasukkan akord ke partitur, di atas angka nada
def insert_chord(chord):
output_text.insert(tk.INSERT, chord, ("superscript", "chord_color"))
output_text.insert(tk.INSERT, "")
# Simbol notasi yang akan digunakan
symbol_options = ["•", "••", "•••", "\u007C", "||", ":||", "/", "\\", "'",
"0", "♯", "♭", "\u2323", "\u0305", "\u0818", "\u07EB", "\u135E", "\u135F", "\u135D", "\u1A18", "\u0324", "\u1CDF", ""]
# Akord Mayor dan Minor
akord_mayor = ["C", "D", "E", "F", "G", "A", "B"]
akord_minor = ["Am", "Bm", "Cm", "Dm", "Em", "Fm", "Gm"]
# Fungsi untuk membuat template birama
def create_birama_template():
template = "| | | | | | | | | | | | | | | | |" # Garis birama 4/4
return template
# Fungsi untuk menambahkan birama ke output_text
def add_birama():
birama = create_birama_template()
output_text.insert(tk.END, f"{birama}|\n") # Baris pertama: birama untuk nada
output_text.insert(tk.END, f"Lirik: |\n") # Baris kedua: tempat lirik
output_text.insert(tk.END, "\n") # Baris ketiga: separator
# Membuat canvas untuk konten partitur
output_text_canvas = tk.Canvas(root)
output_text_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# Scrollbars untuk canvas
scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=output_text_canvas.yview)
scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)
scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=output_text_canvas.xview)
scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)
output_text_canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)
output_text_canvas.bind('<Configure>', lambda e: output_text_canvas.configure(scrollregion=output_text_canvas.bbox('all')))
# Membuat frame untuk konten di dalam canvas
output_frame = tk.Frame(output_text_canvas)
output_text_canvas.create_window((0, 0), window=output_frame, anchor="nw")
# Membuat kotak untuk tombol simbol notasi
symbol_frame = tk.Frame(output_frame)
symbol_frame.grid(row=0, column=0, pady=5)
# 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=2, command=lambda s=symbol: insert_symbol(s))
button.grid(row=1 + i // 8, column=i % 8, padx=5, pady=5)
# Frame untuk dropdown akord
chord_frame = tk.Frame(output_frame)
chord_frame.grid(row=1, column=0, pady=5)
# Dropdown Akord Mayor
mayor_label = tk.Label(chord_frame, text="Akord Mayor:")
mayor_label.grid(row=0, column=0, padx=10, pady=5)
mayor_dropdown = ttk.Combobox(chord_frame, values=akord_mayor, state="readonly")
mayor_dropdown.grid(row=0, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord mayor yang dipilih ke partitur
mayor_button = tk.Button(chord_frame, text="Tambah Akord Mayor", command=lambda: insert_chord(mayor_dropdown.get()))
mayor_button.grid(row=0, column=2, padx=10, pady=5)
# Dropdown Akord Minor
minor_label = tk.Label(chord_frame, text="Akord Minor:")
minor_label.grid(row=1, column=0, padx=10, pady=5)
minor_dropdown = ttk.Combobox(chord_frame, values=akord_minor, state="readonly")
minor_dropdown.grid(row=1, column=1, padx=10, pady=5)
# Tombol untuk memasukkan akord minor yang dipilih ke partitur
minor_button = tk.Button(chord_frame, text="Tambah Akord Minor", command=lambda: insert_chord(minor_dropdown.get()))
minor_button.grid(row=1, column=2, padx=10, pady=5)
# Fungsi untuk menampilkan partitur dengan indentasi
def show_partitur():
output_text.delete(1.0, tk.END)
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")
# Menonaktifkan tombol setelah ditekan
show_button.config(state=tk.DISABLED, bg="lightgrey", text="Tombol Tidak Aktif")
# Fungsi untuk mengaktifkan kembali tombol Tampil Partitur
def reset_button():
show_button.config(state=tk.NORMAL, bg="grey", text="Tampil Partitur")
# 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 menambahkan birama
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(output_frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)
show_button.grid(row=7, column=0, padx=5, pady=5)
# Tombol untuk mengaktifkan kembali tombol Tampil Partitur
reset_button = tk.Button(output_frame, text="Reset", bg="blue", fg="white", command=reset_button)
reset_button.grid(row=7, column=1, padx=5, pady=5)
# Tombol untuk mem-paste gugus nada ke output_text
paste_gn_button = tk.Button(output_frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)
paste_gn_button.grid(row=8, column=0, padx=5, pady=5)
# Tombol untuk menyimpan partitur
save_button = tk.Button(output_frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)
save_button.grid(row=7, column=2, padx=5, pady=5)
# Tombol untuk menambahkan birama
add_birama_button = tk.Button(output_frame, text="Tambah Birama", bg="grey", fg="white", command=add_birama)
add_birama_button.grid(row=8, column=1, padx=5, pady=5)
# Membuat Text Widget untuk output
output_text = tk.Text(output_frame, wrap=tk.WORD, undo=True, width=80, height=30)
output_text.grid(row=9, column=0, columnspan=3, padx=10, pady=10)
# Menambahkan Scrollbars ke Text Widget
output_text_scroll_y = tk.Scrollbar(output_frame, orient=tk.VERTICAL, command=output_text.yview)
output_text_scroll_y.grid(row=9, column=3, sticky="ns")
output_text['yscrollcommand'] = output_text_scroll_y.set
output_text_scroll_x = tk.Scrollbar(output_frame, orient=tk.HORIZONTAL, command=output_text.xview)
output_text_scroll_x.grid(row=10, column=0, columnspan=3, sticky="we")
output_text['xscrollcommand'] = output_text_scroll_x.set
# Menambah gaya (style) pada text untuk superscript
output_text.tag_configure("superscript", offset=5)
output_text.tag_configure("chord_color", foreground="blue")
output_text.tag_configure("indent", lmargin1=10, lmargin2=10)
# Fungsi untuk menyimpan sementara gugus nada ke dalam file sementara
def copy_gn():
try:
selected_text = output_text.get(tk.SEL_FIRST, tk.SEL_LAST)
with open("temp_gn_value.txt", "w") as temp_file:
temp_file.write(selected_text)
messagebox.showinfo("Sukses", "Gugus Nada berhasil disalin.")
except tk.TclError:
messagebox.showwarning("Peringatan", "Tidak ada teks yang disalin.")
# Tombol untuk menyalin gugus nada ke file sementara
copy_gn_button = tk.Button(output_frame, text="Salin Gn", bg="grey", fg="white", command=copy_gn)
copy_gn_button.grid(row=8, column=2, padx=5, pady=5)
# Fungsi untuk keluar dari aplikasi
def exit_app():
result = messagebox.askquestion("Keluar", "Apakah Anda yakin ingin keluar?", icon="warning")
if result == 'yes':
root.quit()
# Tombol untuk keluar dari aplikasi
exit_button = tk.Button(output_frame, text="Keluar", bg="red", fg="white", command=exit_app)
exit_button.grid(row=11, column=2, padx=10, pady=10)
# Fungsi utama untuk menjalankan aplikasi
def main():
root.mainloop()
# Memanggil fungsi utama
if __name__ == "__main__":
main()
Penjelasan tambahan:
1. Tombol "Tambah Birama": Ditambahkan tombol untuk memasukkan template birama dan lirik ke dalam output_text.
2. Widget Text untuk output: output_text dibuat dengan pengaturan wrap=tk.WORD sehingga teks tidak keluar dari batas kanan dan pindah ke baris berikutnya jika melebihi batas.
3. Scrollbar: Ditambahkan scrollbar vertikal dan horizontal untuk kemudahan navigasi jika teks melebihi ukuran layar.
4. Tag untuk Superscript dan Chord: Digunakan tag untuk superscript dan warna biru pada akord.
5. Fungsi copy_gn: Fungsi ini memungkinkan menyalin teks yang dipilih ke file sementara.
6. Fungsi keluar: exit_app memastikan pengguna diberi peringatan sebelum keluar dari aplikasi.
Ini merupakan keseluruhan kode untuk aplikasi partitur dengan fungsi-fungsi yang diminta seperti input simbol notasi, akord, dan birama dengan antarmuka yang dapat digunakan pengguna.
Bersambung ke...
MEMBUAT TEMPLATE DAN KELENGKAPAN PARTITUR NOTASI ANGKA LAGU (Part-2)
Komentar
Posting Komentar
This Message