Skip to content

MatrixXpert ​

Download

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 ​

  1. Input Dinamis: Pengguna dapat menyesuaikan jumlah baris dan kolom matriks menggunakan slider.
  2. Operasi Matriks:
    • Menghitung invers matriks
    • Menghitung determinan matriks
    • Menghitung transpose matriks
  3. Tampilan yang Dapat Disesuaikan: Pengguna dapat mengubah mode tampilan antara "light" dan "dark".

Struktur Program ​

1. Import Library ​

python
from customtkinter import *
import numpy as np

Library customtkinter digunakan untuk membuat antarmuka pengguna, sedangkan numpy digunakan untuk melakukan operasi matriks.

2. Pengaturan Awal ​

python
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 ​

python
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 ​

python
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 ​

python
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 ​

python
def get_matrix_from_entries(self):
    ...

Metode ini mengumpulkan data dari entry fields dan mengubahnya menjadi array numpy.

e. Menampilkan Hasil ​

python
def display_result(self, result):
    ...

Metode ini menampilkan hasil operasi matriks pada label hasil dan menambahkan ke riwayat penghitungan.

f. Operasi Matriks ​

python
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 ​

python
app = MatrixCalc()
app.mainloop()

Bagian ini membuat instance dari kelas MatrixCalc dan menjalankan loop utama aplikasi.

Cara Penggunaan ​

Download

  1. Menyesuaikan Ukuran Matriks: Gunakan slider untuk menentukan jumlah baris dan kolom matriks.
  2. Mengisi Matriks: Masukkan nilai-nilai matriks pada entry fields yang tersedia.
  3. Operasi Matriks: Klik tombol "Inverse", "Determinant", atau "Transpose" untuk melakukan operasi yang diinginkan.
  4. Mengubah Mode Tampilan: Gunakan switch untuk beralih antara mode "light" dan "dark".

Kode Sumber Lengkap ​

python
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()

Tim Kami

Pengembangan MatrixXpert dibangun oleh tim mahasiswa Teknologi Informasi, semuanya telah memilih untuk ditampilkan di bawah ini.

Muhammad Safiul Rifki

Muhammad Safiul Rifki

2310506005

Wiyandra Syaiful Abidin

Wiyandra Syaiful Abidin

2310506009

Meily Adennia

Meily Adennia

2310506013

Defa Augista Montaine Dhanarto Putera

Defa Augista Montaine Dhanarto Putera

2320506028

Dika Elsaputra

Dika Elsaputra

2320506032