(Python dan PyQt4) Dokumen editor versi 10

BelajarPython - Assalamualaikum wr. wb.

Haii.. Jumpa lagi dengan saya moham.. Pada kesempatan kali ini saya akan mencoba untuk melanjutkan atau mengupgrade versi dari aplikasi sebelumnya.. Walaupun perubahan nya tidak terlalu mentereng, tapi saya rasa akan membuat kualitas pembelajaran kalian akan lebih baik.. nah penasaran kan... Yuk langsung saja kita simak potingan kali ini temen - temen....

Pengenalan aplikasi yang akan kita buat.

Oke saya jelaskan lebih rinci lagi.. Jadi, seperti yang sudah saya katakan di atas, aplikasi yang akan saya buat kali ini merupakan penerus dari aplikasi dokumen editor versi ke sembilan.. Walaupun dengan perubahah yang tak terlalu mentereng..

Pada versi ke sepuluh kali ini, saya akan mencoba untuk menambahkan sebuah fitur untuk yang berhubungan dengan cetak mencetak dari dokumen yang telah kita buat.. Yang sebenarnya ada penambahan 3 fitur pada versi kali ini.. 3 fitur tersebut adalah print, print to pdf, dan print preview.  Nah seperti yang sudah saya katakan tadi ya temen - temen.. 3 fitur tersebut masih berhubungan dengan masala cetak mencetak.. hehe

Ya memang kurang mentereng,, tapi, saya rasa akan baik jika aplikasi ini saya kembangkan secara perlahan.. Jika kalian kurang suka dengan perubahan versi 10 ini, kalian bisa langsung saja lanjut ke versi 11 ya temen - temen... :)

Nah, untuk kalian yang ingin melihat perkembangan tiap versinya, kalian bisa KLIK DISINI. Dimana saya telah membuat rangkumannya beserta penjelasan fitur - fitur tiap versinya..

Spesifikasi dan fitur dokumen editor versi 10.0 di python.

Oya perlu kalian ketahui lagi.. Modul untuk membuat tampilan dokumen editor ini saya menggunakan pyQt4... Untuk proses install nya, kalian BISA KLIK DISINI. Dan untuk lebih jelasnya mengenai aplikasi kali ini, simak penjabaran spesifikasi berikut ini ya temen - temen....

Nama: mn-dokumen 10.0
Versi: 10.0
Platform: Python 3.x
Modul: PyQt4. Klik disini untuk instalasi PyQt4.
Baris Code: kurang lebih 430 baris code program.
Fitur: Print, Print to pdf, dan print preview.
syarat menjalankan: install python 3.x dan PyQt4, punya editor teks atau IDE.
Cara menjalankan: install python 3 dan PyQt4, copy dan paste code program pada editor atau IDE, simpan dalam file python(ekstensi .py), lalu jalankan.


Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Code program untuk membuat aplikasi dokumen editor versi 10.0 PyQt4 python.

Nah biar tidak penasaran, yuk langsung saja simak sama - sama code program untuk membuat aplikasi dokumen editor ini... Silahkan di simak di bawah ini ya temen - temen.. Let’s check it out...

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

class Main(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None)
        self.initUI()
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('sgi'))

    def initUI(self):
        # ---------Window settings --------------------------------
        self.buatLembarKerja()
        self.buatToolbar1()
        self.buatToolbar2()
        self.buatToolbar3()
        self.buatStatusBar()
        self.setScroll()
        # ------- Toolbar --------------------------------------

        # -- Upper Toolbar --

    def buatToolbar1(self):
        self.perintahBaru = QtGui.QAction("New", self)
        self.perintahBaru.setShortcut("Ctrl+N")
        self.perintahBaru.setStatusTip("Buat Dokumen Baru.")
        self.perintahBaru.triggered.connect(self.New)

        self.perintahBuka = QtGui.QAction("Open", self)
        self.perintahBuka.setStatusTip("Buka dokumen yang telah disimpan")
        self.perintahBuka.setShortcut("Ctrl+O")
        self.perintahBuka.triggered.connect(self.Open)

        self.perintahSimpan = QtGui.QAction("Save", self)
        self.perintahSimpan.setStatusTip("Simpan dokumen yang telah dibuat")
        self.perintahSimpan.setShortcut("Ctrl+S")
        self.perintahSimpan.triggered.connect(self.Save)

        self.perintahPreview = QtGui.QAction("view", self)
        self.perintahPreview.setStatusTip("Lihat halaman sebelum di print")
        self.perintahPreview.setShortcut("Ctrl+Shift+P")
        self.perintahPreview.triggered.connect(self.PageView)

        self.perintahCut = QtGui.QAction("Cut", self)
        self.perintahCut.setStatusTip("Copy ke klipboard dan hapus teks yang di block")
        self.perintahCut.setShortcut("Ctrl+X")
        self.perintahCut.triggered.connect(self.Cut)

        self.perintahCopy = QtGui.QAction("Copy", self)
        self.perintahCopy.setStatusTip("Copy ke klipboard teks yang di block")
        self.perintahCopy.setShortcut("Ctrl+C")
        self.perintahCopy.triggered.connect(self.Copy)

        self.perintahPaste = QtGui.QAction("Paste", self)
        self.perintahPaste.setStatusTip("Paste teks dari clipboard")
        self.perintahPaste.setShortcut("Ctrl+V")
        self.perintahPaste.triggered.connect(self.Paste)

        self.perintahUndo = QtGui.QAction("Undo", self)
        self.perintahUndo.setStatusTip("Batalkan perintah terakhir")
        self.perintahUndo.setShortcut("Ctrl+Z")
        self.perintahUndo.triggered.connect(self.Undo)

        self.perintahRedo = QtGui.QAction("Redo", self)
        self.perintahRedo.setStatusTip("Batalkan perintah Undo terakhir")
        self.perintahRedo.setShortcut("Ctrl+Y")
        self.perintahRedo.triggered.connect(self.Redo)

        self.perintahPrint = QtGui.QAction("Print", self)
        self.perintahPrint.setStatusTip("Cetak dokumen anda")
        self.perintahPrint.setShortcut("Ctrl+P")
        self.perintahPrint.triggered.connect(self.Print)

        self.perintahPdf = QtGui.QAction("PDF", self)
        self.perintahPdf.setStatusTip("Simpan sebagai PDF")
        self.perintahPdf.triggered.connect(self.PDF)

        self.perintahKeluar = QtGui.QAction("Exit", self)
        self.perintahKeluar.setStatusTip("Ingin Keluar ?")
        self.perintahKeluar.triggered.connect(self.exit)

        self.toolbar = self.addToolBar("Options")
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.perintahBaru)
        self.toolbar.addAction(self.perintahBuka)
        self.toolbar.addAction(self.perintahSimpan)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.perintahPrint)
        self.toolbar.addAction(self.perintahPdf)
        self.toolbar.addAction(self.perintahPreview)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.perintahCut)
        self.toolbar.addAction(self.perintahCopy)
        self.toolbar.addAction(self.perintahPaste)
        self.toolbar.addAction(self.perintahUndo)
        self.toolbar.addAction(self.perintahRedo)
        self.toolbar.addSeparator()
        self.toolbar.addAction(self.perintahKeluar)
        self.addToolBarBreak()
        self.toolbar.setMovable(False)

        self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)

        # -- Lower Toolbar --

    def buatToolbar2(self):
        self.jenisFont = QtGui.QFontComboBox(self)
        self.jenisFont.currentFontChanged.connect(self.FontFamily)

        ukuranFont = QtGui.QComboBox(self)
        ukuranFont.setEditable(True)
        ukuranFont.setMinimumContentsLength(3)
        ukuranFont.activated.connect(self.FontSize)
        flist = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 44, 48,
                 54, 60, 66, 72, 80, 88, 96]
        for i in flist:
            ukuranFont.addItem(str(i))

        # warnaFont = QtGui.QAction("font color", self)
        self.warnaFont = QtGui.QPushButton('Text')
        self.warnaFont.setStyleSheet('QPushButton {color: black;font-weight:bold; text-decoration: underline; }')
        self.warnaFont.setFlat(True)
        self.warnaFont.setFixedSize(40, 20)
        self.warnaFont.clicked.connect(self.ubahWarna)

        self.warnaBackground = QtGui.QPushButton("Background")
        self.warnaBackground.setStyleSheet('QPushButton {color: white;font-weight:bold; text-decoration: underline; }')
        self.warnaBackground.setFixedSize(80, 20)
        self.warnaBackground.setFlat(True)
        self.warnaBackground.clicked.connect(self.ubahWarnaBackground)

        perintahTebal = QtGui.QAction("Bold", self, checkable=True)
        perintahTebal.setStatusTip("Tebalkan Teks")
        perintahTebal.setShortcut("Ctrl+B")
        perintahTebal.triggered.connect(self.Bold)

        perintahMiring = QtGui.QAction("Italic", self, checkable=True)
        perintahMiring.setStatusTip("Miringkan Teks")
        perintahMiring.setShortcut("Ctrl+I")
        perintahMiring.triggered.connect(self.Italic)

        perintahGarisBawah = QtGui.QAction("Underline", self, checkable=True)
        perintahGarisBawah.setStatusTip("Beri Garis bawah Teks")
        perintahGarisBawah.setShortcut("Ctrl+U")
        perintahGarisBawah.triggered.connect(self.Underl)

        space1 = QtGui.QLabel("  ", self)
        space2 = QtGui.QLabel(" ", self)

        self.formatbar = self.addToolBar("Format")
        self.formatbar.addWidget(self.jenisFont)
        self.formatbar.addWidget(space1)
        self.formatbar.addWidget(ukuranFont)
        self.formatbar.addWidget(space2)

        self.formatbar.addSeparator()

        self.formatbar.addWidget(self.warnaFont)
        self.formatbar.addWidget(self.warnaBackground)

        self.formatbar.addSeparator()

        self.formatbar.addAction(perintahTebal)
        self.formatbar.addAction(perintahMiring)
        self.formatbar.addAction(perintahGarisBawah)
        self.formatbar.addSeparator()

        self.toolbar.setMovable(False)
        self.formatbar.setMovable(False)

    def buatToolbar3(self):

        self.left = QtGui.QAction("left", self)
        self.left.triggered.connect(self.alignLeft)

        self.center = QtGui.QAction("center", self)
        self.center.triggered.connect(self.alignCenter)

        self.right = QtGui.QAction("right", self)
        self.right.triggered.connect(self.alignRight)

        self.justify = QtGui.QAction("justify", self)
        self.justify.triggered.connect(self.alignJustify)

        self.bullet = QtGui.QAction("Bullet", self)
        self.bullet.triggered.connect(self.BulletList)

        self.numbering = QtGui.QAction("Numbered", self)
        self.numbering.triggered.connect(self.NumberedList)

        self.paragrafBar = self.addToolBar("paragraf")
        self.paragrafBar.addAction(self.bullet)
        self.paragrafBar.addAction(self.numbering)

        self.paragrafBar.addSeparator()
        self.paragrafBar.addAction(self.left)
        self.paragrafBar.addAction(self.center)
        self.paragrafBar.addAction(self.right)
        self.paragrafBar.addAction(self.justify)

        self.paragrafBar.setMovable(False)

    def buatLembarKerja(self):
        # ------- Text Edit -----------------------------------
        widget = QtGui.QWidget(self)
        self.mainLayout = QtGui.QHBoxLayout(widget)

        self.text = QtGui.QTextEdit(self)
        self.text.setMaximumWidth(793.700787402)
        self.text.setMinimumWidth(793.700787402)
        self.text.setMinimumHeight(1122.519685039)
        self.mainLayout.addWidget(self.text)
        self.text.setFocus()
        self.setCentralWidget(widget)
        self.setCentralWidget(widget)

        # --------dokumen---------
        self.dokumen = QtGui.QTextDocument(self)
        self.text.setDocument(self.dokumen)
        self.text.undoAvailable.connect(self.undoTersedia)
        self.text.redoAvailable.connect(self.redoTersedia)

    def undoTersedia(self, b):
        self.perintahUndo.setEnabled(b)

    def redoTersedia(self, b):
        self.perintahRedo.setEnabled(b)

    def buatStatusBar(self):
        # ------- Statusbar ------------------------------------
        self.status = self.statusBar()
        self.text.cursorPositionChanged.connect(self.CursorPosition)

    def setScroll(self):
        # mengatur scroll
        self.scrollArea = QtGui.QScrollArea()
        self.scrollArea.setWidget(self.text)
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Mid)
        self.scrollArea.setAlignment(Qt.AlignCenter)

        self.mainLayout.addWidget(self.scrollArea)

    def New(self):
        self.text.clear()

    def Open(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File')
        if filename:
            file = QtCore.QFileInfo(filename)
            nama = file.fileName()

            jumlah = len(nama)
            penentu = False
            if len(nama) > 3:
                if nama[jumlah - 1] != 'n':
                    if nama[jumlah - 2] != 'm':
                        if nama[jumlah - 3] != '.':
                            penentu = True
            if penentu or jumlah <= 3:
                QtGui.QMessageBox.critical(self, "Kesalahan",
                                           self.tr("Maaf!! aplkasi Mn-Editor ini hanya bisa membuka"
                                                   "\nfile dengan file ber-ekstensi (.mn)"
                                                   " mohon pilih file yang tepat."))
            else:
                try:
                    f = open(filename, 'r')
                    filedata = f.read()
                    self.text.setHtml(filedata)
                    f.close()
                except:
                    QtGui.QMessageBox.critical(self, "Kesalahan",
                                               self.tr("Maaf!! aplkasi Mn-Editor tidak bisa membuka file\n"
                                                       "yang telah anda pilih. yaitu '%s'\n"
                                                       "kemungkinan file telah rusak." % nama))

    def Save(self):
        filename = QtGui.QFileDialog.getSaveFileName(self, caption='Save File', filter='*;;*.mn')
        if filename:
            file = QtCore.QFile(filename)
            f = open(filename, 'w')
            filedata = self.text.toHtml()
            f.write(filedata)
            namaAwal = file.fileName()

            jumlah = len(namaAwal)
            penentu = True
            if len(namaAwal) > 3:
                if namaAwal[jumlah - 1] == 'n':
                    if namaAwal[jumlah - 2] == 'm':
                        if namaAwal[jumlah - 3] == '.':
                            penentu = False
            if penentu:
                file.rename(namaAwal, namaAwal + '.mn')
            f.close()

    def PageView(self):
        preview = QtGui.QPrintPreviewDialog()
        preview.paintRequested.connect(self.PaintPageView)
        preview.exec_()

    def Print(self):
        dialog = QtGui.QPrintDialog()
        if dialog.exec_() == QtGui.QDialog.Accepted:
            self.text.document().print_(dialog.printer())

    def PDF(self):
        printer = QtGui.QPrinter()
        printer.setOutputFormat(printer.NativeFormat)

        dialog = QtGui.QPrintDialog(printer)
        dialog.setOption(dialog.PrintToFile)
        if dialog.exec_() == QtGui.QDialog.Accepted:
            self.text.document().print_(dialog.printer())

    def PaintPageView(self, printer):
        self.text.print_(printer)

    def Undo(self):
        self.text.undo()

    def Redo(self):
        self.text.redo()

    def Cut(self):
        self.text.cut()

    def Copy(self):
        self.text.copy()

    def Paste(self):
        self.text.paste()

    def CursorPosition(self):
        line = self.text.textCursor().blockNumber()
        col = self.text.textCursor().columnNumber()
        linecol = ("Line: " + str(line) + " | " + "Column: " + str(col))
        self.status.showMessage(linecol)

    def FontFamily(self, font):
        font = QtGui.QFont(self.jenisFont.currentFont())
        self.text.setCurrentFont(font)
        self.text.setFocus()

    def FontSize(self, fsize):
        size = (int(fsize))
        self.text.setFontPointSize(size)
        self.text.setFocus()

    def ubahWarna(self):
        c = QtGui.QColorDialog.getColor()
        self.warnaFont.setStyleSheet(
            'QPushButton {color: %s; font-weight:bold; text-decoration: underline; }' % c.name())
        self.text.setTextColor(c)
        self.text.setFocus()

    def ubahWarnaBackground(self):
        c = QtGui.QColorDialog.getColor()
        self.warnaBackground.setStyleSheet(
            'QPushButton {color: %s; font-weight:bold; text-decoration: underline; }' % c.name())
        self.text.setTextBackgroundColor(c)
        self.text.setFocus()

    def Bold(self):
        w = self.text.fontWeight()
        if w == 50:
            self.text.setFontWeight(QtGui.QFont.Bold)
        elif w == 75:
            self.text.setFontWeight(QtGui.QFont.Normal)

    def Italic(self):
        i = self.text.fontItalic()

        if i == False:
            self.text.setFontItalic(True)
        elif i == True:
            self.text.setFontItalic(False)

    def Underl(self):
        ul = self.text.fontUnderline()

        if ul == False:
            self.text.setFontUnderline(True)
        elif ul == True:
            self.text.setFontUnderline(False)

    def lThrough(self):
        lt = QtGui.QFont.style()

    def alignLeft(self):
        self.text.setAlignment(Qt.AlignLeft)

    def alignRight(self):
        self.text.setAlignment(Qt.AlignRight)

    def alignCenter(self):
        self.text.setAlignment(Qt.AlignCenter)

    def alignJustify(self):
        self.text.setAlignment(Qt.AlignJustify)

    def BulletList(self):
        self.text.insertHtml("<ul><li> ...</li></ul>")
    def NumberedList(self):
        self.text.insertHtml("<ol><li> ...</li></ol>")
    def exit(self):
        self.close()

    def closeEvent(self, event):
        self.destroy()

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()

    main.setGeometry(0, 0, 1000, 600)
    main.setWindowTitle('Dokumen Editor -> mn-belajarpython.blogspot.co.id')

    screen = QtGui.QDesktopWidget().screenGeometry()
    size = main.geometry()
    main.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)

    main.text.setFocus()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()


Nah itu dia temen - temen code program nya.. nah lalu sepertii apa ya tampilan yang akan di hasilkan dari code program di atas? Nah, biar gak penasaran, langsung saja kita simak gambar yang ada di bawah ini...



Nah itu dia temen - temen hasil dari code program di atas.. Bisa kita lihat ya.. Pada toolbar di kiri window, sudah ada 3 toolbar baru.. Yaitu print, PDF, dan view. Seperti yang sudah saya katakan sebelumnya tadi ya... Dimana pada gambar diatas sudah saya berikan tanda panah untuk memudahkan kalian untuk melihat perubahannya..


Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Penjelasan Code program untuk membuat aplikasi dokumen editor versi 10.0.

nah pada bagian ini saya akan mencoba untuk menjelaskan code program yang telah saya bagikan diatas tadi yaa.. Hal ini saya lakukan agar kalian bisa memahami code program untuk membuat aplikasi dokumen editor ini... Yuk tanpa lama - lama lagi langsung saja kita simak sama - sama penjelasan saya di bawah ini...

[NOTE : Teks yang berwarna merah pada penjelasan merupakan "Code program" yang di tambahkan pada versi kali ini. Dan tidak ada di versi sebelumnya]

import sys  //digunakan untuk mengimpor modul ‘sys’
from PyQt4 import QtGui, QtCore  //digunakan untuk mengimport ‘QtGui’ dan ‘QtCore’
from PyQt4.QtCore import Qt  //digunakan untuk import ‘Qt’ dari QtCore.

class Main(QtGui.QMainWindow):  //digunakan untuk membuat class utama untuk membuat class utama dari aplikasi Dokumen editor. Dengan memberikan turunan dari class ‘QtGui.QMainQindow’.
    def __init__(self):  //merupakan konstrutor dari class ‘main’.
        QtGui.QMainWindow.__init__(self, None)  //digunakan untuk memanggil class ‘QtGui.QmainWindow’ nya.
        self.initUI()  //digunakan untuk menjalankan metode dengan nama ‘initUI’.
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('sgi'))  //digunakan untuk merubah style keseluruhan dari window aplikasi.

    def initUI(self):  //merupakan metode dengan nama ‘initUI’ yang digunakan untuk menjalankan beberapa metode.
        # ---------Window settings --------------------------------  //komentar
        self.buatLembarKerja()  //digunakan untuk menjalankan metode dengan nama ‘buatLembarKerja’.
        self.buatToolbar1() //digunakan untuk menjalankan metode dengan nama ‘buatToolbar1’.
        self.buatToolbar2() //digunakan untuk menjalankan metode dengan nama ‘buatToolbar2’.
        self.buatToolbar3()//digunakan untuk menjalankan metode dengan nama ‘buatToolbar3’.
        self.buatStatusBar() //digunakan untuk menjalankan metode dengan nama ‘buatStatusbar’.
        self.setScroll()  //digunakn untuk menjalankan metode dengan nama ‘setScroll’.
        # ------- Toolbar --------------------------------------  //komentar

    def buatToolbar1(self):  //digunakan untuk membuat metode dengan nama ‘buatToolbar1’. Yang akan digunakan untuk membuat toolbar pertama yang ada di kiri area kerja.

        self.perintahBaru = QtGui.QAction("New", self)  //digunakan untuk membuat perintah ‘New’ yang disimpan kedalam variabel ‘perintahBaru’.
        self.perintahBaru.setShortcut("Ctrl+N")  //digunakn untuk membuat shortcut untuk perintah ‘New’. Dengan shorcut ‘Ctrl+N’
        self.perintahBaru.setStatusTip("Buat Dokumen Baru.")  //digunakan untuk menampilkan status atau tooltip pada statusbar saat kursor ada di toolbar atau perintah ‘New’.
        self.perintahBaru.triggered.connect(self.New)  //digunakan untuk menjalankan metode dengan nama ‘New’ ketika perintah ‘New’ diklik atau di jalankan.

        self.perintahBuka = QtGui.QAction("Open", self)  //digunakan untuk membuat perintah ‘Open' yang disimpan kedalam variabel ‘perintahBuka’.
        self.perintahBuka.setStatusTip("Buka dokumen yang telah disimpan")  //digunakan untuk menampilkan status atau tooltip pada statusbar saat kursor ada di toolbar atau perintah ‘Open’.
        self.perintahBuka.setShortcut("Ctrl+O")  //digunakn untuk membuat shortcut untuk perintah ‘Open’. Dengan shorcut ‘Ctrl+O’
        self.perintahBuka.triggered.connect(self.Open)  //digunakan untuk menjalankan metode dengan nama ‘Open’ ketika perintah ‘Open’ diklik atau di jalankan.

        self.perintahSimpan = QtGui.QAction("Save", self) //digunakan untuk membuat perintah ‘Save’ yang disimpan kedalam variabel ‘perintahSimpan’.
        self.perintahSimpan.setStatusTip("Simpan dokumen yang telah dibuat")  //digunakan untuk menampilkan status atau tooltip pada statusbar saat kursor ada di toolbar atau perintah ‘Save’.
        self.perintahSimpan.setShortcut("Ctrl+S")  //digunakn untuk membuat shortcut untuk perintah ‘Save’. Dengan shorcut ‘Ctrl+S’
        self.perintahSimpan.triggered.connect(self.Save)  //digunakan untuk menjalankan metode dengan nama ‘Save’ ketika perintah ‘Save’ diklik atau di jalankan.

        self.perintahPreview = QtGui.QAction("view", self)  //digunakan untuk membuat perintah ‘view’ yang disimpan kedalam variabel ‘perintahPreview’.
        self.perintahPreview.setStatusTip("Lihat halaman sebelum di print")  //digunakan untuk menampilkan status atau tooltip pada statusbar saat kursor ada di toolbar atau perintah ‘view’.
        self.perintahPreview.setShortcut("Ctrl+Shift+P")  //digunakn untuk membuat shortcut untuk perintah ‘view’. Dengan shorcut ‘Ctrl+Shift+P’
        self.perintahPreview.triggered.connect(self.PageView)  //digunakan untuk menjalankan metode dengan nama ‘PageView’ ketika perintah ‘view’ diklik atau di jalankan.

        self.perintahCut = QtGui.QAction("Cut", self)  //digunakan untuk membuat sebuah perintah untuk tombol cut. Dan disimpan kedalam variabel ‘perintahCut’.
        self.perintahCut.setStatusTip("Copy ke klipboard dan hapus teks yang di block")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahCut.setShortcut("Ctrl+X")  //digunakan untuk membuat shortcut untuk perintah cut. Dengan shortcut ‘Ctrl+X’
        self.perintahCut.triggered.connect(self.Cut)  //digunakan untuk menghubungkan perintah cut untuk menjalankan metode ‘cut’.

        self.perintahCopy = QtGui.QAction("Copy", self)  //digunakan untuk membuat sebuah perintah untuk tombol copy. Dan disimpan kedalam variabel ‘perintahCopy’.
        self.perintahCopy.setStatusTip("Copy ke klipboard teks yang di block")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahCopy.setShortcut("Ctrl+C")  //digunakan untuk membuat shortcut untuk perintah copy. Dengan shortcut ‘Ctrl+C’
        self.perintahCopy.triggered.connect(self.Copy)  //digunakan untuk menghubungkan perintah copy untuk menjalankan metode ‘copy’.

        self.perintahPaste = QtGui.QAction("Paste", self)  //digunakan untuk membuat sebuah perintah untuk tombol paste. Dan disimpan kedalam variabel ‘perintahPaste’.
        self.perintahPaste.setStatusTip("Paste teks dari clipboard")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahPaste.setShortcut("Ctrl+V")  //digunakan untuk membuat shortcut untuk perintah paste. Dengan shortcut ‘Ctrl+V’
        self.perintahPaste.triggered.connect(self.Paste)  //digunakan untuk menghubungkan perintah paste untuk menjalankan metode ‘paste’.

        self.perintahUndo = QtGui.QAction("Undo", self)  //digunakan untuk membuat sebuah perintah untuk tombol Undo. Dan disimpan kedalam variabel ‘perintahUndo’.
        self.perintahUndo.setStatusTip("Batalkan perintah terakhir")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahUndo.setShortcut("Ctrl+Z")  //digunakan untuk membuat shortcut untuk perintah undo. Dengan shortcut ‘Ctrl+Z’
        self.perintahUndo.triggered.connect(self.Undo)  //digunakan untuk menghubungkan perintah undo untuk menjalankan metode ‘undo’.

        self.perintahRedo = QtGui.QAction("Redo", self)  //digunakan untuk membuat sebuah perintah untuk tombol cut. Dan disimpan kedalam variabel ‘perintahRedo’.
        self.perintahRedo.setStatusTip("Batalkan perintah Undo terakhir")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahRedo.setShortcut("Ctrl+Y")  //digunakan untuk membuat shortcut untuk perintah Redo. Dengan shortcut ‘Ctrl+Y’
        self.perintahRedo.triggered.connect(self.Redo)  //digunakan untuk menghubungkan perintah redo untuk menjalankan metode ‘Redo’.

        self.perintahPrint = QtGui.QAction("Print", self) //digunakan untuk membuat perintah ‘Print’ yang disimpan kedalam variabel ‘perintahPrint’.
        self.perintahPrint.setStatusTip("Cetak dokumen anda")
        self.perintahPrint.setShortcut("Ctrl+P")  //digunakn untuk membuat shortcut untuk perintah ‘print’. Dengan shorcut ‘Ctrl+P’
        self.perintahPrint.triggered.connect(self.Print)  //digunakan untuk menjalankan metode dengan nama ‘Print’ ketika perintah ‘print’ diklik atau di jalankan.

        self.perintahPdf = QtGui.QAction("PDF", self) //digunakan untuk membuat perintah ‘PDF’ yang disimpan kedalam variabel ‘perintahPdf’.
        self.perintahPdf.setStatusTip("Simpan sebagai PDF")  //digunakan untuk menampilkan status atau tooltip pada statusbar saat kursor ada di toolbar atau perintah ‘PDF’.
        self.perintahPdf.triggered.connect(self.PDF)  //digunakan untuk menjalankan metode dengan nama ‘PDF’ ketika perintah ‘PDF’ diklik atau di jalankan.

        self.perintahKeluar = QtGui.QAction("Exit", self)  //digunakan untuk membuat sebuah perintah untuk tombol keluar.
        self.perintahKeluar.setStatusTip("Ingin Keluar ?")  //membuat status tip ketika kursor ada di atas tombol nantinya
        self.perintahKeluar.triggered.connect(self.exit)  //digunakan untuk menghubungkan tombol ketika di klik untuk menjalankan metode ‘exit’.

        self.toolbar = self.addToolBar("Options")  //digunakan untuk membuat sebuah toolbar ‘option’. Yang di tampung ke dalam variabel toolbar.
        self.toolbar.addSeparator()  //digunakan untuk membuat gari pembatas.
        self.toolbar.addAction(self.perintahBaru)  //digunakan untuk memasukkan perintah ‘New’ yang tersimpan di dalam variabel ‘PerintahBaru’ kedalam jajaran toolbar.
        self.toolbar.addAction(self.perintahBuka)  //digunakan untuk memasukkan perintah ‘Open’ yang tersimpan di dalam variabel ‘perintahBuka’ kedalam jajaran toolbar.
        self.toolbar.addAction(self.perintahSimpan)  //digunakan untuk memasukkan perintah ‘Save’ yang tersimpan di dalam variabel ‘perintahSimpan’ kedalam jajaran toolbar.
        self.toolbar.addSeparator()  //digunakan untuk membuat sebuah garis batas.
        self.toolbar.addAction(self.perintahPrint)  //digunakan untuk memasukkan perintah print tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahPdf)  //digunakan untuk memasukkan perintah ‘PDF’ tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahPreview)  //digunakan untuk memasukkan perintah ‘view’ tadi kedalam toolbar di window.
        self.toolbar.addSeparator()  //digunakan untuk membuat sebuah garis batas.
        self.toolbar.addAction(self.perintahCut)  //digunakan untuk memasukkan perintah cut tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahCopy)  //digunakan untuk memasukkan perintah copy tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahPaste)  //digunakan untuk memasukkan perintah paste tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahUndo)  //digunakan untuk memasukkan perintah undo tadi kedalam toolbar di window.
        self.toolbar.addAction(self.perintahRedo)  //digunakan untuk memasukkan perintah Redo tadi kedalam toolbar di window.
        self.toolbar.addSeparator()  //digunakan untuk membuat sebuah garis batas.
        self.toolbar.addAction(self.perintahKeluar)  //digunakan untuk memasukkan perintah tadi kedalam toolbar.
        self.addToolBarBreak()  //digunakan untuk memberikan batas penambahan toolbar.
        self.toolbar.setMovable(False)  //digunakan agar toolbar tidak bisa di pindah.

        self.addToolBar(QtCore.Qt.LeftToolBarArea, self.toolbar)  //digunakan untuk memasukkan toolbar ke samping lembar kerja.

    def buatToolbar2(self):  //digunakan untuk membuat metode dengan nama ‘buatToolbar2’. Yang akan digunakan untuk membuat toolbar kedua yang ada di atas area kerja.
        self.jenisFont = QtGui.QFontComboBox(self)  //digunakan untuk membuat sebuah combobox font dan disimpan ke dalam variabel ‘jenisFont’.
        self.jenisFont.currentFontChanged.connect(self.FontFamily)  //digunakan untuk menjalankan metode dengan nama ‘FontFamily’ ketika nilai atau jenis font di combobox berubah.

        ukuranFont = QtGui.QComboBox(self)  //digunakan untuk membuat sebuah combobox. Dan ditampung kedalam metode dengan nama ‘ukuranFont’.
        ukuranFont.setEditable(True)  //digunakan untuk membuat combobox ‘ukruanFont’ agar tidak bisa di edit manual.
        ukuranFont.setMinimumContentsLength(3)  //digunakan untuk menentukan ukuran combobox dari ‘ukuranFont’.
        ukuranFont.activated.connect(self.FontSize)  //digunakan untuk  menjalankan perintah ‘FontSize’ ketika combo box ‘ukuran font aktif. Atau sudah ada nilai yang valid.
        flist = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 44, 48,
                 54, 60, 66, 72, 80, 88, 96]  //membuat list number yang kemudian ditampung kedalam variabel ‘flist’’.
        for i in flist:  //digunakan untuk melakukan perulangan sebanyak nilai yang ada di variabel list ‘flist’.
            ukuranFont.addItem(str(i))  //digunakan untuk memasukkan angka - angka yang ada pada variabel ‘flist’ kealam combobox ‘ukuranFont’.

        self.warnaFont = QtGui.QPushButton('Text')  //digunakan untuk membuat sebuah perintah dengan nama ‘text’ dan disimpan kedalam variabel ‘warnaFont’.
        self.warnaFont.setStyleSheet('QPushButton {color: black;font-weight:bold; text-decoration: underline; }')  //digunakan untuk mengubah warna teks dari perintah ‘text’. Dan saya tebalkan serta saya beri garis bawah dengan perintah html.
        self.warnaFont.setFlat(True)  //digunakan untuk menghilangkan garis tombol pada perintah ‘text’.
        self.warnaFont.setFixedSize(40, 20)  //digunakan untuk mengatur ukuran toolbar perintah ‘text’.
        self.warnaFont.clicked.connect(self.ubahWarna)  //digunakan untuk menjalankan metode dangan naa ‘ubahWarna’  ketika printah ‘text’ dieksekusi atau di klik.

        self.warnaBackground = QtGui.QPushButton("Background")  //digunakan untuk membuat sebuah perintah dengan nama ‘background’ dan disimpan kedalam variabel ‘warnaFont’.
        self.warnaBackground.setStyleSheet('QPushButton {color: white;font-weight:bold; text-decoration: underline; }')  //digunakan untuk mengubah warna teks dari perintah ‘Background’. Dan saya tebalkan serta saya beri garis bawah dengan perintah html.
        self.warnaBackground.setFixedSize(80, 20)  //digunakan untuk mengatur ukuran toolbar perintah ‘background’.
        self.warnaBackground.setFlat(True)  //digunakan untuk menghilangkan garis tombol pada perintah ‘background’ saat menjadi toolbar.
        self.warnaBackground.clicked.connect(self.ubahWarnaBackground)  //digunakan untuk untuk menjalankan metode dengan nama ‘ubahWarnaBackground’. Ketika perintah ini di alankan atau di klik.

        perintahTebal = QtGui.QAction("Bold", self, checkable=True)  //digunakan untuk mendefinisikan sebuah perintah yang ditampung kedalam variabel ‘perintahTebal’.
        perintahTebal.setStatusTip("Tebalkan Teks")  //menampilkan teks ‘tebalkan Teks’ saat kursor berada di atasnya.
        perintahTebal.setShortcut("Ctrl+B")  //memberikan shortcut untuk menjalankan perintah tersebut.
        perintahTebal.triggered.connect(self.Bold)  //digunakan untuk menghubungkan perintah ini untuk menjalankan metode dengan nama ‘Bold’.

        perintahMiring = QtGui.QAction("Italic", self, checkable=True)  //digunakan untuk mendefinisikan sebuah perintah yang ditampung kedalam variabel ‘perintahMiring’.
        perintahMiring.setStatusTip("Miringkan Teks")  //menampilkan teks ‘Miringkan Teks’ saat kursor berada di atasnya.
        perintahMiring.setShortcut("Ctrl+I")  //memberikan shortcut untuk menjalankan perintah tersebut.
        perintahMiring.triggered.connect(self.Italic)  //digunakan untuk menghubungkan perintah ini untuk menjalankan metode dengan nama ‘Italic’.

        perintahGarisBawah = QtGui.QAction("Underline", self, checkable=True)  //digunakan untuk mendefinisikan sebuah perintah yang ditampung kedalam variabel ‘perintahGarisBawah’.
        perintahGarisBawah.setStatusTip("Beri Garis bawah Teks")  //menampilkan teks ‘Beri Garis bawah Teks’ saat kursor berada di atasnya.
        perintahGarisBawah.setShortcut("Ctrl+U")  //memberikan shortcut untuk menjalankan perintah tersebut.
        perintahGarisBawah.triggered.connect(self.Underl)  //digunakan untuk menghubungkan perintah ini untuk menjalankan metode dengan nama ‘Underl’.

        space1 = QtGui.QLabel("  ", self)  //membuat sebuah sepasi kosong yang akan digunakan untuk memberikan jarak antar combo box ‘jenisFont’ dan ‘ukuranFont’. Dan ditampung kedalam variabel ‘space1’.
        space2 = QtGui.QLabel(" ", self)  //membuat sebuah sepasi kosong yang akan digunakan untuk memberikan jarak antar combo box ‘jenisFont’ dan ‘ukuranFont’. Dan ditampung kedalam variabel ‘space2’.

        self.formatbar = self.addToolBar("Format")  //membuat sebuah toolbar dengan nama ‘format’ dan disimpan ke dalam variabel ‘formatbar’.

        self.formatbar.addWidget(self.jenisFont)  //digunakn untuk memasukkan combobox ‘jenisFont’ ke dalam jajaran toolbar aplikasi.
        self.formatbar.addWidget(space1) //digunakan untuk memasukkan spasi kosong atau ‘space1’ kedalam toolbar agar ada jarak.
        self.formatbar.addWidget(ukuranFont)  //digunakn untuk memasukkan combobox ‘jenisFont’ ke dalam jajaran toolbar aplikasi.
        self.formatbar.addWidget(space2) //digunakan untuk memasukkan spasi kosong atau ‘space2’ kedalam toolbar agar ada jarak.

        self.formatbar.addSeparator()  //digunakan untuk menambahkan garis pembatas dengan toolbar lain.

        self.formatbar.addWidget(self.warnaFont)  //digunakan untuk memasukkan perintah ‘warnaFont’ atau ‘text’. Ke dalam jajaran toolbar.
        self.formatbar.addWidget(self.warnaBackground) //digunakan untuk memasukkan perintah ‘warnaBackground’ atau ‘background’. Ke dalam jajaran toolbar.

        self.formatbar.addSeparator()  //digunakan untuk memberikan garis batas pada jajaran toolbar.

        self.formatbar.addAction(perintahTebal)  //menambahkan perintah ‘perintahTebal’ ke dalam toolbar dengan variabel formatbar.
        self.formatbar.addAction(perintahMiring)  //menambahkan perintah ‘perintahMiring’ ke dalam toolbar dengan variabel formatbar.
        self.formatbar.addAction(perintahGarisBawah)  //menambahkan perintah ‘perintahGarisBawah’ ke dalam toolbar dengan variabel formatbar.
        self.formatbar.setMovable(False)  //membuat agar toolbar tidak bisa dipindah - pindah

    def buatToolbar3(self):  //digunakan untuk membuat metode dengan nama ‘buatToolbar3’ yang digunakan untuk membuat toolbar 3.


        self.left = QtGui.QAction("left", self)  //digunakan untuk membuat perintah dengan nama ‘left’ dan saya simpan di variabel ‘left’. Yang akan digunakan untuk perintah perataan kiri.
        self.left.triggered.connect(self.alignLeft)  //digunakan untuk menghubungkan perintah ‘left’ untuk menjalankan metode ‘alignLeft’ ketika perintah di jalankan/diklik nantinya.

        self.center = QtGui.QAction("center", self)  //digunakan untuk membuat perintah dengan nama ‘center’ dan saya simpan di variabel ‘center’. Yang akan digunakan untuk perintah perataan tengah.
        self.center.triggered.connect(self.alignCenter)  //digunakan untuk menghubungkan perintah ‘center’ untuk menjalankan metode ‘alignCenter’ ketika perintah di jalankan/diklik nantinya.

        self.right = QtGui.QAction("right", self)  //digunakan untuk membuat perintah dengan nama ‘right’ dan saya simpan di variabel ‘right’. Yang akan digunakan untuk perintah perataan kanan.
        self.right.triggered.connect(self.alignRight)  //digunakan untuk menghubungkan perintah ‘right’ untuk menjalankan metode ‘alignRight’ ketika perintah di jalankan/diklik nantinya.

        self.justify = QtGui.QAction("justify", self)  //digunakan untuk membuat perintah dengan nama ‘justifyt’ dan saya simpan di variabel ‘justify’. Yang akan digunakan untuk perintah perataan kanan dan kiri.
        self.justify.triggered.connect(self.alignJustify)  //digunakan untuk menghubungkan perintah ‘justify’ untuk menjalankan metode ‘alignJustify’ ketika perintah di jalankan/diklik nantinya.

        self.bullet = QtGui.QAction("Bullet", self)  //digunakan untuk membuat sebuah perintah dengan nama ‘bullet’. Dan disimpan ke dalam variabel ‘bullet’.
        self.bullet.triggered.connect(self.BulletList)  //digunakan untuk menghubunkan perintah bullet untuk menjalankan metode dengan nama ‘BulletList’.

        self.numbering = QtGui.QAction("Numbered", self)  //digunakan untuk membuat sebuah perintah dengan nama ‘Numbered’. Dan disimpan ke dalam variabel ‘Numbering’.
        self.numbering.triggered.connect(self.NumberedList)  //digunakan untuk menghubunkan perintah Numbering untuk menjalankan metode dengan nama ‘NumberedList’.

        self.paragrafBar = self.addToolBar("paragraf")  //digunakan untuk membuat toolbar baru dengna nama paragraf. Dan disimapan ke dalam variabel ‘paragrafBar’.
        self.paragrafBar.addAction(self.bullet)  //digunakan untuk memsukkan perintah ‘bullet’ ke dalam toolbar paragraf bar.
        self.paragrafBar.addAction(self.numbering)  //digunakan untuk memsukkan perintah ‘Numbering’ ke dalam toolbar paragraf bar.

        self.paragrafBar.addSeparator()  //digunakan untuk menambahkan garis pembatas pada barisan toolbar.
        self.paragrafBar.addAction(self.left)  //digunakan untuk memasukkan perintah ‘left’ kedalam toolbar ‘paragrafBar’.
        self.paragrafBar.addAction(self.center)  //digunakan untuk memasukkan perintah ‘center’ kedalam toolbar ‘paragrafBar’.
        self.paragrafBar.addAction(self.right)  //digunakan untuk memasukkan perintah ‘right’ kedalam toolbar ‘paragrafBar’.
        self.paragrafBar.addAction(self.justify)  //digunakan untuk memasukkan perintah ‘justify’ kedalam toolbar ‘paragrafBar’.

        self.paragrafBar.setMovable(False)  //digunakan untuk membuat toolbar ‘paragrafBar’ agar tidak bisa di pindah pindah.

    def buatLembarKerja(self):  //digunakan untuk membuat metode dengan nama ‘buatLembarKerja’ yang akan digunakan untuk membuat lembar kerjanya.
        # ------- Text Edit -----------------------------------
        widget = QtGui.QWidget(self)  //mendefinisikan sebuah widget
        self.mainLayout = QtGui.QHBoxLayout(widget)  //membuat sebuah layout utama dari aplikasi ini. Dengan memasukkan widget yang sudah kita definisikan tadi sebagai komponen utama yang ada ditengah.

        self.text = QtGui.QTextEdit(self)  //mendefinisikan atau membuat kolom teks nya. Yang kemudian disimpan ke dalam variabel ‘text’.
        self.text.setMaximumWidth(793.700787402)  //mengatur lebar maksimal dari kolom teks menjadi angka yang ada pada parameter.
        self.text.setMinimumWidth(793.700787402)  //mengatur lebar minimal dari kolom teks menjadi angka yang ada pada parameter.
        self.text.setMinimumHeight(1122.519685039)  //mengatur tinggi maksimal dari kolom teks menjadi angka yang ada pada parameter.
        self.mainLayout.addWidget(self.text)  //digunakan untuk memasukkan kolom teks ke widget utama aplikasi.
        self.text.setFocus()  //mengatur agar saat aplikasi dijalankan, maka kursor akan fokus ke kolom teks.
        self.setCentralWidget(widget) //membuat agar ‘widget’ menjadi widget atau komponen utama.

        # --------dokumen---------  //komentar
        self.dokumen = QtGui.QTextDocument(self)  //mendefinisikan ‘QTextDocument’ yang ditampung ke dalam variabel ‘self.dokumen’.
        self.text.setDocument(self.dokumen)  //mengatur kolom text yang ditampung ke dalam variabel ‘text’ menjadi sebuah text editor agar bisa kita bold, meiringkan dan kita berikan berbagai variasi
        self.text.undoAvailable.connect(self.undoTersedia)  //digunakan untuk menghubungkan ketersediaan undo ke metode dengan nama ‘undoTersedia’
        self.text.redoAvailable.connect(self.redoTersedia)  //digunakan untuk menghubungkan ketersediaan redo ke metode dengan nama ‘redoTersedia’

    def undoTersedia(self, b):  //digunakan untuk membuat metode dengan nama ‘undoTersedia’ yang digunakan untuk menerima boolean ketersediaan undo. False jika tidak tersedia dan true jika tersedia. True atau false tersebut di tampung ke dalam variabel ‘b’.
        self.perintahUndo.setEnabled(b)  //digunakan untuk menghidupkan atau mematikan tombol ‘undo’ sesuai ketersediaan nya.

    def redoTersedia(self, b):  //digunakan untuk membuat metode dengan nama ‘redoTersedia’ yang digunakan untuk menerima boolean ketersediaan redo. False jika tidak tersedia dan true jika tersedia. True atau false tersebut di tampung ke dalam variabel ‘b’.
        self.perintahRedo.setEnabled(b)  //digunakan untuk menghidupkan atau mematikan tombol ‘redo’ sesuai ketersediaan nya.

    def buatStatusBar(self):  //digunakan untuk membuat metode dengan nama ‘buatStatusBar’. Yang akan digunakan untuk membuat sebuah status bar si bawah window aplikasi.
        # ------- Statusbar ------------------------------------
        self.status = self.statusBar()  //digunakan untuk memanggil statusbar window aplikasi dan  disimpan keadalam variabel ‘status’.
        self.text.cursorPositionChanged.connect(self.CursorPosition)  //digunakan untuk memanggil metode dengan nama ‘CursorPosition’ saat posisi kursor di area kerja berubah.

    def setScroll(self):  //digunakan untuk membuat metode dengan nama ‘setScroll’ yang akan digunakan untuk mengatur scrollbar
        # mengatur scroll  //komentar
        self.scrollArea = QtGui.QScrollArea()  //digunakan untuk mendefinisikan sebuah scrollbar yang ditampung ke dalam variabel ‘scrollArea’.
        self.scrollArea.setWidget(self.text)  //mengatur fungsi scrollbar sebagai  scroll dari kolom text yang sudah kita buat pada metode sebelumnya.
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Mid)  //mengatur style dari background tempat widget yang di scroll
        self.scrollArea.setAlignment(Qt.AlignCenter)  //mengatur agar widget nya (kolom teks) berada di posisi tengah

        self.mainLayout.addWidget(self.scrollArea)  //memasukkan scroll nya ke dalam window

            # -------- Toolbar slots -----------------------------------  //komentar

    def New(self):  //digunakan untuk membuat metode dengan nama ‘New’. Yang akan digunakan untuk membuat dokumen baru.
        self.text.clear()  //digunakan untuk membersihkan lembar kerja. Sehingga seakan akan seperti membuat dokumen baru.

    def Open(self):  //digunakan untuk membuat metode dengan nama ‘open’ yang akan digunakan untuk membuka dokumen yang telah tesimpan.
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File')  //digunakan untuk membuka sebuah file dialog untuk mencari file. Yang akan disimpan lokasinya kedalam variabel ‘filename’.
        if filename:  //digunakanuntuk mengecek apakah variabel ‘filename’ kosong atau tidak. Yang artinya mengecek apakah user memilih file atau tidak.
            file = QtCore.QFileInfo(filename)  //mengelola file dan memasukkan nya ke dalam variabel ‘file’.
            nama = file.fileName()  //digunakan untuk mendapatkan nama file. Lalu disimpan kedalam variabel ‘nama’.

            jumlah = len(nama)  //digunakan untuk mendapatkan jumlah jumlah karekter dari nama file. Lalu disimpan kedalam variabel ‘jumlah’.
            penentu = False  //digunakan untuk mendefinisikan variabel boolean dengan kondisi awal ‘false’. Dengan nama ‘penentu’.
            if len(nama) > 3:  //digunakan untuk mengecek apakah nama flle lebih dari 3 karakter.
                if nama[jumlah - 1] != 'n':
                    if nama[jumlah - 2] != 'm':
                        if nama[jumlah - 3] != '.':  
                            penentu = True
//4 baris code diatas fungsinya untuk mengecek ekstensi dari file yang akan kita buka nantinya... Variabel ‘penentu’ akan bernilai true jika ekstensi nya tidak sesuai... Dan akan bernilai false jika ekstensi nya benar. Yaitu ‘.mn’.

            if penentu or jumlah <= 3:  //digunakan untuk mengecek apakah penentu bernilai true. Yang artinya mengecek apakah ekstensinya salah. Dan nama nya kurang atau sama dengan 3 karakter.
                QtGui.QMessageBox.critical(self, "Kesalahan",
                                           self.tr("Maaf!! aplkasi Mn-Editor ini hanya bisa membuka"
                                                   "\nfile dengan file ber-ekstensi (.mn)"
                                                   " mohon pilih file yang tepat."))  //4 baris code program di atas, digunakan untuk menampilkan pesan error jika file yang dipilih user tidak sesuai.
            else:  //kondisi else dari ketidak sesuai an nama file. Atau kondisi benar dari kesalahan pengecekan nama file.
                try:  //digunakan untuk mencoba beberapa baris code program
                    f = open(filename, 'r')  //digunakan untuk membuka file yang telah dipilih oleh user dan telah sesuai.
                    filedata = f.read() //digunakan untuk membaca file yang telah disimpan.
                    self.text.setHtml(filedata)  //digunakan untuk memasang file yang telah dibuka tadi kedalam lembar kerja.
                    f.close()  //digunakan untuk menutup file yang telah kita buka. Setelah sebelumnya kita masukkan ke dalam lembar kerja kita.
                except:  //kondisi yang akan dijalankan jika ‘try’ atau percobaan penjalanan code program di atas terdapat eror.
                    QtGui.QMessageBox.critical(self, "Kesalahan",
                                               self.tr("Maaf!! aplkasi Mn-Editor tidak bisa membuka file\n"
                                                       "yang telah anda pilih. yaitu '%s'\n"
                                                       "kemungkinan file telah rusak." % nama))  //4 baris code program di atas, digunakan untuk menampilkan pesan error jika code program ‘try’ terdapat sebuah error.

    def Save(self):  //digunakan untuk membuat metode dengan nama ‘Save’ yang akan di dunakan untuk menyimpan dokumen.
        filename = QtGui.QFileDialog.getSaveFileName(self, caption='Save File', filter='*;;*.mn')  //digunakan untuk memanggil sebuah fle dialog untuk memilih lokasi penyimpanan file serta langsung membuat sebuah file tersebut. Dan lokasi nya akan di simpan ke dalam variabel ‘filename’.
        if filename:  //digunakan untuk mengecek apakah variabel ‘filename’ tidak kosong. Yang artinya apakah user telah mimilih lokasi penyimpanan.
            file = QtCore.QFile(filename)  //digunakan untuk mendefinisikan sebuah file yang telah disimpan tadi.
            f = open(filename, 'w')  //digunakan untuk membuka file yang telah tersimpan tadi.
            filedata = self.text.toHtml()  //digunakan untuk mengambil semua data yang ada di lembar kerja.
            f.write(filedata)  //digunakan untuk memasukkan data dari lembar kerja ke dalam file yang telah di buat tadi.
            namaAwal = file.fileName()  //digunakan untuk mengambil nama file yang telah di buat tadi. Dan disimpan ke dalam variabel ‘namAwal’.

            jumlah = len(namaAwal)   //digunakan untuk menghitung jumlah karakter dari nama file. Dan disimpan ke dalam variabel ‘jumlah’.
            penentu = True  //digunakan untuk mendefinisikan variabel ‘penentu’ dengan nilai ‘True’.
            if len(namaAwal) > 3:  //mengecek apakah jumlah karakter dari nama file lebih dari 3 karakter.
                if namaAwal[jumlah - 1] == 'n':
                    if namaAwal[jumlah - 2] == 'm':
                        if namaAwal[jumlah - 3] == '.':
                            penentu = False
//4 baris code diatas fungsinya untuk mengecek ekstensi dari file yang akan kita buka nantinya... Variabel penentu akan bernilai true jika ekstensi nya tidak sesuai... Dan akan bernilai false jika ekstensi nya benar. Yaitu ‘.mn’.
            if penentu:  //mengecek apakah penentu bernilai ‘true’. Yang artinya mengecek apakah nama nya salah.
                file.rename(namaAwal, namaAwal + '.mn')  //digunakan untuk mengubah ekstensi file menjadi ‘.mn’ jika nama tidak sesuai.
            f.close()  //digunakan untuk menutup file


    def PageView(self):  //digunakan untuk membuat metode dengan nama’PageView’ yang digunakan untuk menampilkan window print preview.
        preview = QtGui.QPrintPreviewDialog()  //digunakan untuk menampilkan window print preview. Kemudian saa simpan ke dalam variabel ‘preview’.
        preview.paintRequested.connect(self.PaintPageView)  //digunakan untuk memenggil metode dengan nama ‘PaintPageView’. Yang digunakan untuk memasukkan lembar kerja nya ke dalam window preview.
        preview.exec_()  //digunakan untuk menampilkan window preveiew nya,

    def Print(self):  //digunakan untuk membuat metode dengan nama’Print’ yang digunakan untu mencetak dokumen nya.
        dialog = QtGui.QPrintDialog()  //digunakan untuk memanggil window settingan untuk print.
        if dialog.exec_() == QtGui.QDialog.Accepted:  //digunakan untuk mengecek apakah user menekan ok
            self.text.document().print_(dialog.printer())  //digunakan untuk mencetak dokumen yang telah kita buat.

    def PDF(self):  //digunakan untuk membuat metode dengan nama’PDF’ yang digunakan untuk mencetak dokumen menjadi PDF.
        printer = QtGui.QPrinter()  //mendefinisikan sebuah printer. Dan saya simpan ke dalam variabel ‘printer’.
        printer.setOutputFormat(printer.NativeFormat)  //digunakan untuk memformat hasil dari print nya.

        dialog = QtGui.QPrintDialog(printer)  //digunakan untuk mensetting printer.
        dialog.setOption(dialog.PrintToFile)  //digunakan untuk mencetak menjadi file
        if dialog.exec_() == QtGui.QDialog.Accepted:  //digunakan untuk mengecek apakah user memilih atau menekan ok.
            self.text.document().print_(dialog.printer())  //digunakan untuk mengeksekusi atau mencetak lembar kerja menjadi PDF.

    def PaintPageView(self, printer):  //digunakan untuk membuat metode dengan nama’PaintPageView’ yang digunakan untuk menampilkan window print preview.
        self.text.print_(printer)  //digunakan untuk menampilkan lembar kerja ke dalam window print preview.

    def Undo(self):  //digunakan untuk membuat metode dengan nama ‘undo’ yang akan digunakan untuk undo.
        self.text.undo()  //digunakan untuk melakukan undo.

    def Redo(self):  //digunakan untuk membuat metode dengan nama ‘redo’ yang akan digunakan untuk redo.
        self.text.redo()  //digunakan untuk melakukan redo.

    def Cut(self):  //digunakan untuk membuat metode dengan nama ‘Cut’ yang akan digunakan untuk cut.
        self.text.cut()  //digunakan untuk melakukan perintah cut.

    def Copy(self):  //digunakan untuk membuat metode dengan nama ‘Copy’ yang akan digunakan untuk Copy.
        self.text.copy()  //digunakan untuk melakukan perintah copy.

    def Paste(self):  //digunakan untuk membuat metode dengan nama ‘Paste’ yang akan digunakan untuk paste.
        self.text.paste()  //digunakan untuk melakukan perintah paste.

    def CursorPosition(self):  //digunakan untuk membuat metode dengan nama ‘CursorPosition’ yang akan digunakan untuk mengupdate posisi kolom dan baris pada statusbar.
        line = self.text.textCursor().blockNumber()  //memperoleh lokasi atau posisi baris kursor di lembar kerja. Dan ditampung ke dalam variabel ‘line’.
        col = self.text.textCursor().columnNumber()  //memperoleh lokasi atau posisi kolom kursor di lembar kerja. Dan ditampung ke dalam variabel ‘col.
        linecol = ("Line: " + str(line) + " | " + "Column: " + str(col))  //digunakan untuk membuat format tampilan kolom dan baris di status bar. Dan ditampung kedalam variabel ‘linecol’.
        self.status.showMessage(linecol)  //digunakan untuk menampilkan posisi kolom dan baris kursor pada lembar kerja dengan format yang telah dibuat.


    def FontFamily(self, font):  //digunakan untuk membuat metode dengan nama ‘fontFamily’ yang akan digunakan untuk mengubah jenis font.
        font = QtGui.QFont(self.jenisFont.currentFont())  //digunakan untuk mendapatkan font yang sudah kalian pilih. Dan disimpan ke dalam variabel ‘font’.
        self.text.setCurrentFont(font)  //digunakan untuk mengubah jenis font pada lembar kerja. Sesuai yang sudah dipilih sebelumnya.
        self.text.setFocus()  //digunakan untuk memfokuskan kursor kembali ke area kerja setelah kalian memilih jenis font.

    def FontSize(self, fsize):  //digunakan untuk membuat metode dengan nama ‘FontSize’ yang akan digunakan untuk mengubah ukuran font.
        size = (int(fsize)) //digunakan untuk mengambil nilai yang terpilih pada combobox ‘FontSize lalu di ubah tipe datanya menjadi integer. Menggunakan metode ‘int’’’(nilai).
        self.text.setFontPointSize(size) //digunakan untuk mengubah ukuran font pada lembar kerja sesai yang sudah kalian pilih.
        self.text.setFocus()  //digunakan untuk memfokuskan kursor kembali ke area kerja setelah kalian memilih ukuran font.

    def ubahWarna(self):  //digunakan untuk membuat metode dengan nama ‘ubahWarna’ yang akan digunakan untuk mengubah warna teks.
        c = QtGui.QColorDialog.getColor()  //digunakan untuk menampilkan window pemilih warna. Dan hasilnya akan disimpan ke dalam variabel ‘c’.
        self.warnaFont.setStyleSheet(
            'QPushButton {color: %s; font-weight:bold; text-decoration: underline; }' % c.name())  //digunakan untuk mengubah warna teks dari perintah ‘text’ ketika warna yang sudah di pilih.
        self.text.setTextColor(c)  //digunakan untuk mengubah warna teks di lembar kerja menjadi teks yang sudah terpilih.
        self.text.setFocus()  //digunakan agar yg terpilih adalah lembar kerja kembali saat kita mengklik toolbar  ‘text’  untuk mengubah warna. Silahkan hapus dan lihat perbedaannya kalau kurang paham.

    def ubahWarnaBackground(self):  //digunakan untuk membuat metode dengan nama ‘ubahWarnaBackground’ yang akan digunakan untuk mengubah warna background teks di lembar kerja.
        c = QtGui.QColorDialog.getColor()  //digunakan untuk menampilkan window pemilih warna. Dan hasilnya akan disimpan ke dalam variabel ‘c’.
        self.warnaBackground.setStyleSheet(
            'QPushButton {color: %s; font-weight:bold; text-decoration: underline; }' % c.name())  //digunakan untuk mengubah warna teks dari perintah ‘background’ ketika warna yang sudah di pilih.
        self.text.setTextBackgroundColor(c)  //digunakan untuk mengubah warna background teks di lembar kerja menjadi teks yang sudah terpilih.
        self.text.setFocus()  //digunakan agar yg terpilih adalah lembar kerja kembali saat kita mengklik toolbar  ‘text’  untuk mengubah warna background. Silahkan hapus dan lihat perbedaannya kalau kurang paham.

    def Bold(self):  //membuat sebuah metode dengan nama ‘bold’ dan berfungsi sebagai perintah untuk menebalkan teks atau menormalkan teks.
        w = self.text.fontWeight()  //digunakan untuk mengecek nilai dari font weight lalu ditampung ke dalam variabel ‘w’
        if w == 50:  //digunakan untuk mengecek nilai di dalam variabel ‘w’ apakah bernilai 50. Yang artinya mengecek apakah font tidak bernilai ‘bold’.
            self.text.setFontWeight(QtGui.QFont.Bold)  //digunakan untuk membuat teks menjadi tebal.
        elif w == 75:  //digunakan untuk mengecek apakah nilai dari variabel ‘w’ apakah bernilai 75. Yang artinya apakah font sedang tebal atau bold.
            self.text.setFontWeight(QtGui.QFont.Normal)  //digunakan untuk menormalkan teks yang tebal.

    def Italic(self):  //membuat sebuah metode dengan nama ‘Italic’ dan berfungsi sebagai perintah untuk memiringkan teks atau menormalkan teks.
        i = self.text.fontItalic()  //digunakan untuk mengecek teks berada di dalam kondisi ‘italic’ atau mirik. Yang akan bernilai false jika normal dan true jika italic. Dan ditampung ke dalam variabel ‘i’.

        if i == False:  //digunakan untuk mengecek apakah variabel 
‘i’ bernilai false. Yang aritnya apakah teks tidak sedang italic.
            self.text.setFontItalic(True)  //digunaka untuk membuat font menjadi italic atau miring
        elif i == True:  //digunakan untuk mengecek apakah variabel 
‘i’ bernilai true. Yang aritnya apakah teks sedang italic.
            self.text.setFontItalic(False)  //digunaka untuk membuat font menjadi tidak italic atau tidak miring. Dan bisa kita katakn untuk menormalkan teks.

    def Underl(self):  //membuat sebuah metode dengan nama ‘Underl’ dan berfungsi sebagai perintah untuk menggaris bawahi teks atau menormalkan teks.
        ul = self.text.fontUnderline()  //digunakan untuk mengecek teks berada di dalam kondisi ‘underline’ atau bergaris bawah. Yang akan bernilai false jika normal dan true jika begaris bawah. Dan ditampung ke dalam variabel ‘ul’.
        if ul == False:  //digunakan untuk mengecek apakah variabel 
‘ul’ bernilai false. Yang aritnya apakah teks tidak sedang bergaris bawah.
            self.text.setFontUnderline(True)  //digunakan untuk membuat teks bergaris bawah
        elif ul == True:  //digunakan untuk mengecek apakah variabel 
‘ul’ bernilai true. Yang aritnya apakah teks tidak sedang bergaris bawah.
            self.text.setFontUnderline(False)  //menormalkan teks. Atau membuat teks tidak bergaris bawah.

    def alignLeft(self):  //digunakan untuk membuat metode dengan nama ‘alignLeft’ untuk perintah perataan kiri.
        self.text.setAlignment(Qt.AlignLeft)  //digunakan untuk meratakan teks di kiri pada lembar kerja.

    def alignRight(self):  //digunakan untuk membuat metode dengan nama ‘alignRight’ untuk perintah perataan kanan.
        self.text.setAlignment(Qt.AlignRight)  //digunakan untuk meratakan teks di kanan pada lembar kerja.

    def alignCenter(self):  //digunakan untuk membuat metode dengan nama ‘alignCenter’ untuk perintah perataan tengah.
        self.text.setAlignment(Qt.AlignCenter)  //digunakan untuk meratakan teks di tengah pada lembar kerja.

    def alignJustify(self):  //digunakan untuk membuat metode dengan nama ‘alignJustify’ untuk perintah perataan kanan dan kiri.
        self.text.setAlignment(Qt.AlignJustify)  //digunakan untuk meratakan teks di kiri dan kanan pada lembar kerja.

    def BulletList(self):  //digunakan untuk membuat metode dengan nama ‘BulletList’ yang digunakan untuk membuat bullet.
        self.text.insertHtml("<ul><li> ...</li></ul>")  //digunakan untuk membuat bullet pada lembar kerja.

    def NumberedList(self):  //digunakan untuk membuat metode dengan nama ‘NumberingList’ yang digunakan untuk membuat Numbering.
        self.text.insertHtml("<ol><li> ...</li></ol>")  //digunakan untuk membuat Numbering pada lembar kerja.

    def exit(self):  //digunakan untuk membuat metode dengan nama ‘exit’. Yang akan digunakan untuk menjalankan perintah untuk menutup window.
        self.close()  //digunakan untuk menutup window.

    def closeEvent(self, event):  //membuat metode dengan nama ‘closEvent’ yang akan di jalankan ketika aplikasi kita close atau kita tutup.
        self.destroy()  //digunakan untuk menutup aplikasi.

def main():  //membuat metode dengan nama ‘main’ yang yang berisi untuk pembuatan window dan pemanggilan class utama.
    app = QtGui.QApplication(sys.argv)  //digunakna untuk mendefinisikan sebuah window aplikasi.
    main = Main()  //memanggil class dengan nama ‘Main’ yang sudah di buat di atas.
    main.show()  //menampilkan window di class ‘Main’ tersebut

    main.setGeometry(0, 0, 1000, 600)  //digunakan untuk menentukan posisi window saat muncul. Yang saya berikan pada posisi 0 0 layar monitor kalian. Dan dan lebar window sebesar 1000 dan tingginya 600.
    main.setWindowTitle('Dokumen Editor -> mn-belajarpython.blogspot.co.id')  //digunakan untuk mengubah judul dari window..

    screen = QtGui.QDesktopWidget().screenGeometry()   //digunakan untuk mendapatkan resolusi layar kalian.
    size = main.geometry()  //digunakan untuk mendapatkan ukuran layar aplikasi dokumen editor ini.
    main.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)  //memindahkan window aplikasi dokumen editor yang sebelumnya ada di posisi  0 0 ke bagian tengah layar kalian.

    main.text.setFocus()  //mengatur agar yang terpilih adalah kolom teks atau lembar kerja. Bukan elemen lain. 
    sys.exit(app.exec_())  //digunakan agar window tidak langsung close saat kita jalankan.

if __name__ == "__main__":  //memastikan agar code di bawah ini akan di jalankan pertama kali ketika file di eksekusi.

    main()  //digunakan untuk menjalankan metode dengan nama ‘main’ yang sudah di buat di atas.


nah itu dia temen - temen penjelasan dari code program diatas.. Semoga penjelasan yang sudah saya berikan tadi dapat sedikit membantu penjelasan code program untuk membuat aplikasi dokumen editor versi ke sepuluh kali ini ya...

Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...




Dan itu dia temen - temen cara untuk membuat aplikasi dokumen editor yang sangat sederhana ini.. Semoga apa yang telah saya sampaikan di atas dapat memberikan manfaat bagi kalian yaa... Dan tentu saja saya harap dapat menjadikan referensi untuk membuat sebuah produk atau untuk belajar python..

Oke sampai disini dulu ya temen - temen bahasan pada postingan saya kali ini,, jangan lupa baca tutorial menarik lainnya ya.. Dan jangan lupa berkomentar atau berikan masukan atau kritikan kalian ya... Terimakasih.. Sampai jumpa di tutorial yang lainnya ya...

Wassalamualaikum wr.wb.
Previous
Next Post »
Thanks for your comment