Langsung ke konten utama

PEMBUATAN PARTITURE NOTASI ANGKA LAGU (Part-3)

 PEMBUATAN PARTITURE NOTASI ANGKA LAGU (Part-3)


Maunya kita, pengguliran ada pada semua konten isi file partitur_notasi_angka.py sehingga semua elemen GUI dapat digulir ke segala arah.


Untuk menambahkan fungsi pengguliran ke segala arah (baik vertikal maupun horizontal) pada semua elemen GUI dalam aplikasi tkinter, kamu bisa menggunakan widget `tk.Canvas` dan `tk.Scrollbar`. Berikut adalah cara menambahkan fitur ini di sekitar seluruh konten agar aplikasi kamu dapat digulir ke segala arah.


Pada dasarnya, kita akan meletakkan semua elemen GUI ke dalam sebuah `Frame` yang kemudian dimasukkan ke dalam `Canvas`. Lalu, kita menambahkan scrollbars vertikal dan horizontal di sekitar `Canvas` tersebut.


Berikut adalah modifikasi kode `partitur_notasi_angka.py` yang mendukung scroll di segala arah:


```python

import tkinter as tk

from tkinter import filedialog, messagebox


# Fungsi untuk menampilkan placeholder pada entry

def set_placeholder(entry, placeholder_text):

    entry.insert(0, placeholder_text)

    entry.config(fg="grey")


    def on_focus_in(event):

        if entry.get() == placeholder_text:

            entry.delete(0, tk.END)

            entry.config(fg="black")


    def on_focus_out(event):

        if entry.get() == "":

            entry.insert(0, placeholder_text)

            entry.config(fg="grey")


    entry.bind("<FocusIn>", on_focus_in)

    entry.bind("<FocusOut>", on_focus_out)


# Fungsi untuk menampilkan partitur dengan detail tambahan dan memungkinkan pengguna mengedit notasi

def show_partitur():

    output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya

    output_text.insert(tk.END, f"Judul Lagu : \n")

    output_text.insert(tk.END, f"Nada Dasar : \n")

    output_text.insert(tk.END, f"Tanda Birama : \n")

    output_text.insert(tk.END, f"Pencipta : \n")

    output_text.insert(tk.END, f"Arranger : \n")

    output_text.insert(tk.END, "\nPartitur Notasi Angka :\n")

    output_text.insert(tk.END, " \n \n")


# Fungsi untuk menyimpan perubahan

def save_partitur():

    edited_text = output_text.get(1.0, tk.END).strip()

    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])

    if file_path:

        try:

            with open(file_path, 'w') as file:

                file.write(edited_text)

            messagebox.showinfo("Sukses", "Partitur berhasil disimpan.")

        except Exception as e:

            messagebox.showerror("Error", f"Gagal menyimpan partitur: {e}")


# Fungsi untuk mempastekan data dari temp_gn_value.txt ke output_text

def paste_gn():

    try:

        with open("temp_gn_value.txt", "r") as temp_file:

            gn_value = temp_file.read()

        output_text.insert(tk.END, gn_value)

    except FileNotFoundError:

        output_text.insert(tk.END, "Tidak ada data yang dicopy.")


# Setup UI

root = tk.Tk()

root.title("Notasi Angka Lagu")


# Membuat Canvas untuk scrollbars

canvas = tk.Canvas(root)

canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)


# Membuat Scrollbars vertikal dan horizontal

scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)

scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)


scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview)

scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)


canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)


# Membuat Frame dalam Canvas untuk menempatkan semua elemen

frame = tk.Frame(canvas)

canvas.create_window((0, 0), window=frame, anchor="nw")


# Fungsi untuk mengatur scroll region sesuai ukuran konten

def update_scroll_region(event):

    canvas.config(scrollregion=canvas.bbox("all"))


frame.bind("<Configure>", update_scroll_region)


# Entry untuk judul lagu

judul_entry = tk.Entry(frame, justify="center")

judul_entry.grid(row=0, column=1, padx=5, pady=5)

set_placeholder(judul_entry, "Judul Lagu")


# Entry untuk nada dasar lagu

nada_entry = tk.Entry(frame, justify="center")

nada_entry.grid(row=1, column=1, padx=5, pady=5)

set_placeholder(nada_entry, "Nada Dasar")


# Entry untuk tanda sukat (birama) lagu

birama_entry = tk.Entry(frame, justify="center")

birama_entry.grid(row=2, column=1, padx=5, pady=5)

set_placeholder(birama_entry, "Tanda Birama")


# Entry untuk pencipta lagu

pencipta_entry = tk.Entry(frame, justify="center")

pencipta_entry.grid(row=3, column=1, padx=5, pady=5)

set_placeholder(pencipta_entry, "Pencipta")


# Entry untuk arranger lagu

arranger_entry = tk.Entry(frame, justify="center")

arranger_entry.grid(row=4, column=1, padx=5, pady=5)

set_placeholder(arranger_entry, "Arranger")


# Tombol untuk menampilkan partitur

show_button = tk.Button(frame, text="Tampilkan Partitur", bg="grey", fg="white", command=show_partitur)

show_button.grid(row=5, column=0, padx=5, pady=10)


# Tombol untuk menyimpan partitur

save_button = tk.Button(frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)

save_button.grid(row=5, column=2, padx=5, pady=10)


# Tombol untuk mem-paste gugus nada ke output_text

paste_gn_button = tk.Button(frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)

paste_gn_button.grid(row=5, column=1, padx=5, pady=5)


# Label instruksi di atas output_text

instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")

instruksi_label.grid(row=6, column=0, padx=5, pady=5)


# Output text box yang bisa di-edit oleh user

output_text = tk.Text(frame, height=25, width=80, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal

output_text.grid(row=7, column=0, columnspan=3, padx=10, pady=10)


# Scrollbar khusus untuk Text Box (output_text)

text_scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL, command=output_text.yview)

output_text.configure(yscrollcommand=text_scrollbar_y.set)

text_scrollbar_y.grid(row=7, column=3, sticky='ns')


text_scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=output_text.xview)

output_text.configure(xscrollcommand=text_scrollbar_x.set)

text_scrollbar_x.grid(row=8, column=0, columnspan=3, sticky='ew')


# Mengaktifkan scroll di canvas

canvas.bind_all("<MouseWheel>", lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))

canvas.bind_all("<Shift-MouseWheel>", lambda event: canvas.xview_scroll(int(-1*(event.delta/120)), "units"))


root.mainloop()

```


### Perubahan utama:

1. **Canvas**: Membuat `Canvas` sebagai wadah untuk elemen-elemen lain agar bisa digulir ke segala arah.

2. **Scrollbars**: Ditambahkan `Scrollbar` vertikal dan horizontal, serta disambungkan dengan `Canvas`.

3. **Text Widget**: Untuk `Text` (area teks yang dapat diedit), scrollbars vertikal dan horizontal khusus diterapkan dengan `wrap=tk.NONE` agar memungkinkan pengguliran horizontal.


### Penggunaan:

- Seluruh elemen GUI sekarang bisa digulir ke atas, bawah, kiri, dan kanan.

- Text box juga mendukung scroll ke segala arah, sehingga pengguna dapat mengedit partitur dengan nyaman.


Bagian mana yang mengatur tulisan teks pada output_text agar masuk (menjorot) ke dalam


Bagian yang mengatur agar teks pada `output_text` bisa masuk (atau menjorot) ke dalam biasanya melibatkan fungsi **indentasi**. Sayangnya, `Text` widget di tkinter tidak memiliki dukungan bawaan untuk indentasi otomatis seperti pada editor teks biasa, namun kita dapat mengatur indentasi secara manual dengan menggunakan tag.

Berikut adalah langkah-langkah untuk menambahkan indentasi pada `Text` widget dengan menggunakan tag:

1. **Menambahkan tag untuk indentasi**: Tag pada `Text` widget digunakan untuk mengubah format pada bagian tertentu dari teks (misalnya, menambahkan indentasi).

2. **Mengatur tab stop**: Kita bisa mengatur tab stop sehingga ketika pengguna menekan tombol `Tab` atau menggunakan format tertentu, teks akan ter-indentasi.

Contoh modifikasi pada kode yang mengatur indentasi teks di dalam `Text` widget (`output_text`):


```python

# Tambahkan tag untuk indentasi di output_text

output_text.tag_configure("indent", lmargin1=40, lmargin2=40) # lmargin1 untuk baris pertama, lmargin2 untuk baris berikutnya


# Fungsi untuk menampilkan partitur dengan indentasi

def show_partitur():

    output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya

    output_text.insert(tk.END, f"Judul Lagu : \n", "indent")

    output_text.insert(tk.END, f"Nada Dasar : \n", "indent")

    output_text.insert(tk.END, f"Tanda Birama : \n", "indent")

    output_text.insert(tk.END, f"Pencipta : \n", "indent")

    output_text.insert(tk.END, f"Arranger : \n", "indent")

    output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")

    output_text.insert(tk.END, " \n \n", "indent")

```


### Penjelasan:

- **`tag_configure("indent", lmargin1=40, lmargin2=40)`**: Membuat tag bernama `"indent"` yang mengatur margin kiri untuk teks. `lmargin1` adalah margin untuk baris pertama, dan `lmargin2` adalah margin untuk baris-baris berikutnya.

- **`output_text.insert(..., "indent")`**: Setiap kali teks dimasukkan ke dalam `Text` widget, tag `"indent"` ditambahkan sebagai parameter agar teks tersebut mengikuti aturan indentasi yang sudah kita atur.

Dengan konfigurasi di atas, teks yang dihasilkan dalam `output_text` akan otomatis menjorot ke dalam dengan jarak margin yang kamu tentukan.

Kamu bisa menyesuaikan nilai `lmargin1` dan `lmargin2` sesuai kebutuhan untuk mengatur seberapa jauh indentasinya.


Dari deskripsi kode dan tujuan untuk indentasi teks di `output_text`, bagian yang mengatur indentasi adalah baris yang menggunakan `tag_configure` pada widget `Text`. Berikut adalah langkah-langkah penjelasan dan bagian penting yang berperan dalam mengatur indentasi:

1. **Tag Configuration for Indentation**:

   Di dalam kode `partitur_notasi_angka.py`, bagian yang menangani indentasi adalah:

   ```python

   output_text.tag_configure("indent", lmargin1=40, lmargin2=40) 

   ```

   Pada baris ini:

   - `lmargin1=40` mengatur jarak indentasi untuk baris pertama setiap paragraf.

   - `lmargin2=40` mengatur jarak indentasi untuk baris-baris berikutnya dari paragraf yang sama.


2. **Penerapan Tag ke Teks**:

   Saat menambahkan teks ke widget `Text`, tag `indent` diterapkan dengan menggunakan perintah:

   ```python

   output_text.insert(tk.END, "Teks yang ingin ditampilkan", "indent")

   ```

   Di sini, teks yang diinsert ke dalam `output_text` akan menerima indentasi yang sudah ditentukan oleh tag `indent`.


### Penerapan:

Jika ingin menampilkan teks dengan indentasi (menjorok ke dalam), pastikan setiap teks yang ingin diindentasikan menggunakan tag `"indent"`. Kode untuk menampilkan teks dengan indentasi adalah sebagai berikut:

```python

def show_partitur():

    output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya

    output_text.insert(tk.END, f"Judul Lagu : \n", "indent")

    output_text.insert(tk.END, f"Nada Dasar : \n", "indent")

    output_text.insert(tk.END, f"Tanda Birama : \n", "indent")

    output_text.insert(tk.END, f"Pencipta : \n", "indent")

    output_text.insert(tk.END, f"Arranger : \n", "indent")

    output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")

    output_text.insert(tk.END, " \n \n", "indent")

```

Ini akan menampilkan setiap teks di dalam `output_text` dengan jarak indentasi yang sama, baik untuk baris pertama maupun baris selanjutnya, seperti yang diatur oleh `lmargin1` dan `lmargin2`.



Jadi kode selengkapnya untuk file partitur_notasi_angka.py adalah berikut:

import tkinter as tk

from tkinter import filedialog, messagebox


# Fungsi untuk menampilkan placeholder pada entry

def set_placeholder(entry, placeholder_text):

    entry.insert(0, placeholder_text)

    entry.config(fg="grey")


    def on_focus_in(event):

        if entry.get() == placeholder_text:

            entry.delete(0, tk.END)

            entry.config(fg="black")


    def on_focus_out(event):

        if entry.get() == "":

            entry.insert(0, placeholder_text)

            entry.config(fg="grey")


    entry.bind("<FocusIn>", on_focus_in)

    entry.bind("<FocusOut>", on_focus_out)


# Fungsi untuk menampilkan partitur dengan indentasi

def show_partitur():

    output_text.delete(1.0, tk.END) # Menghapus teks sebelumnya

    output_text.insert(tk.END, f"Judul Lagu : \n", "indent")

    output_text.insert(tk.END, f"Nada Dasar : \n", "indent")

    output_text.insert(tk.END, f"Tanda Birama : \n", "indent")

    output_text.insert(tk.END, f"Pencipta : \n", "indent")

    output_text.insert(tk.END, f"Arranger : \n", "indent")

    output_text.insert(tk.END, "\nPartitur Notasi Angka :\n", "indent")

    output_text.insert(tk.END, " \n \n", "indent")


# Fungsi untuk menyimpan perubahan

def save_partitur():

    edited_text = output_text.get(1.0, tk.END).strip()

    file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text Files", "*.txt")])

    if file_path:

        try:

            with open(file_path, 'w') as file:

                file.write(edited_text)

            messagebox.showinfo("Sukses", "Partitur berhasil disimpan.")

        except Exception as e:

            messagebox.showerror("Error", f"Gagal menyimpan partitur: {e}")


# Fungsi untuk mempastekan data dari temp_gn_value.txt ke output_text

def paste_gn():

    try:

        with open("temp_gn_value.txt", "r") as temp_file:

            gn_value = temp_file.read()

        output_text.insert(tk.END, gn_value)

    except FileNotFoundError:

        output_text.insert(tk.END, "Tidak ada data yang dicopy.")


# Setup UI

root = tk.Tk()

root.geometry("690x1390")

root.title("Notasi Angka Lagu")


# Membuat Canvas untuk scrollbars

canvas = tk.Canvas(root)

canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)


# Membuat Scrollbars vertikal dan horizontal

scrollbar_y = tk.Scrollbar(root, orient=tk.VERTICAL, command=canvas.yview)

scrollbar_y.pack(side=tk.RIGHT, fill=tk.Y)


scrollbar_x = tk.Scrollbar(root, orient=tk.HORIZONTAL, command=canvas.xview)

scrollbar_x.pack(side=tk.BOTTOM, fill=tk.X)


canvas.configure(yscrollcommand=scrollbar_y.set, xscrollcommand=scrollbar_x.set)


# Membuat Frame dalam Canvas untuk menempatkan semua elemen

frame = tk.Frame(canvas)

canvas.create_window((0, 0), window=frame, anchor="nw")


# Fungsi untuk mengatur scroll region sesuai ukuran konten

def update_scroll_region(event):

    canvas.config(scrollregion=canvas.bbox("all"))


frame.bind("<Configure>", update_scroll_region)


# Entry untuk judul lagu

judul_entry = tk.Entry(frame, justify="center")

judul_entry.grid(row=0, column=1, padx=5, pady=5)

set_placeholder(judul_entry, "Judul Lagu")


# Entry untuk nada dasar lagu

nada_entry = tk.Entry(frame, justify="center")

nada_entry.grid(row=1, column=1, padx=5, pady=5)

set_placeholder(nada_entry, "Nada Dasar")


# Entry untuk tanda sukat (birama) lagu

birama_entry = tk.Entry(frame, justify="center")

birama_entry.grid(row=2, column=1, padx=5, pady=5)

set_placeholder(birama_entry, "Tanda Birama")


# Entry untuk pencipta lagu

pencipta_entry = tk.Entry(frame, justify="center")

pencipta_entry.grid(row=3, column=1, padx=5, pady=5)

set_placeholder(pencipta_entry, "Pencipta")


# Entry untuk arranger lagu

arranger_entry = tk.Entry(frame, justify="center")

arranger_entry.grid(row=4, column=1, padx=5, pady=5)

set_placeholder(arranger_entry, "Arranger")


# Tombol untuk menampilkan partitur

show_button = tk.Button(frame, text="Tampil Partitur", bg="grey", fg="white", command=show_partitur)

show_button.grid(row=5, column=0, padx=5, pady=10)


# Tombol untuk mem-paste gugus nada ke output_text

paste_gn_button = tk.Button(frame, text="Paste Gn", bg="grey", fg="white", command=paste_gn)

paste_gn_button.grid(row=5, column=1, padx=5, pady=5)


# Tombol untuk menyimpan partitur

save_button = tk.Button(frame, text="Simpan Partitur", bg="grey", fg="white", command=save_partitur)

save_button.grid(row=5, column=2, padx=5, pady=10)


# Label instruksi di atas output_text

instruksi_label = tk.Label(frame, text="Partitur Notasi Angka (Edit di bawah sini):")

instruksi_label.grid(row=6, column=0, padx=5, pady=5)


# Output text box yang bisa di-edit oleh user

output_text = tk.Text(frame, height=60, width=64, wrap=tk.NONE) # wrap=tk.NONE untuk mendukung scroll horizontal

output_text.grid(row=7, column=0, columnspan=3, padx=10, pady=10)


# Tambahkan tag untuk indentasi di output_text

output_text.tag_configure("indent", lmargin1=40, lmargin2=40) # lmargin1 untuk baris pertama, lmargin2 untuk baris berikutnya


# Scrollbar khusus untuk Text Box (output_text)

text_scrollbar_y = tk.Scrollbar(frame, orient=tk.VERTICAL, command=output_text.yview)

output_text.configure(yscrollcommand=text_scrollbar_y.set)

text_scrollbar_y.grid(row=7, column=3, sticky='ns')


text_scrollbar_x = tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=output_text.xview)

output_text.configure(xscrollcommand=text_scrollbar_x.set)

text_scrollbar_x.grid(row=8, column=0, columnspan=3, sticky='ew')


# Mengaktifkan scroll di canvas

canvas.bind_all("<MouseWheel>", lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))

canvas.bind_all("<Shift-MouseWheel>", lambda event: canvas.xview_scroll(int(-1*(event.delta/120)), "units"))


root.mainloop()


Dan kode selengkapnya untuk file CRUD gn a bass.py adalah berikut:

import tkinter as tk

from tkinter import ttk

from tkinter import messagebox

import sqlite3

import os # untuk membuka file partitur_notasi_angka.py


# Initialize the main window

root = tk.Tk()

root.geometry("690x1390")

root.title("Arah Arus Musik Gn_Cyan_Atas dan Sub_Gn_Cyan_Atas")


# Bottom Frame

bottom_frame = tk.Frame(root, bg="#e2e2e2")

bottom_frame.pack(side=tk.TOP, fill=tk.X)


# Fungsi untuk menampilkan messagebox dan memvalidasi input level_gn

def validate_level_gn():

    try:

        level_gn = int(entry_level_gn.get())


        if level_gn in [1, 4, 7, 10]:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 1")

            set_id_entry(1)

        elif level_gn in [2, 5, 8, 11]:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 2")

            set_id_entry(2)

        elif level_gn in [3, 6, 9, 12]:

            messagebox.showinfo("Info", "Lanjut dengan memasukkan input ID = 3")

            set_id_entry(3)

        else:

            messagebox.showerror("Error", "Masukkan input yang benar.\nInput Level Gn adalah 1 hingga 12")

            reset_entries()


    except ValueError:

        messagebox.showerror("Error", "Input harus berupa angka.")

        reset_entries()


# Fungsi untuk mengatur entry ID dan mencegah input selain ID yang valid

def set_id_entry(valid_id):

    entry_id.delete(0, tk.END)

    entry_id.insert(0, valid_id)

    entry_id.config(state='readonly') # Membatasi input hanya pada ID yang valid


# Fungsi untuk mereset entries jika input level_gn tidak valid

def reset_entries():

    entry_level_gn.delete(0, tk.END)

    entry_id.config(state='normal')

    entry_id.delete(0, tk.END)


# Fungsi untuk menampilkan data ke Entry setelah pemilihan nada

def pilih_nada():

    try:

        level_gn_selected = int(entry_level_gn.get())

        id_selected = int(entry_id.get())

        progres_selected = int(progres_var.get())

        mode_selected = mode_var.get().lower()


        # Ambil data berdasarkan level_gn_selected, id_selected, progres_selected, dan mode_selected

        result = level_gn(id_selected, progres_selected, mode_selected, level_gn_selected)


        # Tampilkan data ke dalam entry

        gn_a_bass_entry.delete(0, tk.END)

        gn_a_bass_entry.insert(0, result["Gugusan_nada"])    

    

    except Exception as e:

        print("Error:", e)

        

    finally:

        # Menghapus status read-only sementara

        entry_id.config(state='normal')

        

        # Bersihkan atau reset entry dan combobox setelah tombol pilih_nada ditekan

        entry_level_gn.delete(0, 'end')

        entry_id.delete(0, 'end')

        progres_combobox.set('')

        mode_combobox.set('')       

        # Kembalikan status read-only setelah menghapus isinya

        entry_id.config(state='readonly')  

        reset_entries()         


# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(str((int(digit) - pengurang) % 10) for digit in value if digit.isdigit())

    return adjusted_value


# Pengurangan hanya pada perubahan Level Gn, progres tidak mengubah gugusan_nada

def level_gn(id, progres_selected, mode_selected, level_gn_selected):

    conn = sqlite3.connect('DATAMUSIK.db')

    cursor = conn.cursor()


    # Query untuk pengambilan data dari tabel Gn_A_Bass

    query = """

        SELECT Gugusan_nada

        FROM Gn_A_Bass

        WHERE ID = ?

    """

    cursor.execute(query, (id,))

    data = cursor.fetchone()


    gugusan_nada = data[0]


    # Sesuaikan nilai Bass hanya berdasarkan level_gn

    gugusan_nada = apply_level_adjustment(gugusan_nada, level_gn_selected)

    

    conn.close()


    # Return hasil

    result = {

        "Gugusan_nada": gugusan_nada

    }

    return result

              

# Tambahkan tombol untuk memvalidasi level_gn

validate_button = tk.Button(bottom_frame, text="Validasi Level Gn", bg="yellow", command=validate_level_gn)

validate_button.grid(row=3, column=2, padx=0, pady=7)


# Tombol untuk memproses pemilihan nada

button_pilih_nada = tk.Button(bottom_frame, text="Pilih Nada", bg="grey", fg="white", command=pilih_nada)

button_pilih_nada.grid(row=8, column=1, padx=5, pady=5)


separator = ttk.Separator(bottom_frame, orient='horizontal')

separator.grid(row=9, column=0, sticky="ew", pady=15)


#Gugusan Nada Terpilih: "Gn_A_Bass" Terpilih 

gugusan_label = tk.Label(bottom_frame, text="Gn_A_Bass", fg="tomato")

gugusan_label.grid(row=0, column=0, padx=10, pady=5, sticky="ew")  


# Labels dan Entries

label_level_gn = tk.Label(bottom_frame, text="Level_Gn:")

label_level_gn.grid(row=3, column=0, padx=5, pady=5)

entry_level_gn = tk.Entry(bottom_frame)

entry_level_gn.grid(row=3, column=1, padx=5, pady=5)


label_id = tk.Label(bottom_frame, text="ID:")

label_id.grid(row=4, column=0, padx=5, pady=5)

entry_id = tk.Entry(bottom_frame)

entry_id.grid(row=4, column=1, padx=5, pady=5)


label_progres = tk.Label(bottom_frame, text="Progres:")

label_progres.grid(row=5, column=0, padx=5, pady=5)

progres_var = tk.StringVar()

progres_combobox = ttk.Combobox(bottom_frame, textvariable=progres_var)

progres_combobox['values'] = (1, 2, 3)

progres_combobox.grid(row=5, column=1, padx=5, pady=5)


label_mode = tk.Label(bottom_frame, text="Mode:")

label_mode.grid(row=6, column=0, padx=5, pady=5)

mode_var = tk.StringVar()

mode_combobox = ttk.Combobox(bottom_frame, textvariable=mode_var)

mode_combobox['values'] = ("Naik", "Turun")

mode_combobox.grid(row=6, column=1, padx=5, pady=5)


separator = ttk.Separator(bottom_frame, orient='horizontal')

separator.grid(row=7, column=0, sticky="ew", pady=4)


# Gugusan Nada Terpilih Field

Gn_tetpilih_label = tk.Label(bottom_frame, text="Gugusan- \n Nada Terpilih:")

Gn_tetpilih_label.grid(row=11, column=0, padx=5, pady=5)  

      

# Label dan Entry

gn_a_bass_label = tk.Label(bottom_frame, text="Bass")

gn_a_bass_label.grid(row=10, column=1, padx=10, pady=5)  

gn_a_bass_entry = tk.Entry(bottom_frame, bg="white")

gn_a_bass_entry.grid(row=11, column=1, padx=10, pady=5)


def buka_partitur():

    filepath = "partitur_notasi_angka.py"

    try:

        with open(filepath, 'r') as file:

            exec(file.read(), globals())

        messagebox.showinfo("Success", "File executed successfully")

    except Exception as e:

        messagebox.showerror("Error", f"Failed to execute file: {e}")     


def copy_gn():

    # Ambil nilai dari entry gn_a_bass_entry

    gn_value = gn_a_bass_entry.get()


    # Simpan nilai ke clipboard (opsional)

    root.clipboard_clear()

    root.clipboard_append(gn_value)


    # Simpan nilai gn_value ke file sementara

    with open("temp_gn_value.txt", "w") as temp_file:

        temp_file.write(gn_value)

    

    # Buka file partitur_notasi_angka.py

    os.system('python partitur_notasi_angka.py')


def copy_dan_buka_partitur():

    # Copy gn_a_bass_entry

    copy_gn()    

    # Buka partitur

    buka_partitur()


# Tombol Copy sekaligus Buka Partitur

button_copy_gn_buka = tk.Butt

on(bottom_frame, text="Copy & Buka Partitur", bg="grey", fg="white", command=copy_dan_buka_partitur)

button_copy_gn_buka.grid(row=12, column=1)


button_buka_partitur = tk.Button(bottom_frame, text="Buka Partitur", bg="grey", fg="white", command=buka_partitur)

button_buka_partitur.grid(row=12, column=2, padx=5, pady=5)


root.mainloop()


Kode yang Anda bagikan terlihat sudah mendekati lengkap untuk kedua file yang Anda ingin buat, yaitu `partitur_notasi_angka.py` dan `CRUD gn a bass.py`. Namun, ada sedikit bagian di akhir pada fungsi `apply_level_adjustment` yang belum selesai, serta beberapa area kecil yang mungkin bisa diperbaiki untuk menjaga konsistensi dan kesesuaian fungsionalitas.


Saya akan melengkapi kode yang hilang dan memberikan saran lebih lanjut.


### Lengkapi Fungsi `apply_level_adjustment`:

Pada file `CRUD gn a bass.py`, fungsi `apply_level_adjustment` perlu dilengkapi dengan logika pengurangan nilai berdasarkan `level_gn`. Anda mungkin ingin menggunakan ini untuk menyesuaikan nilai tertentu berdasarkan level, tergantung pada kebutuhan aplikasi.


Berikut adalah kelengkapan untuk fungsi tersebut:


```python

# Fungsi untuk menerapkan pengurangan berdasarkan level_gn tanpa mempertimbangkan progres

def apply_level_adjustment(value, level_gn_selected):

    # Tentukan pengurang berdasarkan level_gn

    if level_gn_selected in [1, 2, 3]:

        pengurang = 0

    elif level_gn_selected in [4, 5, 6]:

        pengurang = 1

    elif level_gn_selected in [7, 8, 9]:

        pengurang = 2

    elif level_gn_selected in [10, 11, 12]:

        pengurang = 3


    # Sesuaikan nilai string berdasarkan pengurang

    adjusted_value = ''.join(

        str(int(char) - pengurang) if char.isdigit() else char for char in value

    )

    

    return adjusted_value

```


Pada fungsi ini, nilai `value` (yang diasumsikan sebagai string) akan disesuaikan berdasarkan level `gn_selected`, dengan setiap karakter numerik dikurangi oleh `pengurang` sesuai level.


### Pengelolaan Scroll dan Ukuran Tampilan

Di bagian file `partitur_notasi_angka.py`, pengaturan scroll dan kanvas sudah baik, namun pastikan ukuran jendela (`690x1390`) sesuai dengan kebutuhan layar pengguna. Jika ukuran terlalu besar atau kecil, Anda bisa mempertimbangkan opsi untuk mengubahnya secara dinamis.


Dengan modifikasi-modifikasi ini, kedua file Anda sudah lengkap dan siap untuk diimplementasikan dalam aplikasi berbasis tkinter. Jika ada pertanyaan lebih lanjut atau butuh bantuan tambahan untuk bagian spesifik, jangan ragu untuk bertanya!



Selesai...


Komentar

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...