Aplikasi Menggambar PySide versi 13

BelajarPython - Assalamualaikum wr. wb.

Jumpa lagi temen - temen... Pada kesempatan kali ini, saya akan mencoba untuk memberikan tambahan fungsi untuk aplikasi menggambar versi sebelumnya... Yaitu Aplikasi menggambar yang terbuat dari PySide.. Semoga kalian suka dengan tambahan fitur yang akan saya tambahkan kali ini ya... Lalu fitur apa yang akan ditambahkan kali ini? Oke, Langsung saja yuk kita simak sama - sama postingan kali ini...

Pengenalan aplikasi yang akan kita buat.

Pada postingan kali ini saya akan mencoba untuk menambahkan atau meng update fitur dari aplikasi menggambar versi sebelumnya.. Yaitu versi 12. Jika kalian ingin membaca atau belum membaca postingan tersebut, KALIAN BISA KLIK DISINI ya....

Walaupun saya telah membuat aplikasi seperti ini sebelumnya, ada perbedaan disini... Dimana sebelumnya saya membuat aplikasi ini menggunakan library tkinter.. Jika kalian ingin membacanya, KLIK DISINI YA.. Dan kali ini saya membuat aplikasi menggambar tersebut menggunakan PySide yang memiliki fungsi dan tampilan yang lebih baik dari tkinter...

Pada versi 13 ini, saya akan menambahkan sebuah fitur untuk mencetak atau print gambar atau objek yang ada di kanvas dan satu fitur lagi yaitu untuk clear atau menghapus seluruh canvas..

Oya, perlu kalian ketahui, aplikasi ini saya posting dengan berbagai versi. Dan tentu saja, tiap versinya ada penambahan fitur menarik.. Jika kalian ingin membaca daftar isi dan rincian lengkap nya, KALIAN BISA KLIK DISINI ya temen - temen...

Rincian Lengkap Aplikasi Menggambar menggunakan PySide Versi 13.0

Pada segment kali ini, saya akan memberikan rincian lengkap dari aplikasi menggambar yang saya posting kali ini... seperti yang sudah saya katakan di atas tadi, Aplikasi kali ini menggunakan library PySide. Dimana untuk menjalankan code program aplikasi kali ini, tentu saja kalian harus menginstallnya terlebih dahulu... Kalian bisa KLIK DISINI untuk install pyside nya....

Oke, langsung saja yuk kita simak sama - sama rincian lengkap nya di bawah ini...

Nama: mn-Drawing 13.0
Versi: 13.0 | klik disini untuk membaca versi selanjutnya.
Platform: Python 3.x
Modul: PySide. Klik disini untuk menginstallnya.
Baris Code: kurang lebih 451 baris code program.
Terdiri dari: 2 class dan 43 metode.
Fitur: menceta/print dan penghapusan seluruh objek di canvas.
Kelemahan: tidak ada konfirmasi penghapusan seluruh objek kanvas. Kemungkin salah klik akan sangat mungkin terjadi.
syarat menjalankan: install python 3.x dan PySide, punya editor teks atau IDE.
Cara menjalankan: install python 3 dan PySide, 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 aplikasi Menggambar menggunakan PySide versi 13.0

Nah pada segment kali ini, merupakan segment yang paling penting.. Karena, pada segment kali ini, saya akan memberiikan code program untu membuat aplikasi menggambar versi kali ini.. Biar tidak penasaran, langsung saja yuk kita simak sama - sama code program nya di bawah ini...


from PySide import QtCore, QtGui

class AreaKanvas(QtGui.QWidget):
    def __init__(self, parent=None):
        super(AreaKanvas, self).__init__(parent)

        self.warnaBeckground = QtCore.Qt.yellow
        self.ukuran = 6
        self.parent = parent

        self.lokasiGambar = None

        self.setAttribute(QtCore.Qt.WA_StaticContents)
        self.modified = False
        self.scribbling = False
        self.myPenWidth = 1
        self.myPenColor = QtCore.Qt.blue
        self.image = QtGui.QImage()
        self.lastPoint = QtCore.QPoint()

    def openImage(self, fileName):
        loadedImage = QtGui.QImage()
        if not loadedImage.load(fileName):
            return False

        newSize = loadedImage.size().expandedTo(self.size())
        self.resizeImage(loadedImage, newSize)
        self.image = loadedImage
        self.modified = False
        self.update()
        return True

    def saveImage(self, fileName, fileFormat):
        visibleImage = self.image
        self.resizeImage(visibleImage, self.size())

        if visibleImage.save(fileName, fileFormat):
            self.modified = False
            return True
        else:
            return False

    def setPenColor(self, newColor):
        self.myPenColor = newColor

    def setPenWidth(self, newWidth):
        self.myPenWidth = newWidth

    def setGambar(self, file):
        self.lokasiGambar = file

    def clearImage(self):
        self.image.fill(QtGui.qRgb(255, 255, 255))
        self.modified = True
        self.update()

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.lastPoint = event.pos()
            self.pensil = self.lastPoint
            self.scribbling = True

            self.awalX = event.pos().x()
            self.awalY = event.pos().y()

    def mouseMoveEvent(self, event):
        if (event.buttons() & QtCore.Qt.LeftButton) and self.scribbling:
            pilihan = self.parent.getPilihan()
            if pilihan == 'Pensil' or pilihan == 'Penghapus':
                self.drawLineTo(event.pos())
                self.pensil = event.pos()
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton and self.scribbling:
            self.drawLineTo(event.pos())
            self.scribbling = False
            self.update()

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawImage(QtCore.QPoint(0, 0), self.image)

    def resizeEvent(self, event):
        if self.width() > self.image.width() or self.height() > self.image.height():
            newWidth = max(self.width() + 128, self.image.width())
            newHeight = max(self.height() + 128, self.image.height())
            self.resizeImage(self.image, QtCore.QSize(newWidth, newHeight))
            self.update()

        super(AreaKanvas, self).resizeEvent(event)

    def drawLineTo(self, endPoint):
        painter = QtGui.QPainter(self.image)
        painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
        # painter.drawLine(self.lastPoint, endPoint)
        painter.setBrush(self.warnaBeckground)

        rectangle = QtCore.QRectF(self.awalX, self.awalY, endPoint.x()-self.awalX, endPoint.y()-self.awalY)

        poligon = QtGui.QPolygonF(rectangle)
        startAngle = 30 * 16
        spanAngle = 120 * 16

        pilihan = self.parent.getPilihan()

        if pilihan == 'Kotak' :
            painter.drawRect(rectangle)
        elif pilihan == 'Bulat' :
            painter.drawEllipse(rectangle)
        elif pilihan == 'Arc' :
            painter.drawArc(rectangle, startAngle, spanAngle)
        elif pilihan == 'Chord' :
            painter.drawChord(rectangle, startAngle, spanAngle)
        elif pilihan == 'Convex' :
            painter.drawConvexPolygon(poligon)
        elif pilihan == 'Pie' :
            painter.drawPie(rectangle, startAngle, spanAngle)
        elif pilihan == 'Poligon' :
            painter.drawPolygon(poligon)
        elif pilihan == 'Polyline' :
            painter.drawPolyline(poligon)
        elif pilihan == 'Round' :
            painter.drawRoundRect(rectangle)
        elif pilihan == 'Rounded' :
            painter.drawRoundedRect(rectangle, 25, 25)
        elif pilihan == 'Pensil' :
            painter.drawLine(self.pensil, endPoint)
        elif pilihan == 'Pen' :
            painter.drawLine(self.lastPoint, endPoint)
        elif pilihan == 'Penghapus' :
            r = QtCore.QRectF(self.pensil.x(), self.pensil.y(), 4, 4)
            painter.eraseRect(r)
        elif pilihan == 'Teks' :
            painter.setFont(QtGui.QFont(self.parent.getTipeUkuran() ,self.parent.getUkuran()))
            painter.drawText(rectangle, QtCore.Qt.AlignCenter, self.parent.getTeks())
        elif pilihan == "Gambar" :
            if self.awalX > endPoint.x():
                if self.awalY > endPoint.y():
                    rectangle = QtCore.QRectF(endPoint.x(), endPoint.y(),  self.awalX - endPoint.x(),  self.awalY - endPoint.y())
                else:
                    rectangle = QtCore.QRectF(endPoint.x(),  self.awalY, self.awalX - endPoint.x(),
                                              endPoint.y() - self.awalY + 1)
            else:
                if self.awalY > endPoint.y():
                    rectangle = QtCore.QRectF(self.awalX, endPoint.y(), endPoint.x() - self.awalX + 1,
                                              self.awalY - endPoint.y())
                else:
                    rectangle = QtCore.QRectF(self.awalX, self.awalY, endPoint.x() - self.awalX + 1,
                                              endPoint.y() - self.awalY + 2)

            painter.drawImage(rectangle, QtGui.QImage(self.lokasiGambar))

        self.modified = True

    def resizeImage(self, image, newSize):
        if image.size() == newSize:
            return
        newImage = QtGui.QImage(newSize, QtGui.QImage.Format_RGB32)
        newImage.fill(QtGui.qRgb(255, 255, 255))
        painter = QtGui.QPainter(newImage)
        painter.drawImage(QtCore.QPoint(0, 0), image)
        self.image = newImage

    def print_(self):
        printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)

        printDialog = QtGui.QPrintDialog(printer, self)
        if printDialog.exec_() == QtGui.QDialog.Accepted:
            painter = QtGui.QPainter(printer)
            rect = painter.viewport()
            size = self.image.size()
            size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)
            painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
            painter.setWindow(self.image.rect())
            painter.drawImage(0, 0, self.image)

    def isModified(self):
        return self.modified

    def penColor(self):
        return self.myPenColor

    def penWidth(self):
        return self.myPenWidth

    def setWarnaBackground(self, warna):
        self.warnaBeckground = warna

    def setWarnaKanvas(self, warna):
        self.image.fill(QtGui.QColor(warna))
        self.modified = True
        self.update()

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.ukuran = 6
        self.tipeTeks = 'Arimo'

        widgetInti = QtGui.QWidget()

        self.kanvas = AreaKanvas(self)
        self.mainLayout = QtGui.QVBoxLayout(widgetInti)
        self.kanvas.setMinimumHeight(500)
        self.kanvas.setMinimumWidth(500)
        self.kanvas.setMaximumWidth(500)
        self.kanvas.setMinimumHeight(500)
        self.mainLayout.setContentsMargins(0,0,0,0)
        self.setCentralWidget(widgetInti)


        self.createActions()
        self.createMenus()
        self.setScroll()

        self.buatToolBar()
        self.buatSettingBar()

        self.setWindowTitle("Painting -> Mn-belajarpython.blogspot.co.id")
        self.resize(700, 650)

    def closeEvent(self, event):
        if self.maybeSave():
            event.accept()
        else:
            event.ignore()

    def open(self):
        if self.maybeSave():
            fileName,_ = QtGui.QFileDialog.getOpenFileName(self, "Open File",
                    QtCore.QDir.currentPath())
            if fileName:
                self.kanvas.openImage(fileName)

    def penColor(self):
        newColor = QtGui.QColorDialog.getColor(self.kanvas.penColor())
        if newColor.isValid():
            self.kanvas.setPenColor(newColor)

    def ubahWarnaBackground(self):
        newColor = QtGui.QColorDialog.getColor(self.kanvas.penColor())
        if newColor.isValid():
            self.kanvas.setWarnaBackground(newColor)
            self.gambarAct.setEnabled(True)

    def ubahWarnaKanvas(self):
        newColor = QtGui.QColorDialog.getColor()
        if newColor.isValid():
            tombol1 = QtGui.QMessageBox.StandardButton.Yes
            tombol2 = QtGui.QMessageBox.StandardButton.No
            pertanyaan = "apakah anda yakin ingin mengubah warna kanvas ?\n" \
                         "hal ini akan menghapus semua gambar yang telah anda buat sebelumnya."
            response = QtGui.QMessageBox.question(None, "Konfimasi", pertanyaan, tombol1, tombol2)
            if response == QtGui.QMessageBox.Yes:
                self.kanvas.setWarnaKanvas(newColor)

    def penWidth(self):
        newWidth, ok = QtGui.QInputDialog.getInteger(self, "Scribble", "Select pen width:", self.kanvas.penWidth(), 1, 50, 1)
        if ok:
            self.kanvas.setPenWidth(newWidth)

    def gambar(self):
        fileName, _ = QtGui.QFileDialog.getOpenFileName(self, "Buka file",
                                                        QtCore.QDir.currentPath())
        if fileName:
            self.kanvas.setGambar(fileName)
            self.radio13.setEnabled(True)
            self.radio13.setChecked(True)

    def createActions(self):
        self.openAct = QtGui.QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open)
        self.perintahSave = QtGui.QAction("&Save...", self, triggered=self.diSave)
        self.printAct = QtGui.QAction("&Print...", self, triggered=self.kanvas.print_)
        self.clearScreenAct = QtGui.QAction("&Clear Screen", self, shortcut="Ctrl+L", triggered=self.kanvas.clearImage)

    def createMenus(self):
        self.toolBar = QtGui.QToolBar()

        self.toolBar.addAction(self.openAct)
        self.toolBar.addAction(self.printAct)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.perintahSave)
        self.toolBar.addAction(self.clearScreenAct)
        self.toolBar.addSeparator()

        self.toolBar.setMovable(False)

        self.addToolBar(self.toolBar)

    def diSave(self):
        self.saveFile('png')

    def maybeSave(self):
        if self.kanvas.isModified():
            ret = QtGui.QMessageBox.warning(self, "Scribble",
                        "The image has been modified.\n"
                        "Do you want to save your changes?",
                        QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
                        QtGui.QMessageBox.Cancel)
            if ret == QtGui.QMessageBox.Save:
                return self.saveFile('png')
            elif ret == QtGui.QMessageBox.Cancel:
                return False

        return True

    def saveFile(self, fileFormat):
        initialPath = QtCore.QDir.currentPath() + '/untitled.' + fileFormat

        fileName,_ = QtGui.QFileDialog.getSaveFileName(self, "Save As",
                initialPath,
                "%s Files (*.%s);;All Files (*)" % (str(fileFormat).upper(), fileFormat))
        if fileName:
            return self.kanvas.saveImage(fileName, fileFormat)

        return False

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

        self.mainLayout.addWidget(self.scrollArea)

    def buatToolBar(self):
        self.layoutRadio1 = QtGui.QHBoxLayout()
        self.groupRadio = QtGui.QButtonGroup()

        self.radio = QtGui.QRadioButton('Bulat')
        self.radio1 = QtGui.QRadioButton('Kotak')
        self.radio2 = QtGui.QRadioButton('Arc')
        self.radio3 = QtGui.QRadioButton('Chord')
        self.radio4 = QtGui.QRadioButton('Convex')
        self.radio5 = QtGui.QRadioButton('Pie')
        self.radio6 = QtGui.QRadioButton('Poligon')
        self.radio7 = QtGui.QRadioButton('Polyline')
        self.radio8 = QtGui.QRadioButton('Round')
        self.radio9 = QtGui.QRadioButton('Rounded')
        self.radio10 = QtGui.QRadioButton('Pensil')
        self.radio11 = QtGui.QRadioButton('Pen')
        self.radio12 = QtGui.QRadioButton('Penghapus')
        self.radio13 = QtGui.QRadioButton('Gambar')
        self.radio14 = QtGui.QRadioButton('Teks')

        self.groupRadio.addButton(self.radio)
        self.groupRadio.addButton(self.radio1)
        self.groupRadio.addButton(self.radio2)
        self.groupRadio.addButton(self.radio3)
        self.groupRadio.addButton(self.radio4)
        self.groupRadio.addButton(self.radio5)
        self.groupRadio.addButton(self.radio6)
        self.groupRadio.addButton(self.radio7)
        self.groupRadio.addButton(self.radio8)
        self.groupRadio.addButton(self.radio9)
        self.groupRadio.addButton(self.radio10)
        self.groupRadio.addButton(self.radio11)
        self.groupRadio.addButton(self.radio12)
        self.groupRadio.addButton(self.radio13)
        self.groupRadio.addButton(self.radio14)

        self.radio.setChecked(True)

        self.layoutRadio1.addWidget(self.radio)
        self.layoutRadio1.addWidget(self.radio1)
        self.layoutRadio1.addWidget(self.radio2)
        self.layoutRadio1.addWidget(self.radio3)
        self.layoutRadio1.addWidget(self.radio4)
        self.layoutRadio1.addWidget(self.radio5)
        self.layoutRadio1.addWidget(self.radio6)
        self.layoutRadio1.addWidget(self.radio7)
        self.layoutRadio1.addWidget(self.radio8)
        self.layoutRadio1.addWidget(self.radio9)
        self.layoutRadio1.addWidget(self.radio10)
        self.layoutRadio1.addWidget(self.radio11)
        self.layoutRadio1.addWidget(self.radio12)
        self.layoutRadio1.addWidget(self.radio13)
        self.layoutRadio1.addWidget(self.radio14)


        self.radio13.setEnabled(False)

        self.mainLayout.addLayout(self.layoutRadio1)

    def buatSettingBar(self):
        layoutSetting = QtGui.QToolBar(self)

        self.jenisFont = QtGui.QFontComboBox(self)
        self.jenisFont.currentFontChanged.connect(self.FontFamily)

        self.ukuranFont = QtGui.QComboBox(self)
        self.ukuranFont.setEditable(True)
        self.ukuranFont.setMinimumContentsLength(3)
        self.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:
            self.ukuranFont.addItem(str(i))

        self.teks = QtGui.QLineEdit()
        self.teks.setText("masukan teks disini")

        self.gambarAct = QtGui.QAction("Gambar", self, triggered=self.gambar)
        self.penColorAct = QtGui.QAction("&Pen Color...", self, triggered=self.penColor)
        self.penWidthAct = QtGui.QAction("Pen &Width...", self, triggered=self.penWidth)
        self.perintahUbahBackground = QtGui.QAction("Warna Background", self, triggered=self.ubahWarnaBackground)
        self.warnaKanvas = QtGui.QAction("Warna Kanvas", self, triggered=self.ubahWarnaKanvas)

        layoutSetting.addWidget(self.jenisFont)
        layoutSetting.addWidget(self.ukuranFont)
        layoutSetting.addWidget(self.teks)
        layoutSetting.addAction(self.gambarAct)
        layoutSetting.addAction(self.penColorAct)
        layoutSetting.addAction(self.penWidthAct)
        layoutSetting.addAction(self.perintahUbahBackground)
        layoutSetting.addAction(self.warnaKanvas)

        layoutSetting.setMovable(False)

        self.addToolBar(QtCore.Qt.BottomToolBarArea, layoutSetting)

    def getPilihan(self):
        return self.groupRadio.checkedButton().text()

    def FontFamily(self, font):
        self.tipeTeks = self.jenisFont.currentFont().toString()
        self.kanvas.setFocus()

    def FontSize(self, fsize):
        self.ukuran = self.ukuranFont.currentText()

    def getTipeUkuran(self):
        return self.tipeTeks

    def getUkuran(self):
        return int(self.ukuran)

    def getTeks(self):
        return self.teks.text()

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


Nah itu dia code program nya.. saya harap kalian dapat memahami dengan mudah ya... Lalu, seperti apakah tampilan yang akan di hasilkan dari code program di atas? Langsung saja yuk kita simak sama - sama tampilannya di bawah ini...



Nah itu dia temen - temen tampilan yang akan di hasilkan dari code program di atas.. Dimana pada gambar di atas sudah ada 2 toolbar baru.. Yaitu ‘Print’ dan ‘Clear Screen’. Dimana saat kita meng-klik ‘print’ maka akan tampil window pengaturan print pada masing-masing OS.

Penjelasan code program untuk membuat Aplikasi menggambar menggunakan PySide versi 13.0

Nah setelah saya membagikan code programnya, maka selanjutnya saya akan mencoba untuk menjelaskan code program yang sudah saya bagikan di atas tadi.. Hal ini saya lakukan agar dengan harapan dapat mempermudah pemahaman kalian untuk memahami code program tersebut... Oke, Langsung saja yuk kita simak sama penjelasannya 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]

from PySide import QtCore, QtGui  //digunakan untuk mengimport ‘QtCore’ dan ‘QtGui’  dari library PySide.

class AreaKanvas(QtGui.QWidget):  //digunakan untuknmembuat class dengan nama ‘AreaKanvas’ yang akan digunakan untuk membuat tempat menggambar Atau kanvasnya. Dengan menurunkan class ‘QtGui.QWidget’
    def __init__(self, parent=None):  //merupakan sebuah konstruktor dari class ‘AreaKanvas’.
        super(AreaKanvas, self).__init__(parent)  //digunakan untuk memanggil super class dari class ‘AreaKanvas’. Super class merupakan class parent atau induk yang menurunkan class ‘AreaKanvas’ ini.

        self.warnaBeckground = QtCore.Qt.yellow  //digunakan untuk mendefinisikan sebuah variabel baru dengan nama ‘warnaBeckground’  dengan isi warna ‘kuning’ yang akan digunakan untuk membuat warna isi dari kotak, lingkaran dan yang lainnya.
        self.ukuran = 6  //ukuran default teks
        self.parent = parent  //digunakan untuk menampung nilai parameter ‘parent’ kedalam variabel parent.

        self.lokasiGambar = None  //digunakan untuk mendefinisikan sebuah variabel dengan nama ‘lokasiGambar’ dengan isi ‘None’ dan nantinya akan dijadikan sebagai tempat penampungan lokasi gambar yang terpilih.

        self.setAttribute(QtCore.Qt.WA_StaticContents)  //digunakan untuk membuat canvas menjadi static. Yang artinya, walaupun window di perbesar ataupun diperkecil, ukuran kanvas akan tetap dan tak akan berubah.
        self.modified = False  //digunakan untuk membuat metode dengan nama ‘modified’ yang akan digunakan pengecekan apakah kanvas mendapat perlakuan.
        self.scribbling = False  //digunakan untuk mendefinisikan variabel baru denan nama ‘scribbling’ yang akan digunakan untuk proses corat coret dengan kursor
        self.myPenWidth = 1  //digunakan untuk mendefinisikan tebal pena yang akan digunakan untuk mencoret kanvas. Dengan nilai 1 dan disimpan kedalam variabel ‘myPenWidth’
        self.myPenColor = QtCore.Qt.blue  //mendefinisikan sebuah variabel baru dengan nama ‘myPenColor’ dengan nilai warna biru. Dan akan digunakan untuk mewarnai pena atau cursor saat mencoret
        self.image = QtGui.QImage()  //digunakan untuk membuat variabel baru dengan nama ‘image’ yang menampung class ‘QtGui.Qimage()’
        self.lastPoint = QtCore.QPoint()  //membuat variabel baru dengan nama ‘lastPoint’ yang menampung class ‘Qpoint’ dan nantinya akan digunakan untuk mendapatkan titik koordinat kursor.

    def openImage(self, fileName):  //digunakan untuk membuat metode dengan nama ‘openImage’ dengan satu buah parameter yang akan di tampung ke dalam variabel ‘fileName’. Dan metode ini akan digunakan untuk membuka gambar atau foto.
        loadedImage = QtGui.QImage()  //digunakan untuk mendefinisikan sebuah variabel dengan nama ‘loadedImage’. Yang di isi dengan ‘QtGui.QImage’.
        if not loadedImage.load(fileName):  ..digunakan untuk memaukkan foto yang ada di variabel parameter ‘fileName’. Sekaligus mengecek apakah gagal.
            return False  //mengembalikan nilai ‘False’ jika gagal membuka foto.

        newSize = loadedImage.size().expandedTo(self.size())  //digunakan untuk menyesuaikan ukuran foto yang akan dibuka dengan ukuran kanvas.
        self.resizeImage(loadedImage, newSize)  //digunakan untuk mengubah ukuran foto.
        self.image = loadedImage  //digunakan untuk memasukkan foto ke dalam kanvas.
        self.modified = False  //mengubah nilai variabel ‘modified’ menjadi “False” yang bisa dikatakan jika kita belum mengedit foto tersebut.
        self.update() //digunakan untuk mengupdate kanvas agar foto terlihat.
        return True  //digunakan untuk mengembalikan nilai ‘True’ karena proses membuka foto telah berhasil.

    def saveImage(self, fileName, fileFormat):  //digunakan untuk membuat metode  dengan nama ‘saveImage’ yang akaan digunakan untuk menyimpan hasil menggambar. Dengan dua parameter yaitu nama file yang akan di simpan ke dalam variabel ‘fileName’ dan format file yang akan di simpan ke dalam variabel ‘fileFormat’.
        visibleImage = self.image  //digunakan untuk mengambil hasil menggambar di kanvas dan disimpan ke dalam variabel ‘visibleImage’.
        self.resizeImage(visibleImage, self.size())  //digunakan untuk mengubah ukuran kanvas agar pas. Jika kurang paham, silahkan hapus code ini lalu jalankan lagi dan bandingkan.

        if visibleImage.save(fileName, fileFormat):  //digunakan untuk menyimpan kanvas tempat kita menggambar. Akan mengembalikan ‘True’ jika berhasil dan ‘False’ jika gagal.
            self.modified = False  //digunakan untuk mengubah variabel ‘modified’ menjadi false. Agar saat di close tidak muncul konfirmasi penyimpanan.
            return True  //mengembalikan nilai ‘true’ karena berhasil.
        else:  //kondisi ketika penyimpanan gagal
            return False  //mengembalikan nilai ‘False’ karena penyimpanan gagal

    def setPenColor(self, newColor):  //digunakan untuk membuat metode dengan nama ‘setPenColor’ yang akan digunakan untuk mengubah warna garis. Dengan cara memasukkan warnanya ke dalam parameter yang nantinya disimpan ke dalam variabel ‘newColor’.
        self.myPenColor = newColor  //digunakan untuk mengubah nilai variabel ‘myPenColor’ dengan nilai yang ada di variabel parameter ‘newColor’. Yang artinya mengubah warna garis.

    def setPenWidth(self, newWidth):  //digunakan untuk membuat metode dengan nama ‘setPenWidth’ yang akan digunakan untuk mengubah ukuran garis. Dengan variabel parameter ‘newWidth’ yang akan menampung nilai baru
        self.myPenWidth = newWidth  //digunakan untuk mengubah nilai variabel ‘myPenWidth’ yang diubah menjadi nilai variabel parameter ‘newWIdth’ yang artinya mengubah ukuran garis.

    def setGambar(self, file):  //digunakan untuk membuat metode dengan nama ‘setGambar’ yang akan digunakan untuk memasukkan gambar atau mengubah gambar yang akan di gambar.
        self.lokasiGambar = file  //digunakan untuk mengubah nilai variabel ‘lokasiGambar’ menjadi lokasi yang dimasukkan ke dalam metode ‘setGambar’ melalui variabel parameter ‘file’. Yang artinya mengubah gambar yang akan di gambar.

    def clearImage(self):  //digunakan untuk membuat metode dengan nama ‘clearImage’ yang akan dignakan untuk meng clear kanvas.
        self.image.fill(QtGui.qRgb(255, 255, 255))  //digunakan untuk membuat kanvas agar menutup semua objek di canvas dengan warna putih agar kanvas bersih.
        self.modified = True  //mengubah metode dengan nama ‘modified’ menjadi ‘True’. Menandakan kanvas telah di edit.
        self.update()  //digunakan untuk meng update kanvas agar perubahannya bisa langsung dilihat oleh user.

    def mousePressEvent(self, event):  //metode dengan nama ‘mousePressEvent’ yang merupakan sebuah metode yang akan dijalankan otomatis ketika kita meng klik mouse.

        if event.button() == QtCore.Qt.LeftButton:  //digunakan untuk mengecek apakah kita atau user mengklik kiri pada mouse
            self.lastPoint = event.pos()  //digunakan untuk mengubah nilai variabel ‘lastPoint’ menjadi posisi mouse saat diklik.
            self.pensil = self.lastPoint  //digunakan untuk menampung kembali nilai ‘lastPoint’ ke dalam variabel ‘pensil’
            self.scribbling = True  //digunakan untuk mengubah nilai variabel ‘scribbling’ menjadi ‘True’ sebagai penanda kalau mouse telah di klik.

            self.awalX = event.pos().x()  //digunakan untuk membuat atau mengubah nilai variabel ‘awalX’ yang saya isi dengan lokasi titik x mouse saat di klik
            self.awalY = event.pos().y()  //digunakan untuk membuat atau mengubah nilai variabel ‘awalY’ yang saya isi dengan lokasi titik Y mouse saat di klik

    def mouseMoveEvent(self, event):  //digunakan untuk membuat metode dengan nama ‘mouseMoveEvent’ yang akan dijalankan secara otomatis ketika mouse di pindahkan
        if (event.buttons() & QtCore.Qt.LeftButton) and self.scribbling:  //digunakan untuk memengecek apakah mouse sedang di klik kiri dan juga variabel ‘scribbling’ bernilai true
            pilihan = self.parent.getPilihan()  //digunakan untuk mendapatkan pilihan yang dipilih user pada radio button. Dengan cara menjalankan metode dengan nama ‘getPilihan’ yang ada di class ‘MainWindow’ yang sudah saya masukkan sebagai parameter dan ada di variabel ‘parent’
            if pilihan == 'Pensil' or pilihan == 'Penghapus':
                self.drawLineTo(event.pos())  //digunakan untuk memanggil metode dengan nama ‘drawLineTo’ dengan memasukkan posisi mouse terkini sebagai parameter
                self.pensil = event.pos()  //digunakan untuk menampung posisi mouse terkini kedalam variabel ‘pensil.
            self.update()  //digunakan untuk meng update kanvas agar kita bisa langsung melihat gambar atau garis yang di hasilkan.

    def mouseReleaseEvent(self, event):  //digunakan untuk membuat metode dengan nama ‘mouseRealeaseEvent’ yang akan dijalankan secara otomatis ketika mouse dilepas dari klik nya
        if event.button() == QtCore.Qt.LeftButton and self.scribbling:  //digunakan untuk mengecek apakah yang ditekan atau diklik ada tombol kiri pada mouse dan variabel ‘scribbling’ bernilai ‘True’
            self.drawLineTo(event.pos())  //digunakan untuk memanggil metode dengan nama ‘drawLineTo’ dengan parameter posisi kurso saat klik dilepas
            self.scribbling = False  //digunakan untuk mengubah nilai variabel ‘scribbling’ menjadi ‘False’ sebagai pertanda drag telah selesai
            self.rectTerakhir = None  //digunakan untuk mengubah nilai variabel ‘rectTerakhir’ menjadi ‘None’ karena proses menggambar telah selesai.
            self.update()  //digunakan untuk mengupdate window atau kanvas agar hasil menggambar langsung bisa ditampilkan

    def paintEvent(self, event):  //digunakan untuk membuat metode denga nama ‘paintEvent’ yang akan dijalankan secara otomatis ketika kita melakukan proses menggambar.
        painter = QtGui.QPainter(self)  //digunakan untuk memanggil class ‘Qpainter’ dan di tampung ke dalam variabel ‘painter’.
        painter.drawImage(QtCore.QPoint(0, 0), self.image)  //digunakan untuk menggambar apa yang kita gambar pada ‘image’ agar bis di tampilkan pada window

    def resizeEvent(self, event):  //digunakan untuk membuat metode dengan nama ‘resizeEvent’ yang akan dijalankan secara otomatis ketika window aplikasi di ubah ukuran nya
        if self.width() > self.image.width() or self.height() > self.image.height():  //digunakan untuk mengecek apakah lebar window lebih besar dari lebar image yang menjadi lapisan kanvas. Atau tinggi window lebih besar atau lebih tinggi dari tinggi image yang menjadi lapisan kanvas
            newWidth = max(self.width() + 128, self.image.width())  //digunakan untuk membuat variabel baru dengan nama ‘newWidth’ dan menggunakan fungsi ‘max’ yang berfungsi unguk memilih nilai mana yang terbesar. antara lebar window di tambah 128 dengan lebar image.
            newHeight = max(self.height() + 128, self.image.height())  //digunakan untuk membuat variabel baru dengan nama ‘newHeight’ dan menggunakan fungsi ‘max’ yang berfungsi unguk memilih nilai mana yang terbesar. antara tinggi window di tambah 128 dengan tinggi image.
            self.resizeImage(self.image, QtCore.QSize(newWidth, newHeight))  //digunakan untuk memanggil metode dengan nama ‘resizeImage’ dengan memasukkan beberapa parameter ‘image’ dan ‘Qsize’ yang beri nilai yang ada di variabel ‘newWidth’ dan ‘newHeight’ sebagai parameter ‘Qsize’ nya
            self.update()  //digunakan untuk mengupdate aplikasi agar langsung bisa di tampilkan perubahannya.

        super(AreaKanvas, self).resizeEvent(event)  //digunakan ntuk memanggil metode yang ada di class parent dari class ‘AreaKanvas’.

    def drawLineTo(self, endPoint):  //digunakan untuk membuat metode dengan nama ‘drawLineTo’ yagn akan digunakan untuk menggambar garisnya
        painter = QtGui.QPainter(self.image)  //digunakan untuk memanggil class ‘Qpainter’ dengan memasukkan ‘image’  sebagai parameter. Dan disimpan ke dalam variabel ‘painter’
        painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))  //digunakan untuk mengatur pena yang akan di gunakan. Yang menggunaka class “QPen” sebagai parameter. Dan clas “QPen” sendiri memiliki beberapa 5 parameter. Yaitu ‘myPenColor’ yang sebenarnya merpakan sebuah variabel dengan isi warna. Inisialisasinya ada di code paling atas. ‘myPenColor’ yang sebenarnya merupakan sebuah variabel dengan isi angka yang menentukan ketebalan pena nya. Inisialisasinya ada di code paling atas. ‘QsolidLine’ agar menampilkan garis solid. 
        painter.setBrush(self.warnaBeckground)  //digunakan untuk menentukan warna isian dari kotak, bulat dan objek padat lain. Warnanya adalah yang adalah nilai yang ada di dalam variabel ‘warnaBeckground’.

        rectangle = QtCore.QRectF(self.awalX, self.awalY, endPoint.x()-self.awalX, endPoint.y()-self.awalY)  //digunakan untuk membuat sebuah rectangle yang di definisikan dengan posisi pojok pertama merupakan posisi saat  cursor di klik dan pojok diagonal kedua merupakan posisi saat mouse di lepas dari drag. Posisi awal di dapatkan pada variabel ‘awalX’ dan ‘awalY’. Dan posisi diagonal pojok ke dua di dapatkan dari variabel ‘endpoint.x()’ yang di kurangi dengan variabel ‘awalX’ dan ‘endpoint.y()’ yang dikurangi dengan ‘awalY’.

        poligon = QtGui.QPolygonF(rectangle)  //digunakan untuk mengkonversi kotak atau rectangle yang ada di variabel ‘rectangle’ menjadi sebuah polygon dan disimpan ke dalam variabel ‘poligon’.
        startAngle = 30 * 16  //digunakan untuk membuat sebuah sudut. Dan disimpan ke dalam variabel ‘startAngle’
        spanAngle = 120 * 16  //digunakan untuk membuat sebuah sudut. Dan disimpan ke dalam variabel ‘spanAngle’

 pilihan = self.parent.getPilihan()  //digunakan untuk mendapatkan pilihann dari radio button yang ada di bawah window. Yang merupakan penentu jenis penggambaran. Lalu disimpan ke dalam variabel ‘pilihan’.

        if pilihan == 'Kotak' :  //digunakan untuk mengecek apakah pilihannya ‘kotak’.
            painter.drawRect(rectangle)  //digunakan untuk menggambar sebuah kotak atau rectangle yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’.
        elif pilihan == 'Bulat' :  //digunakan untuk mengecek apakah pilihannya ‘Bulat’.
            painter.drawEllipse(rectangle)  //digunakan untuk menggambar sebuah ellipse atau bulat yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’.
        elif pilihan == 'Arc' :  //digunakan untuk mengecek apakah pilihannya ‘Arc’.
            painter.drawArc(rectangle, startAngle, spanAngle)  //digunakan untuk menggambar sebuah Arc atau garis melengkung seperti pelangi yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’. Dan sudut - sudutnya ada pada variabel ‘startAngle’ dan ‘spanAngle’.
        elif pilihan == 'Chord' :  //digunakan untuk mengecek apakah pilihannya ‘Chord’.
            painter.drawChord(rectangle, startAngle, spanAngle)//digunakan untuk menggambar objek stengah lingkaran yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’. Dan sudut - sudutnya ada pada variabel ‘startAngle’ dan ‘spanAngle’.
        elif pilihan == 'Convex' :  //digunakan untuk mengecek apakah pilihannya ‘Convex’.
            painter.drawConvexPolygon(poligon)  //digunakan untuk menggambar sebuah poligon. Namun hanya memeliki 4 sudut saja. Sehingga seperti kotak saja. hehe yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’.
        elif pilihan == 'Pie' :  //digunakan untuk mengecek apakah pilihannya ‘Pie’.
            painter.drawPie(rectangle, startAngle, spanAngle)  //digunakan untuk menggambar objek mirip kipas yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’. Dan sudut - sudutnya ada pada variabel ‘startAngle’ dan ‘spanAngle’.
        elif pilihan == 'Poligon' :  //digunakan untuk mengecek apakah pilihannya ‘Poligon’.
            painter.drawPolygon(poligon)   //digunakan untuk menggambar sebuah poligon. Namun hanya memeliki 4 sudut saja. Sehingga seperti kotak saja. hehe 
        elif pilihan == 'Polyline' :  //digunakan untuk mengecek apakah pilihannya ‘Polyline’.
            painter.drawPolyline(poligon)  //digunakan untuk menggambar garis kotak saja. Karena garis, maka tanpa isian di dalamnya... Dengan menggunakan lokasi yang ada pada variabel ‘poligon’
        elif pilihan == 'Round' :  //digunakan untuk mengecek apakah pilihannya ‘Round’.
            painter.drawRoundRect(rectangle)  //digunakan untuk menggambar sebuah kotak dengan sisi melengkung. yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’.
        elif pilihan == 'Rounded' :  //digunakan untuk mengecek apakah pilihannya ‘Rounded’.
            painter.drawRoundedRect(rectangle, 25, 25)  //digunakan untuk menggambar sebuah kotak dengan sisi melengkung. yang lokasi nya sudah di tentukan dan disimpan di dalam variabel ‘rectangle’. Dan sisi nya sebesar 25 derajat.
        elif pilihan == 'Pensil' :  //digunakan untuk mengecek apakah pilihannya ‘pensil’.
        painter.drawLine(self.pensil, endPoint)  //digunakan untuk membuat garis dengan posisi kursor sebelum pindah dan lokasi terakhir kursor. Yang ada pada variabel ‘self.pensil’ dan ‘endPoint’.
        elif pilihan == 'Pen' :  //digunakan untuk mengecek apakah pilihannya ‘Pen’.
            painter.drawLine(self.lastPoint, endPoint)  //digunakan untuk membuat garis dengan posisi kursor saat pertama mouse di klik dan lokasi terakhir kursor saat dilepas. Yang ada pada variabel ‘lastPoint’ dan ‘endPoint’.
        elif pilihan == 'Penghapus' :  //digunakan untuk mengecek apakah pilihannya ‘Penghapus’.
            r = QtCore.QRectF(self.pensil.x(), self.pensil.y(), 4, 4)  //digunakan untuk membuat sebuah rectangle dengan lokasi kursor terkini. Yang ada di variabel ‘pensil’. Dan untuk mendapatkan koordinatnya di gunakan ‘pensil.x()’ dan ‘pensil.y()’. Dan panjang dan lebarnya sebanyak 4 pixel. Dan disimpan ke dalam variabel ‘r’.
            painter.eraseRect(r)  //menghapus kanvas di area rectangle yang sudah kita buat tadi. Yang sudah disimpan kedalam variabel ‘r’ sebelumnya.
        elif pilihan == 'Teks' :  //digunakan untuk mengecek apakah pilihannya ‘Teks’.
            painter.setFont(QtGui.QFont(self.parent.getTipeUkuran() ,self.parent.getUkuran()))  //digunakan untuk mengubah jenis dan ukuran font pada kanvas. Dengan 2 parameter. Yaitu nilai yang di dapatkan dari metode dengan nama ‘getTipeUkuran’ yang digunakan untuk mendapatkan jenis ‘font’ yang terpilih. dan ‘getUkuran’ yang digunakan untuk mendapatkan ukuran teksnya. Kedua metode tersebut terdapat di dalam class ‘MainWindow’ yang menjadi parameter di class ini dan disimpan ke dalam variabel ‘parent’.
            painter.drawText(rectangle, QtCore.Qt.AlignCenter, self.parent.getTeks())  //digunakan untuk memasukkan teks kedalam kanvas. Dengan 3 parameter disana. Yaitu ‘rectangle’ merupakan area teks nya. ‘QtCore.Qt.AlignCenter’ digunakan agar berada di tengah area yang di drag and drop. Atau area yang di seret oleh kursor. ‘getTeks’ merupakan metode yang digunakan untuk mendapatkan teks yang kalian masukkan. Metode tersebut ada di class ‘MainWindow’ dan dijalankan melalui variabel yang menyimpan class tersebut yaitu ‘parent’.
        elif pilihan == "Gambar" :  //digunakan untuk mengecek apakah pilihannya ‘Teks’.
            if self.awalX > endPoint.x():
                if self.awalY > endPoint.y():
                    rectangle = QtCore.QRectF(endPoint.x(), endPoint.y(),  self.awalX - endPoint.x(),  self.awalY - endPoint.y())
                else:
                    rectangle = QtCore.QRectF(endPoint.x(),  self.awalY, self.awalX - endPoint.x(),
                                              endPoint.y() - self.awalY + 1)
            else:
                if self.awalY > endPoint.y():
                    rectangle = QtCore.QRectF(self.awalX, endPoint.y(), endPoint.x() - self.awalX + 1,
                                              self.awalY - endPoint.y())
                else:
                    rectangle = QtCore.QRectF(self.awalX, self.awalY, endPoint.x() - self.awalX + 1,
                                              endPoint.y() - self.awalY + 2)
  //code di atas digunakan saat kita menambahkan gambar agar gambar yang kita tambahkan sesuai yang kita inginkan saat kita drag dan drop mouse dari kanan ke kiri atau dari bawah ke atas. Jika bingung, hapus code di atas lalu jalankan dan coba masukkan gambar dengan cara drag dan drop mouse dari kanan ke kiri.
            painter.drawImage(rectangle, QtGui.QImage(self.lokasiGambar))  //digunakan untuk menggambar sebuah gambar dengan lokasi yang sudah di tampung dalam variabel ‘rectangle’. Dan lokasi gambar yang ada di variabel ‘lokasiGambar’ dimasukkan ke dalam ‘QImage’ lalu dimasukkan sebagai parameter.

        self.modified = True  //digunakan untuk mengubah nilai variabel ‘modified’ menjadi ‘True’ yang menandakan kanvas telah di edit.

    def resizeImage(self, image, newSize):  //digunakan untuk membuat metode dengan nama ‘resizeImage’ yang akan di jalankan untuk mengubah ukuran image yang menjadi lapisan kanvas
        if image.size() == newSize:  //digunakan untuk mengecek apakah ukuran ‘image’ adalah sama dengan ukuran baru nya yang ada di variabel ‘newSize’
            return  //digunakan untuk mengembalikan. Dan tidak melanjutkan code program di bawah nya.

        newImage = QtGui.QImage(newSize, QtGui.QImage.Format_RGB32)  //digunakan untuk membuat variabel dengan nama ‘newImage’ yang di isi dengan class ‘QImage’ baru dengan ukuran baru dan format ‘RGB’
        newImage.fill(QtGui.qRgb(255, 255, 255))  //digunakan untuk memberikan warna kanvas menjadi putih.
        painter = QtGui.QPainter(newImage)  //memasukkan image baru yang ada di variabel ‘newImage’ sebagai lapisannya. Dan disimpan ke dalam variabel ‘painter’.
        painter.drawImage(QtCore.QPoint(0, 0), image)  //digunakan untuk  memasukkan image baru dengan ukuran yang baru pula tentunya
        self.image = newImage  //digunakan untuk mengganti nilai yang ada di variabel ‘image’ menjadi image yang baru di variabel ‘newImage’

    def print_(self):  //digunakan untuk membuat metode dengan nama ‘print_’ yang akan digunakan untuk mencetak Kanvas.
        printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)  //digunakan untuk mendefinisikan sebuah printer. Dan disimpan ke dalam variabel ‘printer’.

        printDialog = QtGui.QPrintDialog(printer, self)  //digunkan untuk mendefinisikan window pengatur printer default pada masing - masing OS. Dan nilai kembaliannya disimpan kedalam variabel ‘printDialog’.
        if printDialog.exec_() == QtGui.QDialog.Accepted:  //digunakan untuk menampilkan window pengatur print yang ada di variabel ‘printDiaolog’ dan sekaligus langsung mengecek apakah di klik “OK”.
            painter = QtGui.QPainter(printer)  //digunakan untuk mendefinisikan printer. Dan memasukkan nilai yang ada di variabel ‘printer’ sebagai parameter. Dan disimpan kedalam variabel ‘printer’.
            rect = painter.viewport()  //dignakan untuk mendefinisikan port. Dan disimpan ke dalam variabel ‘rect’.
            size = self.image.size() //digunakan untuk memperoleh ukuran kanvas. Dan disimpan ke dalam size.
            size.scale(rect.size(), QtCore.Qt.KeepAspectRatio)  //digunakan untuk mengubah ukuran gambar agar sesuai dengan ukuran kertas printer.
            painter.setViewport(rect.x(), rect.y(), size.width(), size.height())  //digunakan untuk mengatur ukuran gambar
            painter.setWindow(self.image.rect())  //digunakan untuk  membuat gambar menjadi gambaru utama
            painter.drawImage(0, 0, self.image)  //digunakan untuk mencetak kanvas.

    def isModified(self):  //digunakan untuk membuat metode dengan nama ‘isModified’ yang digunakan untuk mendapatkan nilai variabel ‘modified’.
        return self.modified  //digunakan untuk mengembalikan nilai variabel ‘modified’.

    def penColor(self):  //digunakan untuk membuat metode dengan nama ‘penColor’ yang akan digunakan untuk mendapatkan warna garis.
        return self.myPenColor  //idgunakan untuk mengembalikan nilai yang ada di variabel ‘myPenColor’ ketika metode ‘penColor’ di panggil.

    def penWidth(self):  //digunakan untukmembuat metode dengan nama ‘penWidth’ yang digunakan untuk mendapatkan nilai ukuran pena
        return self.myPenWidth  //digunakan untuk memberikan atau mengembalikan nilai yang ada di variabel ‘myPenWidth’ yang merupakan penampung ukuran pena

    def setWarnaBackground(self, warna):  //digunakan untuk membuat metode dengan nama ‘setWarnaBackground’ yand digunakan untuk mengubah warna background atau isi objek. Dengan parameter nama warnanya yang di tampung ke variabel ‘warna’.
        self.warnaBeckground = warna  //mengubah isi variabel ‘warnaBeckground’ menjadi nilai yang ada di variabel parameter ‘warna’. Yang artinya bisa di katakan mengubah warna isi/backround.

    def setWarnaKanvas(self, warna):  //digunakan untuk membuat metode dengan nama ‘setWarnaKanvas’ yang digunakan untuk mengubah warna kanvas. Dengan parameter variabel ‘warna’ yang akan digunakan untuk mengoper warna nya.
        self.image.fill(QtGui.QColor(warna))  //mengubah warna kanvas menjadi warna yang ada di dalam variabel parameter ‘warna’.
        self.modified = True  //mengubah nilai variabel ‘modified’ menjadi ‘true’. Yang artinya menginformasikan jika file ada yang diubah.
        self.update()  //digunakanuntuk memperbarui kanvasnya.

class MainWindow(QtGui.QMainWindow):  //digunakan untuk membuat class dengan nama ‘MainWindow’ dengan meng inheritens atau menurunkan class ‘QmainWindow’ yang ada pada QtGui. Dan class ini menjadi window utama yang menjadi tempat kanvas dan tombol - tombol nantinya
    def __init__(self):  //merupakan sebuah construktor dari class ‘MainWindow’
        super(MainWindow, self).__init__()  //digunakan untuk memanggill construktor class parent dari class ‘MainWindow’.

        self.ukuran = 6  //digunakan untuk menginisialisasi ukuran font pertama. Yaitu 6. Dan disimpan ke dalam variabel ‘ukuran’.
        self.tipeTeks = 'Arimo'  //digunakan untuk menginisialisasi jenis font pertama. Yaitu ‘Arimo’. Dan disimpan ke dalam variabel ‘tipeTeks’.

        widgetInti = QtGui.QWidget()  //digunakan untuk meng inisialisasi  variabel dengan nama ‘widgetInti’ yang di isi dengan variabel ‘QWidget’. Dan akan digunakan sebagai tempat kanvasnya di tengah window.

        self.kanvas = AreaKanvas(self)  //digunakan untuk memanggil atau menjalankan class dengan nama ‘AreaKanvas’ dan disimpan ke dalam variabel ‘kanvas’.
        self.mainLayout = QtGui.QVBoxLayout(widgetInti)  //digunakan untuk membuat sebuah layout dengan nama “QVBoxLayout’ dengan parameter ‘widgetInti’. Agar saat di masukkan sebagai layout inti di tengah window, tidak terjadi error. Kemudian di tampung ke dalam variabel ‘mainLayout’.
        self.kanvas.setMinimumHeight(500)  //digunakan untuk membuat ukuran tinggi minimum kanvas sebesar 500
        self.kanvas.setMinimumWidth(500)  //digunakan untuk membuat ukuran lebar minimum kanvas sebesar 500
        self.kanvas.setMaximumWidth(500)  //digunakan untuk membuat ukuran lebar maximum kanvas sebesar 500
        self.kanvas.setMinimumHeight(500)  //digunakan untuk membuat ukuran tinggi maksimum kanvas sebesar 500
        self.mainLayout.setContentsMargins(0,0,0,0)  //digunakan agar tidak ada margin pada layout utama nya. Tujuannya hanya untuk memperbagus saja.
        self.setCentralWidget(widgetInti)  //digunakan untuk memasukkan widget inti sebagai objek di tengah window. Dan tentu saja memasukkan ‘mainLayout’ ke dalamnya. Karena sudah di masukkan sebagai parameter saat meng inisiaisasinya tadi

        self.createActions()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘createActions’ 
        self.createMenus()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘createMenus’ 
        self.setScroll()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘setScroll’ 
        self.buatToolBar()  //digunakan untuk memanggil atau menjalankan metode dengan nama ‘buatToolBar’ 
        self.buatSettingBar()//digunakan untuk memanggil atau menjalankan metode dengan nama ‘buatSettingBar’

        self.setWindowTitle("Painting -> Mn-belajarpython.blogspot.co.id"  //digunakan untuk mengubah nama window.
        self.resize(700, 650)  //digunakan untuk mengubah ukuran window menjadi 700x650 pixel

    def closeEvent(self, event):  //digunakan untuk membuat metode dengan nama ‘closeEvent’’ yang akan di jalankan secara otomatis ketika window di close.
        if self.maybeSave():  //digunakan untuk memanggil metode dengan nama ‘maybeSave’ dan sekaligus mengecek nilai kembaliannya.
            event.accept()  //menutup window jika nilai kembalian dari metode ‘maybeSave’ adalah ‘True’.
        else:  //code program yang akan di jalankan ketika nilai kembalian dari metode ‘maybeSave’ adalah False’.
            event.ignore() //digunaan untuk membatalkan penutupan window.

    def open(self):  //digunakan untuk membuat metode dengan nama ‘open’ yang akan digunakan untuk memilih file yang akan di buka
        if self.maybeSave():  //digunakan untuk memanggil metode dengan nama ‘maybeSave’ dan langsung di cek nilai kembaliannya apakah bernilai ‘True’.
            fileName,_ = QtGui.QFileDialog.getOpenFileName(self, "Open File",
                    QtCore.QDir.currentPath())  //code ini digunakan untuk menampilkan window pemilih file. Kemudian file yang dipilih di simpan lokasinya kedalam variabel ‘fileName’.
            if fileName:  //mengecek dan memastikan variabel ‘fileName’ tidak kosong. Yang artinya mengecek dan memastikan user memilih sebuah file dan klik ‘ok’ bukan ‘cancel’ pada window pemilih file.
                self.kanvas.openImage(fileName)  //digunakan untuk memanggil metode dengan nama ‘opneImage’ yang ada di class ‘AreaKanvas’ yang sudah saya panggil dan saya tampung di variabel ‘kanvas’. Dan memasukkan lokasi file yang sudah di pilih user dan di tampung di varibael ‘fileName’ sebagai parameternya.


    def penColor(self):  //digunakan untuk membuat metode dengan nama ‘ penColor’. Yang akan digunakan untuk memilih warna garis.
        newColor = QtGui.QColorDialog.getColor(self.kanvas.penColor())  //digunakan untuk menampilkan window pemilih warna. Dan warna yang dipilih akan di simpan ke dalam variabel ‘newColor’.
        if newColor.isValid():  //digunakan untuk mengecek apakah warna yang ada di dalam variabel ‘newCorlor’ adalah warna yang valid. Yang juga bisa dikatakan untuk mengecek apakah user meng klik tombol ‘ok’ pada window. Dan bukan tombol ‘cancel’.
            self.kanvas.setPenColor(newColor)  //digunakan untuk mengirim warna yang telah dipilih ke dalam metode pengubah warna garis. Yaitu ‘setPenColor’ yang ada di class AreaKanvas. Dengan memasukkan nilai di dalam variabel ‘newColor’ sebagai parameter.

    def ubahWarnaBackground(self):  //digunakan untuk membuat metode dengan nam a’ubahWarnaBackground’ yang digunakan untuk memilih warna.
        newColor = QtGui.QColorDialog.getColor()  //digunakan untuk menampilkan window pemilih warna. Yang hasilnya kemudian disimpan ke dalam variabel dengan nama ‘newColor’.
        if newColor.isValid():  //digunakan untuk mengecek apakah isi dari variabel ‘newColor’ itu valid. Yang artinya bisa di katakan juga mengecek apakah user telah memilih warna. Dan tidak klik cancel pada window.
            self.kanvas.setWarnaBackground(newColor)  //digunakan untuk mengirim warna yang telah di pilih ke dalam variabel ‘setWarnaBackground’ yang ada di class ‘kanvas’. Dengan memasukkan isi dari variabel ‘newColor’ sebagai parameter.

    def ubahWarnaKanvas(self): //digunakan untuk membuat metode dengan nama ‘ubahWarnaKanvas’. Yang akan digunakan untuk mengirim warna yang akan diubah..
        newColor = QtGui.QColorDialog.getColor()  //digunakan untuk menampilkan window pemilih warna. Dan warna yang telah dipilih di simpan ke dalam variabel ‘newColor’.
        if newColor.isValid():  //digunakan untuk mengecek apakah warna nya valid. Atau sama saja mengecek apakah user telah memilih warna dan tidak klik ‘cancel’ pada window pemilih warna.
            tombol1 = QtGui.QMessageBox.StandardButton.Yes  //digunakan untuk membuat tombol ‘yes’. Dan disimpan ke dalam variabel ‘tombol1’.
            tombol2 = QtGui.QMessageBox.StandardButton.No  //digunakan untuk membuat tombol ‘no’. Dan disimpan ke dalam variabel ‘tombol2’.
            pertanyaan = "apakah anda yakin ingin mengubah warna kanvas ?\n" \
                         "hal ini akan menghapus semua gambar yang telah anda buat sebelumnya."
            response = QtGui.QMessageBox.question(None, "Konfimasi", pertanyaan, tombol1, tombol2)  //digunakan untuk memunculkan kotak dialog konfirmasi untuk mengubah warna kanvas. Serta memasukkan tombol yes dan no. Yang ada di variabel ‘tombol1’ dan ‘tombol2’.
            if response == QtGui.QMessageBox.Yes:  //mengecek apakah user mengklik tombol ‘yes’.
                self.kanvas.setWarnaKanvas(newColor)  //mengirim warna yang telah di pilih user ke dalam metode dengan nama ‘setWarnaKanvas’ dengan memasukkan warna yang telah di pilih user yaitu yang ada di variabel ‘newColor’ sebagai parameter.

    def penWidth(self):  //digunakan untuk membuat metode dengan nama ‘penWidth’ yang akan digunakan untuk menampilkan input dialog pengubah garis
        newWidth, ok = QtGui.QInputDialog.getInteger(self, "Scribble", "Select pen width:", self.kanvas.penWidth(), 1, 50, 1)  //digunakan untuk membuat input dialog untuk mendapatkan sebuah angka atau integer. Dengan judulu window ‘scribble’, dan teks atau petunjuknya adalah ‘select pen width:’. Dan memberikan isi kolom input dengan mendapatkan nilai dari ukuran garis yang didapatkan dengan cara menjalankan metode ‘penWidth’ yang ada di class ‘canvas’. Dan nilai input dari user akan disimpan ke dalam variabel ‘newWidth’. Dan variabel ‘ok’ akan di isi nilai ‘false’ jika di cancel dan ‘True’ jika di klik oke
        if ok:  //digunakan apakah mengecek apakah ‘ok’ bernilai ‘True’. Yang sebenarnya mengecek apakah user meng klik ‘ok’ pada input dialog.
            self.kanvas.setPenWidth(newWidth)  //digunakan untuk mengubah nilai atau ketebalan garis dengan cara menjalankan metode dengan nama ‘setPenWidth’ yang ada di class ‘Canvas’ yang sebelumnya telah di panggil dan disimpan ke dalam variabel ‘kanvas’. Dan dalam pemanggilan metode tersebut saya memasukkan variabel ‘newWidth’ yang berisi nilai baru

    def gambar(self):  //membuat metode dengan nama ‘gambar’ yang akan digunakan untuk memilih file gambar
        fileName, _ = QtGui.QFileDialog.getOpenFileName(self, "Buka file", QtCore.QDir.currentPath())  //digunakan untuk menampilkan sebuah file dialog yang akan digunakanuntuk memilih file foto. Dan lokasi file foto yang dipilih akan disimpan ke dalam variabel ‘fileName’.
        if fileName:  //mengecek apakah variabel ‘fileName’ tidak kosong. Yang artinya mengecek juga apakah user telah memilih file
            self.kanvas.setGambar(fileName)  //digunakan untuk mengatur gambar kanvas. Dengan lokasi gambar yang ada di variabel ‘fileName’
            self.radio13.setEnabled(True)  //digunakan untuk mengaktifkan radio button yang ada di variabel ‘radio13’
            self.radio13.setChecked(True)  //digunakan untuk memiilih radio button yang ada di variabel ‘radio13’ sebagai pilihan

    def createActions(self):  //digunakan untuk membuat metode dengan nama ‘createActions’ yang akan digunakan untukmembuat perintah.
        self.openAct = QtGui.QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open)  //digunakan untuk membuat perintah dengan nama ‘Open’ dengan shortcut ‘Ctrl+O’ dan akan menjalankan metode dengan nama ‘open’ ketika saya klik. Lalu perintah ini disimpan kedalam variabel ‘openAct’.
        self.perintahSave = QtGui.QAction("&Save...", self, triggered=self.diSave)  //digunakan untuk membuat perintah dengan nama ‘Save’ dan akan menjalankan metode dengan nama ‘diSave’ ketika saya klik. Lalu perintah ini disimpan kedalam variabel ‘perintahSave’.
        self.printAct = QtGui.QAction("&Print...", self, triggered=self.kanvas.print_)  //digunakan untuk membuat perintah dengan nama ‘Save’  dan akan menjalankan metode dengan nama ‘Print_’ yang ada di class ‘AreaKanvas’ yang sudah saya tampung didalam variabel ‘kanvas’. Lalu perintah ini disimpan kedalam variabel ‘printAct’.
        self.clearScreenAct = QtGui.QAction("&Clear Screen", self, shortcut="Ctrl+L", triggered=self.kanvas.clearImage)  //digunakan untuk membuat perintah dengan nama ‘Save’ dan akan menjalankan metode dengan nama ‘Print_’ yang ada di class ‘AreaKanvas’ yang sudah saya tampung didalam variabel ‘kanvas’. Lalu perintah ini disimpan kedalam variabel ‘printAct’.

    def createMenus(self):  //digunakan  untuk membuat metode dengan nama ‘createMenus’ yang akan digunakan untuk membuat menu.
        self.toolBar = QtGui.QToolBar()  //digunakan untuk mendefinisikan sebuah toobal. Yang disimapan ke dalam variabel ‘toolbar’.

        self.toolBar.addAction(self.openAct)  //digunakan untuk memasukkan perintah yang ada di variabel ‘openAct’ sebagai toolbar.
        self.toolBar.addAction(self.printAct)    //digunakan untuk memasukkan perintah yang ada di variabel ‘printAct’ sebagai toolbar.
        self.toolBar.addSeparator()  //digunakan untuk menambah garis pembatas di barisan toolbar.
        self.toolBar.addAction(self.perintahSave)  //digunakan untuk memasukkan perintah yang ada di variabel ‘perintahSave’ sebagai toolbar.
        self.toolBar.addAction(self.clearScreenAct)  //digunakan untuk memasukkan perintah yang ada di variabel ‘clearScreenAct’ sebagai toolbar.
        self.toolBar.addSeparator()  //digunakan untuk menambah garis pembatas di barisan toolbar.

        self.toolBar.setMovable(False)  //code ini digunakan agar toolbar tidak dapat dipindah pindah.

        self.addToolBar(self.toolBar)  //digunakan untuk memasukkan toolbar ke dalam window.

    def diSave(self):  //digunakan untuk membuat metode dengan nama ‘diSave’ yang akan digunakan untuk menyimpan gambar.
        self.saveFile('png')  //digunakan untuk memanggil metode dengan nama ‘saveFile’ dengan parameter string ‘png’.

    def maybeSave(self):  //digunakan untuk membuat metode dengan nama ‘maybeSave’ yang akan digunakan untuk menampilkan window konfirmasi.
        if self.kanvas.isModified():  //digunakan untuk mengecek apakah variabel ‘isMpdified’ bernilai ‘True’.
            ret = QtGui.QMessageBox.warning(self, "Scribble",
                        "The image has been modified.\n"
                        "Do you want to save your changes?",
                        QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard |
                        QtGui.QMessageBox.Cancel)
  //6 baris code di atas digunakan untuk menampilkan window konfirmasi. Dengan 3 tombol. Yaitu tombol ‘save’, ‘Discard’, dan ‘cancel’.
            if ret == QtGui.QMessageBox.Save:  //digunakan untuk mengecek apakah user meng klik tombol ‘save’.
                return self.saveFile('png')  //digunakan untuk memanggil metode dengan nama ‘saveFile’ dengan memasukkan parameter string ‘png’. Dan mengembalikan nilai kembalian dari metode ‘saveFile’ tersebut.
            elif ret == QtGui.QMessageBox.Cancel:  //digunakan untuk mengecek apakah user meng klik tombol ‘cancel’.
                return False  //mengembalikan nilai ‘False’.

        return True  //mengembalikan nilai ‘True’ ketika nilai variabel ‘isModified’ bernilai ‘False’.

    def saveFile(self, fileFormat):  //digunakan untuk membuat metode dengan nama ‘saveFile’ dengna satu buah parameter. Yang di simpan ke dalam variabel ‘fileFormat’.
        initialPath = QtCore.QDir.currentPath() + '/untitled.' + fileFormat  //digunakan untuk mendapatkan lokasi file python ini kalian simpan. Dan kalian simpan ke dalam variabel ‘intialPath’.

        fileName,_ = QtGui.QFileDialog.getSaveFileName(self, "Save As", initialPath, "%s Files (*.%s);;All Files (*)" % (str(fileFormat).upper(), fileFormat))  //digunakan untuk menampilkan window untuk menympan file dan memilih lokasinya. Dengan lokasi default tempat file python ini berada. Dan lokasinya disimpan ke dalam variabel ‘fileName’.
        if fileName:  //mengecek dan memastikan variabel ‘fileName’ tidak kosong. Kekosongan nilai terjadi jika user mengklik ‘cancel pada window pemilih lokasi.
            return self.kanvas.saveImage(fileName, fileFormat)  //digunakan untuk memanggil metode dengan nama ‘saveImage’ yang ada di class ‘AreaKanvas’ yang sebelumnya telah di simpan ke dalam variabel kanvas. Serta memasukkan lokasi yang telah di pilih sebagai parameter yang telah ada di variabel ‘fileName’. Dan juga memasukkan nilai yang ada di variabel ‘fileFormat’ sebagai parameter.

        return False  //digunakan untuk mengembalikan nilai ‘False’ jika variabel’fileName’ bernilai kosong.

    def setScroll(self):  //digunakan untuk membuat metode dengan nama ‘setScroll’ yang akan digunakan untuk mengatur scroll
        # mengatur scroll  //komentar
        self.scrollArea = QtGui.QScrollArea()  //digunakan untuk mendefinisikan sebuah area yang akan di scroll. Dengan memanggil class ‘QScrollArea’. Dan disimpan ke dalam variabel ‘scrollArea’.
        self.scrollArea.setWidget(self.kanvas)  //digunakan untuk memasukkan canvas kedalam area scroll. Atau bisa juga dikatakan untuk menetapkan kanvas untuk di scroll
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Mid)  //digunakan untuk mengubah warna backgorund nya saja
        self.scrollArea.setAlignment(QtCore.Qt.AlignCenter)  //digunakan untuk membuat canvas agar tampil di tengah window

        self.mainLayout.addWidget(self.scrollArea)  //digunakan untuk memasukkan ‘scrollArea’ yang merupakan variabel penampung tempat yang akan di scroll kedalam variabel ‘mainLayout’.

    def buatToolBar(self):  //digunakan untuk membuat metode dengan nama ‘buatToolBar’ yang tentu saja digunakan untuk membuat Toolbar.
        self.layoutRadio1 = QtGui.QHBoxLayout()  //digunakan untuk membuat sebuah layout. Yaitu ‘QHBoxLyout’. Dan disimpan ke dalam variabel ‘layoutRadio1’.
        self.groupRadio = QtGui.QButtonGroup()  //digunakan untuk membuat sebah Radio button klompok atau grup. Yang digunakan untuk mengelompokkan satuan radio button.  Dan disimpan ke dalam variabel ‘groupRadio’.

        self.radio = QtGui.QRadioButton('Bulat')  //digunakan untuk membuat unit radio button baru dengan nama ‘Bulat’ dan disimpan kedalam variabel ‘radio’
        self.radio1 = QtGui.QRadioButton('Kotak')  //digunakan untuk membuat unit radio button baru dengan nama ‘Kotak’ dan disimpan kedalam variabel ‘radio1’
        self.radio2 = QtGui.QRadioButton('Arc')  //digunakan untuk membuat unit radio button baru dengan nama ‘Arc’ dan disimpan kedalam variabel ‘radio2’
        self.radio3 = QtGui.QRadioButton('Chord')  //digunakan untuk membuat unit radio button baru dengan nama ‘Chord’ dan disimpan kedalam variabel ‘radio3’
        self.radio4 = QtGui.QRadioButton('Convex')  //digunakan untuk membuat unit radio button baru dengan nama ‘Convex’ dan disimpan kedalam variabel ‘radio4’
        self.radio5 = QtGui.QRadioButton('Pie')  //digunakan untuk membuat unit radio button baru dengan nama ‘Pie’ dan disimpan kedalam variabel ‘radio5’
        self.radio6 = QtGui.QRadioButton('Poligon')  //digunakan untuk membuat unit radio button baru dengan nama ‘Poligon’ dan disimpan kedalam variabel ‘radio6’
        self.radio7 = QtGui.QRadioButton('Polyline')  //digunakan untuk membuat unit radio button baru dengan nama ‘Polyline’ dan disimpan kedalam variabel ‘radio7’
        self.radio8 = QtGui.QRadioButton('Round')  //digunakan untuk membuat unit radio button baru dengan nama ‘Round’ dan disimpan kedalam variabel ‘radio8’
        self.radio9 = QtGui.QRadioButton('Rounded')  //digunakan untuk membuat unit radio button baru dengan nama ‘Rounded’ dan disimpan kedalam variabel ‘radio9’
        Self.radio10 = QtGui.QRadioButton('Pensil')  //digunakan untuk membuat unit radio button baru dengan nama ‘Pensil’ dan disimpan kedalam variabel ‘radio10’
        Self.radio11 = QtGui.QRadioButton('Pen')  //digunakan untuk membuat unit radio button baru dengan nama ‘Pen’ dan disimpan kedalam variabel ‘radio11’
        Self.radio12 = QtGui.QRadioButton('Penghapus')  //digunakan untuk membuat unit radio button baru dengan nama ‘Penghapus’ dan disimpan kedalam variabel ‘radio12’
        self.radio13 = QtGui.QRadioButton('Gambar')  //digunakan untuk membuat unit radio button baru dengan nama ‘Gambar’ dan disimpan kedalam variabel ‘radio13’
        self.radio14 = QtGui.QRadioButton('Teks')  //digunakan untuk membuat unit radio button baru dengan nama ‘Teks’ dan disimpan kedalam variabel ‘radio14’

        self.groupRadio.addButton(self.radio)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio1)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio1’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio2)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio2’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio3)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio3’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio4)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio4’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio5)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio5’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio6)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio6’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio7)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio7’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio8)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio8’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio9)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio9’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio10)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio10’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio11)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio11’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio12)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio12’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio13)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio13’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’
        self.groupRadio.addButton(self.radio14)  //digunakan untuk memasukkan radio button yang ada di dalam variabel ‘radio14’ ke dalam pengelompok radio button yang ada di variabel ‘groupRadio’

        self.radio.setChecked(True)  //digunakan untuk membuat radio button yang ada di variabel ‘radio’ menjadi yang terpilih.

        self.layoutRadio1.addWidget(self.radio)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio1)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio1’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio2)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio2’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio3)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio3’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio4)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio4’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio5)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio5’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio6)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio6’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio7)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio7’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio8)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio8’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio9)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio9’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio10)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio10’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio11)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio11’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio12)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio12’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio13)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio13’ kedalam layout yang ada di variabel ‘layoutRadio1’
        self.layoutRadio1.addWidget(self.radio14)  //digunakan untuk memasukkan radio button yang ada di variabel ‘radio14’ kedalam layout yang ada di variabel ‘layoutRadio1’

        self.radio13.setEnabled(False)   //digunakan untuk mematikan radio button yang ada di variabel ‘radio13’. Agar tidak dapat dipilih oleh user

        self.mainLayout.addLayout(self.layoutRadio1)  //digunakan untuk memasukkan layout yang ada divariabel ‘layoutRadio1’ kedalam layout utama yang tersimpan ke dalam variabel ‘mainLayout’.

    def buatSettingBar(self):  //digunakan untuk membuat metode dengan nama ‘buatSettingBar’ yang digunakan untuk membut setting bar.
        layoutSetting = QtGui.QToolBar(self)  //digunakan untuk membuat sebuah toolbar (QToolBar) dan disimpan ke dalam variabel ‘layoutSetting’.

        self.jenisFont = QtGui.QFontComboBox(self)  //digunakan untuk membuat sebuah combo box dengan isi jenis - jenis font yang telah disediakan oleh pyside nya. Yaitu ‘QFontComboBox’. Jadi kita tinggal manggil saja. Dan disimpan ke dalam variabel ‘jenisFont’.
        self.jenisFont.currentFontChanged.connect(self.FontFamily)  //digunakan untuk menjalankan metode dengan nama ‘FontFamily’ ketika nilai yang terpilih pada combobox berubah

        self.ukuranFont = QtGui.QComboBox(self)  //digunakan untuk membuat sebuah combobox yang digunakan untuk ukuran teks. Dan disimpan ke dalam variabel ‘ukuranFont’.
        self.ukuranFont.setEditable(True)  //digunakan untuk membuat combo box yang ada di dalam variabel ‘ukuranFont’ agar dapat di edit. Maksudnya kita juga bisa mengetik sendiri.
        self.ukuranFont.setMinimumContentsLength(3)  //digunakan membuat ukuran combobox yang ada di variabel ‘ukuranFont’ agar panjang minimal nya adalah 3. Maksudnya agar saat di minimize panjang nya tidak kurang dari 3.
        self.ukuranFont.activated.connect(self.FontSize)  //digunakan utnuk menjalankan metode dengan nama ‘FontSize’  ketika kombobox di variabel ‘ukuranFont’ di aktifkan. Atau di klik 
        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]  //digunakan untuk membuat sebuah list angka yang akan digunakan sebagai isi dari combo box yang ada di variabel ‘ukuranFont’. Dan list tersebut disimpan ke dalam variabel ‘flist’.
        for i in flist:  //digunakan untuk mengambil stiap data secara berurutan di dalam list yang ada di varaiabel ‘flist’ dan datanya di simpan ke dalam variabel ‘i’.
            self.ukuranFont.addItem(str(i))  //memasukkan item yang di tampung ke dalam variabel ‘i’ kedalam combobox yang ada di varaibel ‘ukuranFont’.

        self.teks = QtGui.QLineEdit()  //digunakan untuk membuat sebuah kolom teks. Dan disimpan kedalam variabel ‘teks’/
        self.teks.setText("masukan teks disini")  //digunakan untuk memasukkan teks ke dalam kolom teks yang ada di variabel ‘teks’.
        self.gambarAct = QtGui.QAction("Gambar", self, triggered=self.gambar)  //digunakan untuk membuat sebuah perintah dengan nama ‘Gambar’ dan akan menjalanakan metode dengan nama ‘gambar’ ketika perintah ini di klik atau di eksekusi. Lalu perintah ‘Gambar’ ini disimpan ke dalam variabel ‘gambarAct’
        self.penColorAct = QtGui.QAction("&Pen Color...", self, triggered=self.penColor)  //digunakan untuk membuat sebuah perintah dengan nama ‘Pen Color’ dan akan menjalankan metode dengan nama ‘penColor’ ketika perintah ini di klik atau di eksekusi. Lalu perintah ‘Pen Color’ ini disimpan ke dalam variabel ‘penColorAct’
        self.penWidthAct = QtGui.QAction("Pen &Width...", self, triggered=self.penWidth)  //digunakan untuk membuat sebuah perintah dengan nama ‘Pen Width’ dan akan menjalankan metode dengan nama ‘penWidth’ ketika perintah ini di klik atau di eksekusi. Lalu perintah ‘Pen Width’ ini disimpan ke dalam variabel ‘penWidthAct’
        self.perintahUbahBackground = QtGui.QAction("Warna Background", self, triggered=self.ubahWarnaBackground)  //digunakan untuk membuat sebuah perintah dengan nama ‘Warna Background’ dan akan menjalankan metode dengan nama ‘ubahWarnaBackground’ ketika perintah ini di klik atau di eksekusi. Lalu perintah ‘Warna Background’ ini disimpan ke dalam variabel ‘perintahUbahBackground’
        self.warnaKanvas = QtGui.QAction("Warna Kanvas", self, triggered=self.ubahWarnaKanvas)  //digunakan untuk membuat sebuah perintah dengan nama ‘Warna Kanvas’ dan akan menjalankan metode dengan nama ‘ubahWarnaKanvas’ ketika perintah ini di klik atau di eksekusi. Lalu perintah ‘Warna Kanvas’ ini disimpan ke dalam variabel ‘perintahUbahBackground’

        layoutSetting.addWidget(self.jenisFont)  //digunakan untuk measukkan combo box yang ada di variabel ‘jenisFont’. Kedalam layout yang ada di variabel ‘layoutSetting;
        layoutSetting.addWidget(self.ukuranFont)  //digunakan untuk measukkan combo box yang ada di variabel ‘ukuranFont’. Kedalam layout yang ada di variabel ‘layoutSetting;
        layoutSetting.addWidget(self.teks)  //digunakan untuk measukkan kolom teks yang ada di variabel ‘teks’. Kedalam layout yang ada di variabel ‘layoutSetting;
        layoutSetting.addAction(self.gambarAct)  //digunakan untuk memasukkan perintah yang ada di variabel ‘gambarAct’ kedalam layout yang ada di variabel ‘layoutSetting’.
        layoutSetting.addAction(self.penColorAct)  //digunakan untuk memasukkan perintah yang ada di variabel ‘penColor’ kedalam layout yang ada di variabel ‘layoutSetting’.
        layoutSetting.addAction(self.penWidthAct)  //digunakan untuk memasukkan perintah yang ada di variabel ‘penWidthAct’ kedalam layout yang ada di variabel ‘layoutSetting’.
        layoutSetting.addAction(self.perintahUbahBackground)  //digunakan untuk memasukkan perintah yang ada di variabel ‘PerintahUbahBackground’ kedalam layout yang ada di variabel ‘layoutSetting’.
        layoutSetting.addAction(self.warnaKanvas)  //digunakan untuk memasukkan perintah yang ada di variabel ‘PerintahKanvas’ kedalam layout yang ada di variabel ‘layoutSetting’.

        layoutSetting.setMovable(False)  //digunakan agar toolbar yang ada di variabel ‘layoutSetting’ tidak bisa di pindah - pindahkan oleh user.

        self.addToolBar(QtCore.Qt.BottomToolBarArea, layoutSetting)  //digunakan untuk menambahkan toolbar baru. Yaitu menambahkan toolbar yang sudah kita buat dan kita simpan ke dalam variabel ‘layoutSentting’ yang juga digunakan sebagai salah satu parameternya. Yang parameter keduanya adalah ‘BottomToolbarArea’ agar toolbarnya berada di bawah window.

    def getPilihan(self):  //digunakan untuk membuat metode dengan nama ‘getPilihan’ yang digunakan untuk mendapatkan pilihan radio button. Atau radio button yang terpilih.
        return self.groupRadio.checkedButton().text()  //mengembalikan teks yang radio button yang terpilih.
    def FontFamily(self, font):  //digunakan untuk membuat metode dengan nama ‘fontFamily’ yang akan digunakan untuk mengubah jenis font.
        self.tipeTeks = self.jenisFont.currentFont().toString()  //digunakan untuk mendapatkan nama font yang terpilih di dalam combo box yang tersimpan di dalam varaibel ‘jenisFont’. Dan disimpan ke dalam variabel ‘tipeTeks’.
        self.kanvas.setFocus()  //digunakan agar kursor focus ke kanvas. Maksudnya agar tidak tetap terpilih combobox yang ada di variabel ‘jenisFont’ tadi setelah kita mengubah font nya. Ini berguna hanya untuk kenyamanan user nya saja.

    def FontSize(self, fsize): //digunakan untuk membuat metode dengan nama ‘FontSize’ yang akan digunakan untuk mengubah ukuran font.
        self.ukuran = self.ukuranFont.currentText()  //digunakan untuk merubah nilai variabel ‘ukuran’ menjadi nilai yang ada di combo box di dalam variabel ‘ukuranFont’.

    def getTipeUkuran(self):  //digunakan untuk membuat metode dengan nama ‘getTipeUkuran’  yang digunakan untuk mendapatkan jenis teks.
        return self.tipeTeks  //digunakan untuk mengembalikan jenis font yang sedang terpilih. Yang telah tersimpan di dalam variabel ‘tipeTeks’

    def getUkuran(self):  //digunakan untuk membuat metode dengan nama ‘getUkuran’  yang digunakan untuk mendapatkan ukuran teks.
        return int(self.ukuran)  //digunakan untuk mengembalikan ukuran font yang sedang terpilih. Yang telah tersimpan di dalam variabel ‘ukuran’

    def getTeks(self):   //digunakan untuk membuat metode dengan nama ‘getTeks’  yang digunakan untuk mendapatkan teks yang ingin dimasukkan ke dalam kanvas.
        return self.teks.text()  //digunakan untuk mengapatkan teks yang ingin di masukkan ke dalam kanvas. Yang sebenarnya dimasukkan oleh user ke dalam kolom teks yang ada di dalam variabel ‘teks’. Lalu langsung di kembalikan ke pemanggil metode ‘getTeks’ ini.

if __name__ == '__main__':  //merupakan code utama yang akan di jalankan. Bisa dikantakan sebagai main method

    import sys  //digunakan untuk mengimport sys.

    app = QtGui.QApplication(sys.argv)  //digunakan untk memanggil ‘Qapplication’ hal ini wajib adanya. Dan disimpan ke dalam variabel ‘app’.
    window = MainWindow()  //digunakan untuk menjalankan class dengan nama ‘MainWindow’. Dan disimpan ke dalam variabel ‘window’.
    window.show()  //digunakan untuk menampilkan window nya

    sys.exit(app.exec_())  //digunakan agar window tidak langsung close saat di jalankan.


Nah itu dia temen - temen penjelasan code programnya.. Semoga dengan penjelasan di atas dapat membuat kalian lebih mudah di pahami.. Tapi mohon maaf ya apabila ada penjelasan yang kurang jelas, atau bakan ada kekeliruan... Mohon kasi pembenaran atau pendapat kalian di kolom komentar ya temen - temen... Biar kita bisa belajar bersama - sama..

Sekali lagi saya ingatkan 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...





Oke, sekian dulu ya temen - temen postingan saya kali ini..  Semoga apa yang telah saya sampaikan di atas, dapat memberikan manfaat bagi kita semua.. Jika kalian punya kritik, saran dan pesan bisa kalian sampai kan di kolom komentar maupun laman contact us yang ada di halaman ini...

Oke terimakasih dan sampai di sini dulu ya temen - temen... Sampai jumpa di postingan saya yang lainnya.. Oya, jangan lupa untuk membaca versi - versi yang lainnya... Biar ilmunya juga nambah.. Hehe.. Temikasih sekali lagi dan sekian...

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