Cara Membuat Text Editor Python PyQt5

Cara Membuat Text Editor Python PyQt5 – pesonainformatika.com, halo halo, belajar bahasa pemrograman python lagi, kita upgrade pengetahuan kita, sama seperti pembahasan sebelumnya kita akan belajar bagaimana cara membuat aplikasi desktop menggunakan library PyQt5.

pada studi kasus kali ini kita akan belajar membuat aplikasi text editor sederhana menggunakan python dengan library PyQt5, untuk instalasi dan setup virtual environtment bisa dilihat di postingan sebelumnya.

Seperti Apa Project yang Kita Buat

dalam kasus ini kita akan membuat text editor mirip notepad jika kamu menggunakan windows, atau mirip GNOME Text Edit (Linux), mengapa memilih project ini..?, seperti yang kita tau bahwa text editor selalu ada di setiap sistem operasi, baik itu komputer, android, IOS dan masih banyak lagi, project ini bisa jadi penyemangat buat yang suka ngoding.

Persiapan Project

ada beberapa persiapan sebelum membuat project ada beberapa hal yang harus dipersiapkan seperti

  • Membuat Virtual Environtment Project
  • Instalasi PyQt5

Membuat Virtual Environtment

kita bisa membuat virtual environtment menggunakan 2 cara yaitu menggunakan virtualenv dan menggunakan python langsung berikut caranya

python3 -m venv text_edit_env 
virtualenv -p python3 text_edit_env

setelah terinstall jika menggunakan windows aktifkan dengan perintah

\text_edit_env\Scripts\activate.bat

jika menggunakan linux aktivkan dengan perintah

source ./text_edit_env/bin/activate

Instalasi PyQt5

kita dapat instal dengan mudah menggunakan pip dengan perintah

pip install PyQt5

atau bisa lihat di website pypi untuk perintah instalasinya

Membuat Text Editor

setelah melakukan beberapa persiapan untuk membuat project sekarang kita membuat file python misal bernama main.py, kemudian import modul yang dibutuhkan

import sys
# import module from pyqt
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
from PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
from PyQt5.QtGui import QKeySequence
from PyQt5 import Qt

selanjutnya kita membuat class untuk konfigurasi window pada aplikasi kita

class Window(QWidget):
    def __init__(self):
        super().__init__()

selanjutnya kita inisialisasi path file yang aakn kita gunakan untuk menentukan file yang dibuka, kita buat di bawah fungsi def __init__(self)

self.file_path = None

selanjutnya kita buat konfigurasi shortcut untuk membuka file dan menyimpan file buat dalam fungsi def __init__(self)

""" config shortcut """

# open new file shortcut
self.open_new_file_shortcut = QShortcut(QKeySequence('Ctrl+O'), self)
self.open_new_file_shortcut.activated.connect(self.open_new_file)

# save current file shortcut
self.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), self)
self.save_current_file_shortcut.activated.connect(self.save_current_file)

selanjutnya kita konfigurasi window dan setting text editor area

""" Configure Window for App """
vbox = QVBoxLayout()
window_title_text = 'Untitled File'
self.title = QLabel(window_title_text)
self.title.setWordWrap(True)
self.title.setAlignment(Qt.Qt.AlignCenter)
vbox.addWidget(self.title)
self.setLayout(vbox)

# text editor area
self.scrollable_text_area = QTextEdit()
vbox.addWidget(self.scrollable_text_area)

sekarang kita tentu membutuhkan sebuah fungsi untuk membuka file, agar saat kita menekan sebuah shortcut bisa seperti text editor

# function to open new file
def open_new_file(self):
    self.file_path, filter_type = QFileDialog.getOpenFileName(self, "Open New File", "", "All Files (*)")
    if self.file_path:
        with open(self.file_path, 'r') as f:
            file_content = f.read()
            self.title.setText(self.file_path)
            self.scrollable_text_area.setText(file_content)
    else:
        self.invalid_path_alert_message()

kemudian kita buat fungsi untuk menyimpan file yang sudah di edit menggunakan aplikasi kita

# function to save current file
def save_current_file(self):
    if not self.file_path:
        new_file_path, filter_type = QFileDialog.getOpenFileName(self, "Save this file as..", "", "All Files (*)")
        if new_file_path:
            self.file_path = new_file_path
        else:
            self.invalid_path_alert_message()
            return False
        file_contents = self.scrollable_text_area.toPlainText()
        with open(self.file_path,'w') as f:
            f.write(file_contents)
        self.title.setText(self.file_path)

nah satu langkah lagi kita konfigurasi window popup agar ketika kita mengeklik tombol silang untuk exit akan muncul popup peringatan untuk menyimpan file

# function to handle closeed application warning
def closeEvent(self, event):
    messageBox = QMessageBox()
    title = "Exit Application"
    message = """ "WARNING !!\n\nIf you quit without saving, any changes made to the file
            will be lost.\n\nSave file before quitting?"""
    reply = messageBox.question(self, title, message, messageBox.Yes | messageBox.No | messageBox.Cancel, messageBox.Cancel)
    if reply == messageBox.Yes:
        return_value = self.save_current_file()
        if return_value == False:
            event.ignore()
    elif reply == messageBox.No:
        event.accept()
    else:
        event.ignore()

selanjutnya kita handle error yang akan muncul

def invalid_path_alert_message(self):
    messageBox = QMessageBox()
    messageBox.setWindowTitle("Invalid File, Please select a valid file")
    messageBox.exec()

nah terakhir kita buat agar aplikasi kita bisa dijalankan

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.showMaximized()
    sys.exit(app.exec_())

jika kita jalankan maka hasilnya akan seperti ini

hasil aplikasi text editor yang kita buat
Cara Membuat Text Editor Python PyQt5 - pesonainformatika.com,
pesan invalid file
Popup ketika keluar Aplikasi
Cara Membuat Text Editor Python PyQt5 - pesonainformatika.com
tampilan ketika menyimpan file

Final Code

berikut adalah source code studi kasus pada materi pembahasan kali ini

import sys
# import module from pyqt
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QHBoxLayout
from PyQt5.QtWidgets import QTextEdit, QLabel, QShortcut, QFileDialog, QMessageBox
from PyQt5.QtGui import QKeySequence
from PyQt5 import Qt

# setting window for application
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.file_path = None

        """ config shortcut """

        # open new file shortcut
        self.open_new_file_shortcut = QShortcut(QKeySequence('Ctrl+O'), self)
        self.open_new_file_shortcut.activated.connect(self.open_new_file)

        # save current file shortcut
        self.save_current_file_shortcut = QShortcut(QKeySequence('Ctrl+S'), self)
        self.save_current_file_shortcut.activated.connect(self.save_current_file)

        """ Configure Window for App """
        vbox = QVBoxLayout()
        window_title_text = 'Untitled File'
        self.title = QLabel(window_title_text)
        self.title.setWordWrap(True)
        self.title.setAlignment(Qt.Qt.AlignCenter)
        vbox.addWidget(self.title)
        self.setLayout(vbox)

        # text editor area
        self.scrollable_text_area = QTextEdit()
        vbox.addWidget(self.scrollable_text_area)

    # function to open new file
    def open_new_file(self):
        self.file_path, filter_type = QFileDialog.getOpenFileName(self, "Open New File", "", "All Files (*)")
        if self.file_path:
            with open(self.file_path, 'r') as f:
                file_content = f.read()
                self.title.setText(self.file_path)
                self.scrollable_text_area.setText(file_content)
        else:
            self.invalid_path_alert_message()

    # function to save current file
    def save_current_file(self):
        if not self.file_path:
            new_file_path, filter_type = QFileDialog.getOpenFileName(self, "Save this file as..", "", "All Files (*)")
            if new_file_path:
                self.file_path = new_file_path
            else:
                self.invalid_path_alert_message()
                return False
            file_contents = self.scrollable_text_area.toPlainText()
            with open(self.file_path,'w') as f:
                f.write(file_contents)
            self.title.setText(self.file_path)

    # function to handle closeed application warning
    def closeEvent(self, event):
        messageBox = QMessageBox()
        title = "Exit Application"
        message = """ "WARNING !!\n\nIf you quit without saving, any changes made to the file
                will be lost.\n\nSave file before quitting?"""
        reply = messageBox.question(self, title, message, messageBox.Yes | messageBox.No | messageBox.Cancel, messageBox.Cancel)
        if reply == messageBox.Yes:
            return_value = self.save_current_file()
            if return_value == False:
                event.ignore()
        elif reply == messageBox.No:
            event.accept()
        else:
            event.ignore()

    def invalid_path_alert_message(self):
        messageBox = QMessageBox()
        messageBox.setWindowTitle("Invalid File, Please select a valid file")
        messageBox.exec()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.showMaximized()
    sys.exit(app.exec_())

semoga bermanfaat dan mencoba, ikuti studi kasus lainya di pesonainformatika ada beberapa bahasa pemrograman lainya seperti Java, Python C++