Aplikasi Screenshoot PySide Python (versi 4)

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 untuk menyimpan foto hasil screenshoot yang kalian ambil..

Rincian Lengkap Screenshoot PySide Versi 4.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 4.0
Versi: 4.0 || selanjutnya.
Platform: Python 3.x  || Install.
Modul: PySide || Install.
Baris Code: +- 137 baris.
Penambahan: +-29 baris.
Terdiri dari: 1 class dan 10 metode.
Fitur: Menyimpan hasil screenshoot.
Kelemahan: Masih memotret keseluruhan window. (tidak seperti snipping tool di windows).
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 4.0

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


from PySide import QtCore, QtGui

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

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

    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.layoutTombol = QtGui.QHBoxLayout()
        self.layoutTombol.addStretch()
        self.layoutTombol.addWidget(self.window)
        self.layoutTombol.setContentsMargins(4,0,4,4)

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

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

    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

    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