Aplikasi Screenshoot PySide Python (versi 5)

BelajarPython - Assalamualaikum wr. wb.

Jumpa lagi sahabat python.. Pada kesempatan kali ini saya akan mengajak kalian membuat aplikasi screenshoot nih.. Seperti apa? Langsung saja di simak ya...

Pengenalan aplikasi yang akan kita buat.

Aplikasi yang kita buat kali ini adalah aplikasi screenshoot yang sudah tidak asing lagi.. Dimana aplikasi ini berfungsi untuk memotret layar PC kalian untuk di jadikan sebagai file gambar...

Aplikasi ini saya posting dengan berbagai versi.. Dengan penambahan fitur di tiap versinya.. Jika kalian ingin melihat semua versi aplikasi ini, KLIK DISINI ya...

Kali ini, saya akan memberikan versi ke 4. Dimana pada versi ini saya akan menambahkan fitur selection screenshoot.. Dimaan kita bisa menentukan lebar dan ukuran area yang ingin kita potret... Seperti aplikasi snipping tools di windows..

Rincian Lengkap Screenshoot PySide Versi 5.0

Aplikasi ini menggunakan library PySide.. Jadi, untuk menjalankannya, harus install dulu (KLIK DISINI untuk install).... Dan berikut rincian lengkap versi ini..

Nama: mn-Screenshoot 5.0
Versi: 5.0 || selanjutnya.
Platform: Python 3.x  || Install.
Modul: PySide || Install.
Baris Code: +- 265 baris.
Penambahan: +-128 baris.
Terdiri dari: 2 class dan 24 metode.
Fitur: Selection screenshoot.
Kelemahan: tidak bisa corat coret pada hasil screenshoot.
syarat menjalankan: Python 3.x, PySIde, dan editor teks / IDE.
Cara menjalankan: install python 3 dan PySide, copy paste code program pada editor/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.. 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 Screenshoot versi 5.0

Nah lalu seperti apa code program versi ini ? Oke, Berikut saya berikan code program nya ya...


from PySide import QtCore, QtGui

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

        self.parent = parent
        self.rectTerakhir = None

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

        screen = QtGui.QDesktopWidget().screenGeometry()
        self.setFixedSize(screen.width(), screen.height())
        self.showFullScreen()

        self.gambar = gambar
        self.masukanGambar(gambar)
        self.showFullScreen()

    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 resizeImage(self, image, newSize):
        if image.size() == newSize:
            return

        newImage = QtGui.QImage(newSize, QtGui.QImage.Format_RGB32)
        newImage.fill(QtGui.qRgb(255, 25, 255))
        painter = QtGui.QPainter(newImage)
        painter.drawImage(QtCore.QPoint(0, 0), image)
        self.image = newImage


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

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

    def mouseMoveEvent(self, event):
        if (event.buttons() & QtCore.Qt.LeftButton) and self.diKlik:
            self.diPindah = True
            self.masukanGambar(self.gambar)
            self.drawLineTo(event.pos())
            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton and self.diKlik and self.diPindah:
            self.diKlik = False
            self.diPindah = False

            self.akhirX = event.pos().x()
            self.akhirY = event.pos().y()

            self.kirimArea()
            self.close()

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

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

        if self.rectTerakhir :
            painter.eraseRect(self.rectTerakhir)

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

        painter.drawPolyline(poligon)

    def kirimArea(self):
        if self.awalX > self.akhirX:
            if self.awalY > self.akhirY:
                self.parent.tangkapArea(self.akhirX+1, self.akhirY+1, self.awalX - self.akhirX -1, self.awalY - self.akhirY-1)
            else:
                self.parent.tangkapArea(self.akhirX+1, self.awalY+1, self.awalX - self.akhirX-1, self.akhirY - self.awalY-1)
        else:
            if self.awalY > self.akhirY:
                self.parent.tangkapArea(self.awalX+1, self.akhirY+1, self.akhirX - self.awalX-1, self.awalY - self.akhirY-1)
            else:
                self.parent.tangkapArea(self.awalX+1, self.awalY+1, self.akhirX - self.awalX-1, self.akhirY - self.awalY-1)

    def masukanGambar(self, gambar):
        painter = QtGui.QPainter(self.image)
        painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))

        screen = QtGui.QDesktopWidget().screenGeometry()
        painter.drawPixmap(0, 0, gambar)

class Screenshot(QtGui.QWidget):
    def __init__(self):
        super(Screenshot, self).__init__()

        self.buatTombol()
        self.tempatHasil = QtGui.QLabel()
        self.tempatHasil.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.tempatHasil.setAlignment(QtCore.Qt.AlignCenter)

        self.mainLayout = QtGui.QVBoxLayout()
        self.setScroll()
        self.buaPengaturan()
        self.mainLayout.addLayout(self.layoutTombol)
        self.setLayout(self.mainLayout)

        self.jeda.setValue(1)
        self.sudahDisimpan = True

        self.setWindowTitle("Screenshos -> mn-belajarpython.blogspot.co.id")
        self.resize(300, 30)
        self.mainLayout.setContentsMargins(0, 0, 0, 0)

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

        self.mainLayout.addWidget(self.scrollArea)
        self.scrollArea.setMinimumSize(700, 400)

        self.scrollArea.hide()

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

    def screenshootBaru(self):
        if self.sembunyikan.isChecked():
            self.hide()
        self.window.setDisabled(True)

        QtCore.QTimer.singleShot(self.jeda.value() * 1000, self.tangkapLayar)
        self.sudahDisimpan = False

    def saveScreenshot(self):
        format = 'png'
        initialPath = QtCore.QDir.currentPath() + "/untitled." + format

        fileName,_ = QtGui.QFileDialog.getSaveFileName(self, "Save As",
                initialPath,
                "%s Files (*.%s);;All Files (*)" % (format.upper(), format))
        if fileName:
            self.hasil.save(fileName, format)
            self.sudahDisimpan =False

    def tangkapLayar(self):
        QtGui.qApp.beep()

        self.hasil = None
        self.hasil = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId())
        self.salinan = self.hasil
        self.updateGambar()

        self.window.setDisabled(False)

        if self.sembunyikan.isChecked():
            self.show()

        self.simpan.setEnabled(True)
        self.pilih.setEnabled(True)

    def updateCheckBox(self):
        if self.jeda.value() == 0:
            self.sembunyikan.setDisabled(True)
        else:
            self.sembunyikan.setDisabled(False)

    def buaPengaturan(self):
        self.jeda = QtGui.QSpinBox()
        self.jeda.setSuffix("s")
        self.jeda.setMaximum(9)
        self.jeda.setFixedSize(40,20)
        self.jeda.valueChanged.connect(self.updateCheckBox)

        self.jedaLabel = QtGui.QLabel("Tunda :")

        self.sembunyikan = QtGui.QCheckBox("Sembunyikan")

        layoutPengaturan = QtGui.QHBoxLayout()
        layoutPengaturan.addWidget(self.jedaLabel)
        layoutPengaturan.addWidget(self.jeda)
        layoutPengaturan.addWidget(self.sembunyikan)
        self.layoutTombol.addLayout(layoutPengaturan)

        self.sembunyikan.setChecked(True)

    def buatTombol(self):
        self.window = self.perintahTombol("Tangkap", self.screenshootBaru)
        self.simpan = self.perintahTombol("Simpan",self.saveScreenshot)
        self.pilih = self.perintahTombol("Potong", self.pilihSebagian)

        self.layoutTombol = QtGui.QHBoxLayout()
        self.layoutTombol.addStretch()
        self.layoutTombol.addWidget(self.window)
        self.layoutTombol.addWidget(self.pilih)
        self.layoutTombol.addWidget(self.simpan)
        self.layoutTombol.setContentsMargins(4,0,4,4)

        self.simpan.setEnabled(False)
        self.pilih.setEnabled(False)

    def perintahTombol(self, text, perintah):
        button = QtGui.QPushButton(text)
        button.clicked.connect(perintah)
        button.setFixedSize(60, 20)
        return button

    def updateGambar(self):
        self.tempatHasil.setMinimumSize(self.hasil.size())
        self.tempatHasil.setPixmap(self.hasil)
        self.scrollArea.show()

    def pilihSebagian(self):
        self.showFullScreen()
        self.tempatPilih = AreaKanvas(self, gambar=self.salinan)
        self.tempatPilih.show()

    def tangkapArea(self, x, y, lebar, tinggi):
        QtGui.qApp.beep()
        self.showNormal()

        self.hasil = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId(), x, y, lebar, tinggi)
        self.updateGambar()

    def keyPressEvent(self, keyevent):
        event = keyevent.key()
        if event == QtCore.Qt.Key_Escape:
            self.showNormal()
            self.b.close()
            self.show()

    def closeEvent(self, a):
        if not self.sudahDisimpan :
            tombol1 = QtGui.QMessageBox.StandardButton.Yes
            tombol2 = QtGui.QMessageBox.StandardButton.No
            pertanyaan = "apakah anda ingin menyimpan hasil screenshoot nya ?"
            response = QtGui.QMessageBox.question(self, "Konfirmasi", pertanyaan, tombol1, tombol2)
            if response == QtGui.QMessageBox.Yes:
                self.saveScreenshot()
        self.destroy()

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    screenshot = Screenshot()
    screenshot.show()
    sys.exit(app.exec_())


Nah lalu, seperti apa tampilan yang di hasilkan dari code program di atas? Langsung saja yuk kita simak sama - sama tampilannya di bawah ini...


Penjelasan code program Aplikasi Screenshoot PySide versi 5.0

Sekarang saya akan mencoba untuk menjelaskan code program yang sudah saya bagikan di atas tadi.. Agar kalian lebih mudah untuk memahaminya.. Oke, Langsung saja..
[NOTE : Teks berwarna MERAH pada penjelasan adalah Code tambahan yang tidak ada di versi sebelumnyaDan yang Berwarna BIRU akan di hapus di versi berikutnya. Jika Code berwarna MERAH dan komentar berwarna BIRU maka merupakan code baru dan akan di hapus di versi berikutnya]

from PySide import QtCore, QtGui  //mengimport class ‘QtCore’ dan ‘QtGui’ dari  PySIde

class AreaKanvas(QtGui.QWidget):  //membuat class baru (AreaKanvas)
    def __init__(self, parent=None, gambar=None):  //membuat konstruktor dengan 2 parameter
        super(AreaKanvas, self).__init__(parent)  //memanggil construktor parent

        self.parent = parent  //menampung nilai variabel parameter
        self.rectTerakhir = None  //inisialisasi variabel rectTerakhir

        self.setAttribute(QtCore.Qt.WA_StaticContents)  //setting atribut
        self.diKlik = False  //inisialisasi variabel menentukan sudah klik di window atau belum
        self.diPindah = False  //inisialisasi variabel menentukan sudah di drop pada window atau belum
        self.myPenWidth = 1  //inisialisasi tebal pensil
        self.myPenColor = QtCore.Qt.blue  //inisialisasi warna pensil
        self.image = QtGui.QImage()  //membuat image (tempat gambar)
        self.lastPoint = QtCore.QPoint()  //inisialisasi variabel untuk di isi nilai posisi kursor setelah selesai di drag

        screen = QtGui.QDesktopWidget().screenGeometry()  /mendapatkan ukuran layar PC
        self.setFixedSize(screen.width(), screen.height())  //mengubah ukuran window sesuai ukuran layar PC (full screen)
        self.showFullScreen()  //menjalankan metode ‘showFullScreen’

        self.gambar = gambar  //menampung nilai variabel ‘gambar’
        self.masukanGambar(gambar)  //menjalankan metode ‘masukkanGambar’ dengan parameter nilai variabel ‘gambar’
        self.showFullScreen()  //menjalankan metode ‘showFullScreen’

    def resizeEvent(self, event):  //metode yang akan di jalankan ketika window berubah ukuran
        if self.width() > self.image.width() or self.height() > self.image.height():  //mengecek apakah lebah window lebih besar dari lebar ‘foto’ atau tinggi window lebih tinggi dari tinggi foto
            newWidth = max(self.width() + 128, self.image.width())  //mendapatkan ukuran terbesar antara lebar window dan lebar foto
            newHeight = max(self.height() + 128, self.image.height())  //mendapatkan ukuran terbesar antara tinggi window dan tinggi foto
            self.resizeImage(self.image, QtCore.QSize(newWidth, newHeight))  //mengubah ukuran foto (memanggil metode risizeImage)
            self.update()  //memperbarui window

        super(AreaKanvas, self).resizeEvent(event)  //memanggil metode kelas parent dari class ini

    def resizeImage(self, image, newSize):  //metode ‘resizeImage’
        if image.size() == newSize:  //mengecek apakah ukuran baru sama dengan ukuran foto
            return  //mengembalikan kosongan

        newImage = QtGui.QImage(newSize, QtGui.QImage.Format_RGB32) //mengubah ukuran tempat foto
        newImage.fill(QtGui.qRgb(255, 25, 255))   //menghapus semua foto
        painter = QtGui.QPainter(newImage)  //inisialisasi tempat foto (lagi)
        painter.drawImage(QtCore.QPoint(0, 0), image)  //memasukkan foto lagi
        self.image = newImage  //menampung foto (tempat foto)


    def mousePressEvent(self, event):  //metode yang akan di jalankan ketika mouse di klik
        if event.button() == QtCore.Qt.LeftButton:  //memastikan apakah yang di klik adalah klik kiri
            self.lastPoint = event.pos()  //mengubah nilai ‘lastPoint’ menjadi posisi mouse saat di klik
            self.diKlik = True  //mengubah nilai varibel ‘diKlik’ menjadi ‘True’ menandakan sudah di klik

            self.awalX = event.pos().x()  //mendapatkan posisi koordinat x mouse saaat pertama di klik
            self.awalY = event.pos().y()  //mendapatkan posisi koordinat y mouse saaat pertama di klik

    def mouseMoveEvent(self, event):  //metode yang akan di jalankan ketika mouse di pindah
        if (event.buttons() & QtCore.Qt.LeftButton) and self.diKlik:  //memastikan mouse bergerak dengan tetap menahan klik kiri (drag)
            self.diPindah = True  //mengubah nilai variabel ‘diPindah’ menandakan sudah di drag
            self.masukanGambar(self.gambar)  //memasukkan gambar kembali
            self.drawLineTo(event.pos())  //menjalankan metode ‘drawLineTo’ (menggambar garis)
            self.update()  //memperbarui tampilan

    def mouseReleaseEvent(self, event):  //metode yang di jalankan ketika melepas klik dari mous
        if event.button() == QtCore.Qt.LeftButton and self.diKlik and self.diPindah:  //memastikan yang di klik adalah klik kiri dan variabel ‘diKlik’ dan ‘diPindah’ bernilai True (sudah pernah di klik dan drag)
            self.diKlik = False   //mengubah nilai diKlik menjadi False (menandakan proses klik sudah selesai)
            self.diPindah = False   //mengubah nilai diPindah menjadi False (menandakan proses drag sudah selesai)

            self.akhirX = event.pos().x()  //mendapatkan koordinat x mouse terakhir ketika di lepas
            self.akhirY = event.pos().y()  //mendapatkan koordinat y mouse terakhir ketika di lepas

            self.kirimArea()  //menjalankan metode ‘kirimArea’
            self.close()  //menutup window

    def paintEvent(self, event):  //metode yang akan di jalankan otomatis ketika proses drag and drop dan memasukkan gambar
        painter = QtGui.QPainter(self)  //membuat painter
        painter.drawImage(QtCore.QPoint(0, 0), self.image)  //menggambar foto

    def drawLineTo(self, endPoint):  //metode ‘drawLine’
        painter = QtGui.QPainter(self.image)  //membuat image baru (tempat foto)
        painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))  //inisialisasi pensil dengan beberapa settingan

        if self.rectTerakhir :  //memastikan ‘rectTerakhir’ tidak kosong
            painter.eraseRect(self.rectTerakhir)  //menhapus dengan area/lokasi di variabel ‘rectTerakhir

        rectangle = QtCore.QRectF(self.awalX, self.awalY, endPoint.x()-self.awalX, endPoint.y()-self.awalY)  //inisialisasi posisi rectangle dengan ukuran dan lokasi sesuai drag and drop mouse
        poligon = QtGui.QPolygonF(rectangle)  //insisialisasi rectangle

        painter.drawPolyline(poligon)  //menggambar rectangle ke window

    def kirimArea(self):  //metode ‘kirimArea’
        if self.awalX > self.akhirX:   //mengecek posisi koordinat ‘X’ saat di klik lebih besar dari saat dilepas 
            if self.awalY > self.akhirY:   //mengecek posisi koordinat ‘Y’ saat di klik lebih besar dari saat dilepas 
                self.parent.tangkapArea(self.akhirX+1, self.akhirY+1, self.awalX - self.akhirX -1, self.awalY - self.akhirY-1)  //menjalankan metode (tangkapArea) di class parent (Screenshot) dengan memasukkan 4 parameter (yaitu lokasi saat di drag dan drop)
            else:   //Jiks koordinat ‘Y’ saat di klik tidak lebih besar dari saat dilepas 
                self.parent.tangkapArea(self.akhirX+1, self.awalY+1, self.awalX - self.akhirX-1, self.akhirY - self.awalY-1)  //menjalankan metode (tangkapArea) di class parent (Screenshot) dengan memasukkan 4 parameter (yaitu lokasi saat di drag dan drop)
        else:   //jika koordinat ‘X’ saat di klik tidak lebih besar dari saat dilepas 
            if self.awalY > self.akhirY:   //mengecek posisi koordinat ‘Y’ saat di klik lebih besar dari saat dilepas 
                self.parent.tangkapArea(self.awalX+1, self.akhirY+1, self.akhirX - self.awalX-1, self.awalY - self.akhirY-1)  //menjalankan metode (tangkapArea) di class parent (Screenshot) dengan memasukkan 4 parameter (yaitu lokasi saat di drag dan drop)
            else:   //jika koordinat ‘Y’ saat di klik tidak lebih besar dari saat dilepas 
                self.parent.tangkapArea(self.awalX+1, self.awalY+1, self.akhirX - self.awalX-1, self.akhirY - self.awalY-1)  //menjalankan metode (tangkapArea) di class parent (Screenshot) dengan memasukkan 4 parameter (yaitu lokasi saat di drag dan drop)

    def masukanGambar(self, gambar):  //metode ‘masukkanGambar’
        painter = QtGui.QPainter(self.image)  //insialisasi tempat gambar lagi
        painter.setPen(QtGui.QPen(self.myPenColor, self.myPenWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))  //insialisasi pensil dengan beberapa settingan

        screen = QtGui.QDesktopWidget().screenGeometry()  //mendapatkan ukuran layar PC
        Painter.drawPixmap(0, 0, gambar)  //memasukkan gambar ke window

class Screenshot(QtGui.QWidget):  //membuat class. Dengan mewarisi (inheritence) class ‘QWidget’
    def __init__(self):  //membuat construktor
        super(Screenshot, self).__init__()  //memanggil kelas parent

        self.buatTombol()  //menjalanka metode ‘buatTombol’
        self.tempatHasil = QtGui.QLabel()  //membuat label (tempatHasil) sebagai tempat gambar hasil screenshoot
        self.tempatHasil.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)  //membuat ukuran (tempatHasil) mengikuti besar foto
        self.tempatHasil.setAlignment(QtCore.Qt.AlignCenter)  //membuat tempat foto agar berada di tengah window

        self.mainLayout = QtGui.QVBoxLayout()  //membuat layout utama
        self.setScroll()  //menjalankanmetode ‘setScroll’
        self.mainLayout.addLayout(self.layoutTombol)  //digunaakan untuk memasukkan ‘layoutTombol’ ke layout utama (mainLayout)
        self.setLayout(self.mainLayout)  //memasukkan layout utama (mainLayout) ke dalam window

        self.jeda.setValue(1)  //mengubah nilai kolom (jeda) menjadi 1 sebagai nilai default
        self.sudahDisimpan = True  //inisialisasi variabel untuk memastikan hasil screenshoot telah di simpan. (True=sudah disimpan. False = Belum) nilai default true. Karena belum screenshoot

        self.setWindowTitle("Screenshos -> mn-belajarpython.blogspot.co.id")  //mengubah judul window
        self.resize(300, 30)  //mengubah ukuran window
        self.mainLayout.setContentsMargins(0, 0, 0, 0)  //menghilangkan margin window

    def setScroll(self):  //metode ‘setScroll’
        # mengatur scroll  //hanya komentar
        self.scrollArea = QtGui.QScrollArea()  //mendefinisikan area scroll
        self.scrollArea.setWidget(self.tempatHasil)  //memasukkan ‘tempatHasil’ sebagai tempat yang akan di scroll
        self.scrollArea.setBackgroundRole(QtGui.QPalette.Mid)  //menggubah warna background scroll
        self.scrollArea.setAlignment(QtCore.Qt.AlignCenter)  //agar ‘tempatHasil’ berada di tengah

        self.mainLayout.addWidget(self.scrollArea)  //memasukkan tempat scroll (scrollArea) ke dalam layout utama
        self.scrollArea.setMinimumSize(700, 400)  //minimal ukuran area scroll

        self.scrollArea.hide()  //menyembunyikan tempat scroll (scrollArea) karena belum di screenshoot

        screen = QtGui.QDesktopWidget().screenGeometry()  //mendapatkan ukuran layar PC
        size = self.geometry()  //mendpatkan ukuran window
        self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2)  //membuat window tampil ditengah layar PC saat pertama di jalankan

    def screenshootBaru(self):  //metode ‘screenshootBaru’
        if self.sembunyikan.isChecked():  //memastikan checkbox ‘sembunyikan’ tercentang
            self.hide()  //menyembunyikan window aplikasi (screenshoot) jika checkbox ‘sembunyi’ tercentang
        self.window.setDisabled(True)  //mematikan tombol ‘tangkap’ (penangkap layar) selama proses hitung mundur untuk memotret layar

        QtCore.QTimer.singleShot(self.jeda.value() * 1000, self.tangkapLayar)  //menjalankan metode ‘tangkapLayar’ setelah menghitung mundur sebanyak angka yang ada di kolom ‘jeda’
        self.sudahDisimpan = False  //mengubah nilai variabel ‘sudahDisimpan’ menjadi False setelah selesai screenshoot baru

    def saveScreenshot(self):  //metode ‘saveScreenshot’
        format = 'png'  //ekstensi pennyimpanan
        initialPath = QtCore.QDir.currentPath() + "/untitled." + format //inisialisasi lokasi penyimpanan hasil screenshoot (sesuai lokasi file python sebagai default)

        fileName,_ = QtGui.QFileDialog.getSaveFileName(self, "Save As",
                initialPath,
                "%s Files (*.%s);;All Files (*)" % (format.upper(), format))  //membuka file dialog pemlih folder tempat menyimpan foto
        if fileName:  //memastikan user memilih folder (tidak klik cancel)
            self.hasil.save(fileName, format)  //menyimpan file foto (screenshoot) di lokasi yang sudah di pilih 
            self.sudahDisimpan =False  //mengubah nilai ‘sudahDisimpan’ menjadi ‘False’ yang menandakan sudah disimpan

    def tangkapLayar(self):  //metode tangkap layar
        QtGui.qApp.beep()  //membunyikan bunyi (bell) default sistem operasi

        self.hasil = None  //mendefinisikan variabel ‘hasil’ sebagai penyimpan hasil tangkapan layar
        self.hasil = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId())  //mengambil gambar dari layar window PC
        self.salinan = self.hasil  //menyalin/menyimpan foto hasil screenshoot
        self.updateGambar()  //menjalankan metode ‘updateGambar’

        self.window.setDisabled(False)  //menghidupkan kembali tombol’tangkap’ karena proses screen telah selesai

        if self.sembunyikan.isChecked():  //memastikan checkbox ‘sembunyikan’ tercentang
            self.show()  //menampilkan window aplikasi (screenshoot) jika checkbox ‘sembunyi’ tercentang

        self.simpan.setEnabled(True)  //mengaktifkan tombol ‘simpan’ (setelah memotret layar)

    def updateCheckBox(self):  //metode ‘updateCheckBox’
        if self.jeda.value() == 0:  //mengecek apakah nilai combobox ‘jeda’ bernilai 0
            self.sembunyikan.setDisabled(True)  //mematikan checkbox ‘sembunyi’ jika kolom input ‘checkbox’ jeda bernilai 0
        else:  //jika kolom jeda tidak bernilai nol
            self.sembunyikan.setDisabled(False)  //menghidupkan checkbox ‘sebunyi’ jika kolom input ‘checkbox’ jeda TIDAK bernilai 0

    def buaPengaturan(self):  //metode ‘buatPengaturan’
        self.jeda = QtGui.QSpinBox()  //membuat kolom input jeda (harus angka)
        self.jeda.setSuffix("s")  //huruf tanda setelah inputan. Yang menandakan detik/second
        self.jeda.setMaximum(9)  //maksimal inputan kolom jeda sebesar 9
        self.jeda.setFixedSize(40,20)  //mengubah ukuran kolom input ‘jeda’
        self.jeda.valueChanged.connect(self.updateCheckBox) //menjalankan metode ‘updateCheckBox’ jika ada perubahan nilai di kolom input ‘jeda’

        self.jedaLabel = QtGui.QLabel("Tunda :")  //membuat label ‘tunda :’

        self.sembunyikan = QtGui.QCheckBox("Sembunyikan")  //menbuat checkbox “Sembunyikan”

        layoutPengaturan = QtGui.QHBoxLayout()  //membuat layout pengaturan
        layoutPengaturan.addWidget(self.jedaLabel)  //memasukkan label ‘Tunda :’ kedalam ‘layoutPengaturan’
        layoutPengaturan.addWidget(self.jeda)  //memasukkan kolom input jeda ke dalam ‘layoutPengaturan’
        layoutPengaturan.addWidget(self.sembunyikan)  //memasukkan checkbox ‘Sembunyikan” ke dalam layout Pengaturan
        self.layoutTombol.addLayout(layoutPengaturan)  //memasukkan ‘layoutPengaturan’ ke dalam ‘layoutTombol’

        self.sembunyikan.setChecked(True)  //membuat checkbox ‘sembunyikan’ tecentang (sebagai default saat pertama kali di jalankan)

    def buatTombol(self):  //metode ‘buatTombol’
        self.window = self.perintahTombol("Tangkap", self.screenshootBaru)  //digunakan untuk menjalankan metode ‘perintahTombol’ untuk membuat tombol parameter 1 sebagai nama dan parameter 2 sebagai perintah
        self.simpan = self.perintahTombol("Simpan",self.saveScreenshot)  //digunakan untuk menjalankan metode ‘perintahTombol’ untuk membuat tombol parameter 1 sebagai nama dan parameter 2 sebagai perintah
        self.pilih = self.perintahTombol("Potong", self.pilihSebagian)  //digunakan untuk menjalankan metode ‘perintahTombol’ untuk membuat tombol parameter 1 sebagai nama dan parameter 2 sebagai perintah

        self.layoutTombol = QtGui.QHBoxLayout()  //membuat layout tombol
        self.layoutTombol.addStretch()  //menambahkan stretch yang akan membesar/mengecil jika window di perbesar atau di perkecil
        self.layoutTombol.addWidget(self.window)  //memasukkan tombol di dalam variabel ‘window’
        self.layoutTombol.addWidget(self.pilih)  //memasukkan tombol pilih/potong ke ‘layoutTombol’
        self.layoutTombol.addWidget(self.simpan)  //memasukkan tombol ‘simpan’ ke dalam ‘layoutTombol’
        self.layoutTombol.setContentsMargins(4,0,4,4)  //mengatur margin layout tombol

        self.simpan.setEnabled(False)  //mematikan tombol ‘simpan’ sebagai default (karena belum memotret layar)
        self.pilih.setEnabled(False)  //mematikan tombol ‘Potong’ sebagai default saat baru di jalankan

    def perintahTombol(self, text, perintah):  //metode ‘perintahTombol’ (pembuat tombol)
        button = QtGui.QPushButton(text)  //membuat tombol dengan teks yang ada di variabel parameter (text)
        button.clicked.connect(perintah)  //menghubungkan tombol dengan perintah yang di masukkan di variabel parameter (perintah)
        button.setFixedSize(60, 20)  //mengubah ukuran tombol
        return button //mengembalikan tombol yang telah di buat

    def updateGambar(self):  //metode ‘updateGamber’
        self.tempatHasil.setMinimumSize(self.hasil.size())  //mengubah ukuran minimum ‘tempatHasil’ sesuai ukuran gambar
        self.tempatHasil.setPixmap(self.hasil)  //memasukkan gambar ke dalam ‘tempatHasil’
        self.scrollArea.show()  //menampilkan ‘scrollArea’ karena sudah melakukan screenshoot. Dimana sebelumnya telah di sembunyikan di awal
19
    def pilihSebagian(self):  //metode ‘pilihSebagian’
        self.showFullScreen()  //membuat tampilan aplikasi menjadi fullscreen
        self.tempatPilih = AreaKanvas(self, gambar=self.salinan)  //menjalankan class ‘AreaKanvas’ denga memasukkan gambar yang telah di screenshoot
        self.tempatPilih.show()  //menampilkan window class ‘AreKanvas’

    def tangkapArea(self, x, y, lebar, tinggi):  //metod ‘TangkapArea’
        QtGui.qApp.beep()  //membunyikan bell peringatan default os
        self.showNormal()  //menormalkan ukuran window

        self.hasil = QtGui.QPixmap.grabWindow(QtGui.QApplication.desktop().winId(), x, y, lebar, tinggi)  //melakukan screenshoot lagi sesuai ukuran yang telah di drag and drop user
        self.updateGambar()  //menjalankan metod ‘updateGambar’

    def keyPressEvent(self, keyevent):  //metode yang akan di jalankan ketikan user klik tombol pada keyboard atau mouse
        event = keyevent.key()  //menampung penekanan tombol pada keyboard
        if event == QtCore.Qt.Key_Escape:  //mengecek apakah yang di tekan adalah tmbol ‘esc’
            self.showNormal()  //menormalkan ukuran window jik tekan ‘esc’
            self.b.close()  //menutup window ‘PilihArea’
            self.show()  //menampilkan window (Screenshot)

    def closeEvent(self, a):  //metode yang akan di jalankan secara otomatis ketika aplikasi (screenshoot) ini di tutup
        if not self.sudahDisimpan :  //mengecek apakah hasil screenshoot belum disimpan (apkah bernilai False)
            tombol1 = QtGui.QMessageBox.StandardButton.Yes  //tombol yes
            tombol2 = QtGui.QMessageBox.StandardButton.No  //tombol no
            pertanyaan = "apakah anda ingin menyimpan hasil screenshoot nya ?"  //membuat teks pertanyaan
            response = QtGui.QMessageBox.question(self, "Konfirmasi", pertanyaan, tombol1, tombol2)  //menampilkan kotak konfirmasi dengan memasukkan 2 tombol di atas dan teks pertanyaan
            if response == QtGui.QMessageBox.Yes:  //memastikan user klik tombol ‘yes’
                self.saveScreenshot()  //menjalankan metode ‘saveScreenshoot’ jika user klik ‘yes’
        self.destroy()  //menghancurkan/menutup window aplikasi (screenshoot) ini

if __name__ == '__main__':  //code yang akan dijalankan pertama
    import sys  //mengimport class sys dari python
    app = QtGui.QApplication(sys.argv)  //mendefinisikan class ‘Qapplication’ dari PySide
    screenshot = Screenshot()  //menjalankan class ‘Screenshoot’
    screenshot.show()  //menampilkan window ‘Screenshoot’

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




Nah itu dia temen - temen penjelasan code programnya.. Mohon maaf apabila ada penjelasan yang kurang jelas, atau bahkan ada kekeliruan... Mohon kasi pembenaran atau pendapat kalian di kolom komentar ya... Biar kita bisa belajar bersama..

Oke terimakasih dan sampai di sini dulu ya... Jangan lupa untuk membaca versi yang lain... Biar ilmunya nambah.. Hehe.. Temikasih sekali lagi dan sekian...

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