MatrixXpert
Software MatrixXpert adalah sebuah aplikasi berbasis GUI (Graphical User Interface) yang dibuat menggunakan library customtkinter
dan numpy
. Aplikasi ini menyediakan fitur-fitur untuk melakukan operasi dasar pada matriks seperti menghitung invers, determinan, dan transpose dari matriks yang diinput oleh pengguna.
Fitur Utama
- Input Dinamis: Pengguna dapat menyesuaikan jumlah baris dan kolom matriks menggunakan slider.
- Operasi Matriks:
- Menghitung invers matriks
- Menghitung determinan matriks
- Menghitung transpose matriks
- Tampilan yang Dapat Disesuaikan: Pengguna dapat mengubah mode tampilan antara "light" dan "dark".
Struktur Program
1. Import Library
from customtkinter import *
import numpy as np
Library customtkinter
digunakan untuk membuat antarmuka pengguna, sedangkan numpy
digunakan untuk melakukan operasi matriks.
2. Pengaturan Awal
mode = "light"
set_appearance_mode(mode)
set_widget_scaling(1)
set_window_scaling(1)
Mengatur mode tampilan awal dan skala widget serta jendela.
3. Kelas MatrixCalc
Kelas MatrixCalc
merupakan turunan dari kelas CTk
yang mengimplementasikan antarmuka dan logika aplikasi.
a. Inisialisasi
class MatrixCalc(CTk):
def __init__(self):
super().__init__()
self.title("Matrix Kalkulator by Kelompok 5")
self.geometry("625x450")
...
Metode __init__
menginisialisasi jendela utama dan mengatur tata letak elemen GUI.
b. Switch Mode Tampilan
def switch_event(self):
global mode
mode = self.switch_var.get()
set_appearance_mode(mode)
self.update_widgets()
Metode ini digunakan untuk mengubah mode tampilan antara "light" dan "dark".
c. Pembuatan dan Pembaruan Entry Fields
def create_entries(self):
...
def update_entries(self, event):
...
Metode create_entries
dan update_entries
bertanggung jawab untuk membuat dan memperbarui entry fields untuk input matriks berdasarkan nilai slider.
d. Mengambil Data Matriks dari Entry Fields
def get_matrix_from_entries(self):
...
Metode ini mengumpulkan data dari entry fields dan mengubahnya menjadi array numpy.
e. Menampilkan Hasil
def display_result(self, result):
...
Metode ini menampilkan hasil operasi matriks pada label hasil dan menambahkan ke riwayat penghitungan.
f. Operasi Matriks
def find_inverse(self):
...
def find_determinant(self):
...
def find_transpose(self):
...
Metode find_inverse
, find_determinant
, dan find_transpose
melakukan operasi matriks yang sesuai dan menampilkan hasilnya.
4. Menjalankan Aplikasi
app = MatrixCalc()
app.mainloop()
Bagian ini membuat instance dari kelas MatrixCalc
dan menjalankan loop utama aplikasi.
Cara Penggunaan
- Menyesuaikan Ukuran Matriks: Gunakan slider untuk menentukan jumlah baris dan kolom matriks.
- Mengisi Matriks: Masukkan nilai-nilai matriks pada entry fields yang tersedia.
- Operasi Matriks: Klik tombol "Inverse", "Determinant", atau "Transpose" untuk melakukan operasi yang diinginkan.
- Mengubah Mode Tampilan: Gunakan switch untuk beralih antara mode "light" dan "dark".
Kode Sumber Lengkap
from customtkinter import *
import numpy as np
mode = "light"
set_appearance_mode(mode)
set_widget_scaling(1)
set_window_scaling(1)
class MatrixCalc(CTk):
def __init__(self):
super().__init__()
self.title("Matrix Kalkulator by Kelompok 5")
self.geometry("625x450")
self.grid_columnconfigure((0, 1), weight=1)
self.grid_rowconfigure(2, weight=1)
self.minsize(500, 350)
self.framej = CTkFrame(self, border_width=2)
self.framej.grid(row=0, column=0, padx=10, pady=(10, 0), sticky="nswe")
self.framej.grid_columnconfigure(0, weight=1)
self.label = CTkLabel(master=self.framej, text="Matrix Calculator", font=("Arial", 20, "bold"))
self.label.grid(row=0, column=0, padx=15, pady=10, sticky="nsw")
self.switch_var = StringVar(value="light")
self.switch = CTkSwitch(self.framej, text="", command=self.switch_event, width=5,
variable=self.switch_var, onvalue="light", offvalue="dark")
self.switch.grid(row=0, column=1, pady=0, padx=5, sticky="e")
self.frame_main2 = CTkFrame(self, border_width=2)
self.frame_main2.grid(row=1, column=0, pady=(10, 5), sticky="ns")
self.frame_main2.grid_columnconfigure((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), weight=1)
self.frame_main = CTkFrame(self, border_width=2)
self.frame_main.grid(row=2, column=0, padx=10, pady=10, sticky="swe")
self.frame_main.grid_columnconfigure((0, 1), weight=1)
self.slidercol = CTkSlider(master=self.frame_main, from_=1, to=10, number_of_steps=9, orientation='horizontal')
self.slidercol.grid(row=0, column=1, padx=10, pady=5, sticky="we")
self.slidercol.bind("<ButtonRelease-1>", self.update_entries)
self.slidercol.set(5)
self.label_slidercol = CTkLabel(master=self.frame_main, text="Kolom: 5", font=("Arial", 14))
self.label_slidercol.grid(row=0, column=0, padx=10, pady=5, sticky="w")
self.sliderrow = CTkSlider(master=self.frame_main, from_=1, to=10, number_of_steps=9, orientation='horizontal')
self.sliderrow.grid(row=1, column=1, padx=10, pady=5, sticky="we")
self.sliderrow.bind("<ButtonRelease-1>", self.update_entries)
self.sliderrow.set(5)
self.label_sliderrow = CTkLabel(master=self.frame_main, text="Baris: 5", font=("Arial", 14))
self.label_sliderrow.grid(row=1, column=0, padx=10, pady=5, sticky="w")
self.entries = []
self.create_entries()
self.frame_hasil = CTkFrame(self, border_width=2)
self.frame_hasil.grid(row=0, column=1, padx=(0, 10), pady=10, sticky="nswe", rowspan=3)
self.frame_hasil.grid_columnconfigure(0, weight=1)
self.button_inverse = CTkButton(master=self.frame_hasil, text="Inverse", command=self.find_inverse, font=("Arial", 14))
self.button_inverse.grid(row=0, column=0, padx=15, pady=(10, 5), sticky="we")
self.button_determinant = CTkButton(master=self.frame_hasil, text="Determinant", command=self.find_determinant, font=("Arial", 14))
self.button_determinant.grid(row=1, column=0, padx=15, pady=5, sticky="we")
self.button_transpose = CTkButton(master=self.frame_hasil, text="Transpose", command=self.find_transpose, font=("Arial", 14))
self.button_transpose.grid(row=2, column=0, padx=15, pady=5, sticky="we")
self.label_hasil = CTkLabel(master=self.frame_hasil, text="Hasil :", font=("Arial", 14), wraplength=280, justify="left")
self.label_hasil.grid(row=3, column=0, padx=15, pady=10, sticky="w")
self.history_text = CTkTextbox(master=self.frame_hasil, height=200, width=30)
self.history_text.grid(row=4, column=0, padx=10, pady=(5, 10), sticky="nswe")
self.history_text.configure(state='disabled')
def switch_event(self):
global mode
mode = self.switch_var.get()
set_appearance_mode(mode)
self.update_widgets()
def update_widgets(self):
pass
def zero(self, integer):
try:
float_value = float(integer)
if float_value == int(float_value):
return int(float_value)
return float_value
except ValueError:
return None
def create_entries(self):
for row in range(int(self.sliderrow.get())):
row_entries = []
for col in range(int(self.slidercol.get())):
entry = CTkEntry(master=self.frame_main2, width=40)
entry.grid(row=row, column=col, sticky="we")
row_entries.append(entry)
self.entries.append(row_entries)
def update_entries(self, event):
for row in self.entries:
for entry in row:
entry.destroy()
self.entries.clear()
self.create_entries()
self.label_slidercol.configure(text=f"Kolom: {self.zero(self.slidercol.get())}")
self.label_sliderrow.configure(text=f"Baris: {self.zero(self.sliderrow.get())}")
def get_matrix_from_entries(self):
matrix = []
for row_entries in self.entries:
row_values = [self.zero(entry.get()) for entry in row_entries]
matrix.append(row_values)
return np.array(matrix)
def display_result(self, result):
self.label_hasil.configure(text=result)
self.history_text.configure(state='normal')
self.history_text.insert('end', result + '\n\n')
self.history_text.configure(state='disabled')
def find_inverse(self):
try:
matrix = self.get_matrix_from_entries()
inverse = np.linalg.inv(matrix)
self.display_result("Inverse:\n" + str(inverse))
except Exception as e:
self.display_result("Error: " + str(e))
def find_determinant(self):
try:
matrix = self.get_matrix_from_entries()
determinant = np.linalg.det(matrix)
self.display_result("Determinant: " + str(self.zero(determinant)))
except Exception as e:
self.display_result("Error: " + str(e))
def find_transpose(self):
try:
matrix = self.get_matrix_from_entries()
transpose = np.transpose(matrix)
self.display_result("Transpose:\n" + str(transpose))
except Exception as e:
self.display_result("Error: " + str(e))
app = MatrixCalc()
app.mainloop()