Membuat Aplikasi mecari File PySide (versi 11)

BelajarPython - Assalamualaikum wr. wb.

Jumpa lagi temen - temen... Kali ini, saya akan mengajak kalian untuk membuat aplikasi yang cuku unik nih.. Karena saya akan membuat sebuah aplikasi yang belum umum keberadaannya.. Langsung saja kita simak ya....

Pengenalan aplikasi yang akan kita buat.

Aplikasi yang akan kita buat kali ini adalah aplikasi pencari file.. Kalian mungkin belum pernah melihat aplikasi seperti ini.. Karena fungsi ini sudah ada di file browser.. Tapi saya membuat fungsi tersebut menjadi aplikasi mandiri...

Namun, Aplikasi ini saya posting dengan berbagai versi.. Dengan penambahan fitur di tiap versinya.. Jika kalian ingin melihat versi - versi aplikasi ini, KALIAN BISA KLIK DISINI...

Ini adalah postingan versi ke 11. Dimana pada versi ini saya menambahkan fitur untuk lokasi file di file explorer/file browser. Serta menambahkan tombol untuk membuka file.

Rincian Lengkap Pencari File PySide Versi 11.0

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

Nama: mn-FileFind 11.0
Versi: 11.0 || selanjutnya.
Platform: Python 3.x  || Install.
Modul: PySide || Install.
Baris Code: +- 601 baris.
Penambahan: +- 47 baris.
Terdiri dari: 1 class dan 30 metode.
Fitur: membuka lokasi file di file browser dan tombol buka.
Kelemahan: Mungkin saja ada error/bug.
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 Pencari file versi 11.0

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


from PySide import QtCore, QtGui
import sys, os, subprocess

class Window(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.setWindowTitle("Pecari File -> mn-belajarpython.blogspot.co.id")
        self.resize(700, 500)
        self.initUi()

    def initUi(self):
        self.buatTombol()
        self.buatTabel()
        self.buatCombobox()
        self.buatLabel()
        self.aturKomponen()
        self.setStatus(0)

    def buatTombol(self):
        self.browseButton = self.perintahTombol("&...", self.tentukanFolder)
        self.findButton = self.perintahTombol("&Find", self.cariFile)
        self.tombolDiakses = self.perintahTombol("&...", self.pilihTanggalAkses)
        self.tombolDibuat = self.perintahTombol("&...", self.pilihTanggalBuat)
        self.buka = self.perintahTombol("&Buka", self.perintahBuka)
        self.tombolLokasi = self.perintahTombol("&Lokasi", self.bukaLokasi)

        self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")
        self.tombolLokasi.setEnabled(False)
        self.buka.setEnabled(False)

        self.browseButton.setFixedSize(30, 20)
        self.tombolDibuat.setFixedSize(30, 20)
        self.tombolDiakses.setFixedSize(30, 20)

    def buatCombobox(self):
        self.lokasi = self.perintahComboBox(QtCore.QDir.currentPath())
        self.nama = self.perintahComboBox("mn-belajarpython.co.id")

        self.tipe = QtGui.QComboBox()
        self.tipe.addItems(['jpg', 'png', 'txt', 'doc', 'docx', 'mp3', 'mp4', 'avi'])
        self.tipe.setEditable(True)

        self.ukuranAwal = self.perintahComboBox('0')
        self.ukuranAwal.setFixedSize(QtCore.QSize(110, 28))
        self.ukuranAkhir = self.perintahComboBox('12000')
        self.ukuranAkhir.setFixedSize(QtCore.QSize(111, 28))

        self.jenisUkuran = QtGui.QComboBox()
        self.jenisUkuran.addItems(['B', 'KB', 'MB', 'GB'])
        self.jenisUkuran.setFixedSize(40, 20)
        self.jenisUkuran.setFrame(False)

        tglSkrg = QtCore.QDateTime.currentDateTime()
        tgl = QtCore.QDate(int(tglSkrg.toString('yyyy')), int(tglSkrg.toString('m')), int(tglSkrg.toString('d')))

        self.dibuatAwal = QtGui.QDateEdit()
        self.dibuatAkhir = QtGui.QDateEdit()
        self.dibuatAwal.setDate(tgl)
        self.dibuatAkhir.setDate(tgl)

        self.diaksesAwal = QtGui.QDateEdit()
        self.diaksesAkhir = QtGui.QDateEdit()
        self.diaksesAwal.setDate(tgl)
        self.diaksesAkhir.setDate(tgl)

        self.berisi = self.perintahComboBox("mn-belajarpython.co.id")

    def buatLabel(self):
        self.teksLokasi = QtGui.QLabel("       Lokasi           :")
        self.teksNama = QtGui.QCheckBox("Nama            :")
        self.teksNama.stateChanged.connect(self.setStatus)
        self.teksTipe = QtGui.QCheckBox("Tipe              : ")
        self.teksTipe.stateChanged.connect(self.setStatus)
        self.teksUkuran = QtGui.QCheckBox("Ukuran         :")
        self.teksUkuran.stateChanged.connect(self.setStatus)
        self.teksDibuat = QtGui.QCheckBox('Dibuat          :')
        self.teksDibuat.stateChanged.connect(self.setStatus)
        self.teksDiakses = QtGui.QCheckBox('Diakses        :')
        self.teksDiakses.stateChanged.connect(self.setStatus)
        self.teksBerisi = QtGui.QCheckBox("Berisi Teks   :")
        self.teksBerisi.stateChanged.connect(self.setStatus)
        self.teksInfo = QtGui.QLabel("Selamat Datang di Pencari File :) ")
        self.teksSampaiBuat = QtGui.QLabel("sampai")
        self.teksSampaiAkses = QtGui.QLabel("sampai")
        self.teksSampaiUkuran = QtGui.QLabel("sampai")

    def aturKomponen(self):
        buttonsLayout = QtGui.QHBoxLayout()
        buttonsLayout.addStretch()
        buttonsLayout.addWidget(self.findButton)
        buttonsLayout.addWidget(self.buka)
        buttonsLayout.addWidget(self.tombolLokasi)

        layoutTipe = QtGui.QHBoxLayout()
        layoutTipe.addWidget(self.tipe)
        layoutTipe.addStretch()

        layoutUkuran = QtGui.QHBoxLayout()
        layoutUkuran.addWidget(self.ukuranAwal)
        layoutUkuran.addWidget(self.teksSampaiUkuran)
        layoutUkuran.addWidget(self.ukuranAkhir)
        layoutUkuran.addWidget(self.jenisUkuran)
        layoutUkuran.addStretch()

        layoutTglBuat = QtGui.QHBoxLayout()
        layoutTglBuat.addWidget(self.dibuatAwal)
        layoutTglBuat.addWidget(self.teksSampaiBuat)
        layoutTglBuat.addWidget(self.dibuatAkhir)
        layoutTglBuat.addWidget(self.tombolDibuat)
        layoutTglBuat.addStretch()

        layoutTglAkses = QtGui.QHBoxLayout()
        layoutTglAkses.addWidget(self.diaksesAwal)
        layoutTglAkses.addWidget(self.teksSampaiAkses)
        layoutTglAkses.addWidget(self.diaksesAkhir)
        layoutTglAkses.addWidget(self.tombolDiakses)
        layoutTglAkses.addStretch()

        widgetTengah = QtGui.QWidget()
        mainLayout = QtGui.QGridLayout(widgetTengah)
        mainLayout.setColumnStretch(1,6)
        mainLayout.setRowStretch(7, 0)
        mainLayout.addWidget(self.teksLokasi, 0, 0)
        mainLayout.addWidget(self.lokasi, 0, 1, 1, 3)
        mainLayout.addWidget(self.browseButton, 0, 4)
        mainLayout.addWidget(self.teksNama, 1, 0)
        mainLayout.addWidget(self.nama, 1, 1, 1, 4)
        mainLayout.addWidget(self.teksTipe, 2, 0)

        mainLayout.addLayout(layoutTipe, 2, 1, 1, 4)

        mainLayout.addWidget(self.teksUkuran, 3, 0)
        mainLayout.addLayout(layoutUkuran, 3, 1, 1, 4)

        mainLayout.addWidget(self.teksDiakses, 4, 0)
        mainLayout.addLayout(layoutTglAkses, 4, 1, 1, 4)

        mainLayout.addWidget(self.teksDibuat, 5, 0)
        mainLayout.addLayout(layoutTglBuat, 5, 1, 1, 4)

        mainLayout.addWidget(self.teksBerisi, 6, 0)
        mainLayout.addWidget(self.berisi, 6, 1, 1, 4)
        mainLayout.addWidget(self.filesTable, 7, 0, 2, 5)
        mainLayout.addWidget(self.teksInfo, 10, 0, 1 ,2)
        mainLayout.addLayout(buttonsLayout, 10, 0, 1, 5)
        mainLayout.setContentsMargins(4,5,4,2)
        self.setCentralWidget(widgetTengah)

    def tentukanFolder(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Find Files",
                QtCore.QDir.currentPath())

        if directory:
            if self.lokasi.findText(directory) == -1:
                self.lokasi.addItem(directory)

            self.lokasi.setCurrentIndex(self.lokasi.findText(directory))
            self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")

    @staticmethod
    def updateComboBox(comboBox):
        if comboBox.findText(comboBox.currentText()) == -1:
            comboBox.addItem(comboBox.currentText())

    def cariFile(self):
        self.filesTable.setRowCount(0)
        cek = self.cekKelenkapan()
        if cek == True :
            path = self.lokasi.currentText()
            file = self.dapatkanSemuaFile(path)

            self.updateComboBox(self.lokasi)
            self.updateComboBox(self.nama)
            self.updateComboBox(self.tipe)
            self.updateComboBox(self.ukuranAwal)
            self.updateComboBox(self.ukuranAkhir)
            self.updateComboBox(self.berisi)

            self.tampilkanFIle(file)
            self.findButton.setStyleSheet("background-color: green; font-weight:bold; color:white;")
        else:
            self.teksInfo.setText(cek)

    def tampilkanFIle(self, files):
        for i in range(len(files)) :
            file = QtCore.QFile(files[i][5])
            size = QtCore.QFileInfo(files[i][5]).size()

            itemNo = QtGui.QTableWidgetItem(str(i+1)+'.')
            itemNo.setFlags(itemNo.flags() ^ QtCore.Qt.ItemIsEditable)

            fileNameItem = QtGui.QTableWidgetItem(self.penampungHasil[i][0])
            fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable)

            tipe = QtGui.QTableWidgetItem('.'+self.penampungHasil[i][1])
            tipe.setFlags(tipe.flags() ^ QtCore.Qt.ItemIsEditable)

            sizeItem = QtGui.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))
            sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter)
            sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable)

            akses = QtGui.QTableWidgetItem(self.penampungHasil[i][3].toString('d-M-yyyy'))
            akses.setFlags(akses.flags() ^ QtCore.Qt.ItemIsEditable)

            modif = QtGui.QTableWidgetItem(self.penampungHasil[i][4].toString('d-M-yyyy'))
            modif.setFlags(modif.flags() ^ QtCore.Qt.ItemIsEditable)

            lokasi = QtGui.QTableWidgetItem(self.penampungHasil[i][5])
            lokasi.setFlags(lokasi.flags() ^ QtCore.Qt.ItemIsEditable)

            row = self.filesTable.rowCount()
            self.filesTable.insertRow(row)
            self.filesTable.setItem(row, 0, itemNo)
            self.filesTable.setItem(row, 1, fileNameItem)
            self.filesTable.setItem(row, 2, tipe)
            self.filesTable.setItem(row, 3, sizeItem)
            self.filesTable.setItem(row, 4, akses)
            self.filesTable.setItem(row, 5, modif)
            self.filesTable.setItem(row, 6, lokasi)

        self.teksInfo.setText("%d file(s) found (Double click on a file to open it)" % len(files))

    def perintahTombol(self, text, member):
        button = QtGui.QPushButton(text)
        button.clicked.connect(member)
        return button

    def perintahComboBox(self, text=""):
        comboBox = QtGui.QComboBox()
        comboBox.setEditable(True)
        comboBox.addItem(text)
        comboBox.setSizePolicy(QtGui.QSizePolicy.Expanding,
                QtGui.QSizePolicy.Preferred)
        comboBox.editTextChanged.connect(self.ubahWarna)
        return comboBox

    def ubahWarna(self):
        self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")

    def buatTabel(self):
        self.filesTable = QtGui.QTableWidget(0, 7)
        self.filesTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.filesTable.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)

        self.filesTable.setHorizontalHeaderLabels(("No.", "Nama", "Tipe", "Ukuran", "Akses", "Dibuat", "Lokasi"))
        self.filesTable.horizontalHeader().setResizeMode(6, QtGui.QHeaderView.Stretch)
        self.filesTable.verticalHeader().hide()
        self.filesTable.setShowGrid(False)

        self.filesTable.setColumnWidth(0, 40)
        self.filesTable.setColumnWidth(2, 50)
        self.filesTable.setColumnWidth(3, 60)
        self.filesTable.setColumnWidth(4, 80)
        self.filesTable.setColumnWidth(5, 80)

        self.connect(self.filesTable, QtCore.SIGNAL('cellDoubleClicked(int, int)'),self.bukaFIle)
        self.connect(self.filesTable, QtCore.SIGNAL('itemSelectionChanged()'),self.pengaktifTombol)

    def pengaktifTombol(self):
        if len(self.filesTable.selectedItems()):
            self.buka.setEnabled(True)
            self.tombolLokasi.setEnabled(True)
            self.pilihan = self.filesTable.selectedItems()[0].row()
        else:
            self.buka.setEnabled(False)
            self.tombolLokasi.setEnabled(False)

    def perintahBuka(self):
        self.bukaFIle(self.pilihan, 0)

    def bukaLokasi(self):
        item = self.penampungHasil[self.pilihan][5]
        print(item)
        lokasi = os.path.dirname(item)
        if sys.platform == 'win32':
            item=item.replace('/','\\')
            subprocess.Popen(r'explorer /select,%s' %item)
        elif sys.platform == 'darwin':
            subprocess.Popen(['open', lokasi])
        else:
            try:
                os.system('xdg-open "%s"' %lokasi)
            except :
                QtGui.QMessageBox.critical(self, "ERROR",
                                                    "Maaf tidak bisa membuka lokasi file",
                                           QtGui.QMessageBox.Ok)

    def bukaFIle(self, row, column):
        item = self.penampungHasil[row][2]
        if sys.platform == 'win32':
            os.startfile('file://'+item)
        elif sys.platform == 'darwin':
            subprocess.Popen(['open', item])
        else:
            try:
                os.system('xdg-open "%s"' %item)
            except :
                QtGui.QMessageBox.critical(self, "ERROR",
                                                    "Maaf file tidak bisa di buka",
                                           QtGui.QMessageBox.Ok)

    def dapatkanSemuaFile(self, folderInti):
        cari = [folderInti]
        self.penampungHasil = []
        penampungFolder = []

        while len(cari) :
            for i in cari :
                files = QtCore.QDir(i).entryList(QtCore.QDir.Files | QtCore.QDir.NoSymLinks)
                folder = QtCore.QDir(i).entryList(QtCore.QDir.Dirs | QtCore.QDir.NoDotAndDotDot)
                path = QtCore.QDir(i).absolutePath()
                if files :
                    for i in files :
                        cek = self.cekKecocokan(path+'/'+i)
                        if cek :
                            file = cek
                            nama = file.baseName()
                            tipe = file.suffix()
                            ukuran = file.size()
                            akses = file.lastRead()
                            modif = file.lastModified()
                            lokasi = path+'/'+i

                            self.penampungHasil.append([nama, tipe, ukuran, akses, modif, lokasi])

                if folder :
                    for i in folder:
                        print(i)
                        penampungFolder.append(path+'/'+i)
                    print('==========')
            cari = penampungFolder
            penampungFolder = []
        return self.penampungHasil

    def setStatus(self, status):
        self.nama.setEnabled(self.teksNama.isChecked())
        self.tipe.setEnabled(self.teksTipe.isChecked())

        self.ukuranAwal.setEnabled(self.teksUkuran.isChecked())
        self.ukuranAkhir.setEnabled(self.teksUkuran.isChecked())

        self.diaksesAwal.setEnabled(self.teksDiakses.isChecked())
        self.diaksesAkhir.setEnabled(self.teksDiakses.isChecked())
        self.tombolDiakses.setEnabled(self.teksDiakses.isChecked())

        self.dibuatAwal.setEnabled(self.teksDibuat.isChecked())
        self.dibuatAkhir.setEnabled(self.teksDibuat.isChecked())
        self.tombolDibuat.setEnabled(self.teksDibuat.isChecked())

        self.berisi.setEnabled(self.teksBerisi.isChecked())

    def cekKecocokan(self, file):
        path = file
        file = QtCore.QFileInfo(file)

        if self.teksNama.isChecked() :
            if not self.nama.currentText().lower() in file.baseName().lower():
                file = None
        if self.teksTipe.isChecked() and file :
            if not  self.tipe.currentText().lower() in file.suffix().lower():
                file = None
        if self.teksUkuran.isChecked() and file :
            ukuran = file.size()
            ukuranCariAkhir = int(self.ukuranAkhir.currentText())
            ukuranCariAwal = int(self.ukuranAwal.currentText())

            if self.jenisUkuran.currentText()=='KB' :
                ukuranCariAwal *= 1000
                ukuranCariAkhir *= 1000
            elif self.jenisUkuran.currentText()=='MB' :
                ukuranCariAwal *= 1000000
                ukuranCariAkhir *= 1000000
            elif self.jenisUkuran.currentText()=='GB' :
                ukuranCariAwal *= 1000000
                ukuranCariAkhir *= 1000000

            if ukuran < ukuranCariAwal or ukuran > ukuranCariAkhir :
                file = None

        if self.teksDiakses.isChecked() and file :
            tahunAwal = int(self.diaksesAwal.date().toString('yy'))
            bulanAwal = int(self.diaksesAwal.date().toString('M'))
            hariAwal = int(self.diaksesAwal.date().toString('d'))

            tahunAkhir = int(self.diaksesAkhir.date().toString('yy'))
            bulanAkhir = int(self.diaksesAkhir.date().toString('M'))
            hariAkhir = int(self.diaksesAkhir.date().toString('d'))

            tahunFile = int(file.lastModified().toString('yy'))
            bulanFile = int(file.lastModified().toString('M'))
            hariFile = int(file.lastModified().toString('d'))

            if tahunFile < tahunAwal or tahunFile > tahunAkhir :
                file = None
            else:
                if bulanFile < bulanAwal or bulanFile > bulanAkhir :
                    file = None
                else :
                    if hariFile < hariAwal or hariFile > hariAkhir :
                        file = None

        if self.teksDibuat.isChecked() and file :
            tahunAwal = int(self.dibuatAwal.date().toString('yy'))
            bulanAwal = int(self.dibuatAwal.date().toString('M'))
            hariAwal = int(self.dibuatAwal.date().toString('d'))

            tahunAkhir = int(self.dibuatAkhir.date().toString('yy'))
            bulanAkhir = int(self.dibuatAkhir.date().toString('M'))
            hariAkhir = int(self.dibuatAkhir.date().toString('d'))

            tahunFile = int(file.lastRead().toString('yy'))
            bulanFile = int(file.lastRead().toString('M'))
            hariFile = int(file.lastRead().toString('d'))

            if tahunFile < tahunAwal or tahunFile > tahunAkhir:
                file = None
            else:
                if bulanFile < bulanAwal or bulanFile > bulanAkhir:
                    file = None
                else:
                    if hariFile < hariAwal or hariFile > hariAkhir:
                        file = None

        if self.teksBerisi.isChecked() and file :
            teks = self.berisi.currentText()
            adaAtauTidak = True
            fileCek = QtCore.QFile(path)
            if fileCek.open(QtCore.QIODevice.ReadOnly):
                stream = QtCore.QTextStream(fileCek)
                while not stream.atEnd():
                    try:
                        line = stream.readLine()
                        if teks in line:
                            adaAtauTidak = False
                            break
                    except:
                        pass
            if adaAtauTidak :
                file = None

        return file

    def pilihTanggalAkses(self):
        self.windowTanggalAkses = QtGui.QDialog(self)
        mainLayout = QtGui.QVBoxLayout()
        layoutTanggal = QtGui.QHBoxLayout()
        layoutTombol = QtGui.QHBoxLayout()

        self.tanggalAksesAwal = QtGui.QCalendarWidget()
        self.tanggalAksesAwal.selectionChanged.connect(self.tanggalAksesBerubahAwal)
        layoutTanggal.addWidget(self.tanggalAksesAwal)

        teksSampai = QtGui.QLabel("sampai")
        layoutTanggal.addWidget(teksSampai)

        self.tanggalAksesAkhir = QtGui.QCalendarWidget()
        self.tanggalAksesAkhir.selectionChanged.connect(self.tanggalAksesBerubahAkhir)
        self.tanggalAksesAkhir.setMinimumDate(self.tanggalAksesAwal.selectedDate())
        layoutTanggal.addWidget(self.tanggalAksesAkhir)

        self.teksInfo1Akses = QtGui.QLabel(self.tanggalAksesAwal.selectedDate().toString("dd - MMMM - yyyy"))
        tombol = QtGui.QPushButton("Selesai")
        tombol.clicked.connect(self.tanggalAkses)
        self.teksInfo2Akses = QtGui.QLabel(self.tanggalAksesAkhir.selectedDate().toString("dd - MMMM - yyyy"))

        layoutTombol.addStretch()
        layoutTombol.addWidget(self.teksInfo1Akses)
        layoutTombol.addStretch()
        layoutTombol.addWidget(tombol)
        layoutTombol.addStretch()
        layoutTombol.addWidget(self.teksInfo2Akses)
        layoutTombol.addStretch()

        mainLayout.addLayout(layoutTanggal)
        mainLayout.addLayout(layoutTombol)
        self.windowTanggalAkses.setLayout(mainLayout)
        self.windowTanggalAkses.show()

    def tanggalAkses(self):
        self.diaksesAwal.setDate(self.tanggalAksesAwal.selectedDate())
        self.diaksesAkhir.setDate(self.tanggalAksesAkhir.selectedDate())
        self.windowTanggalAkses.close()

    def tanggalAksesBerubahAwal(self):
        self.teksInfo1Akses.setText(self.tanggalAksesAwal.selectedDate().toString("dd - MMMM - yyyy"))
        self.tanggalAksesAkhir.setMinimumDate(self.tanggalAksesAwal.selectedDate())

    def tanggalAksesBerubahAkhir(self):
        self.teksInfo2Akses.setText(self.tanggalAksesAkhir.selectedDate().toString("dd - MMMM - yyyy"))

    def pilihTanggalBuat(self):
        self.windowTanggalBuat = QtGui.QDialog(self)
        mainLayout = QtGui.QVBoxLayout()
        layoutTanggal = QtGui.QHBoxLayout()
        layoutTombol = QtGui.QHBoxLayout()

        self.tanggalBuatAwal = QtGui.QCalendarWidget()
        self.tanggalBuatAwal.selectionChanged.connect(self.tanggalBuatBerubahAwal)
        layoutTanggal.addWidget(self.tanggalBuatAwal)

        teksSampai = QtGui.QLabel("sampai")
        layoutTanggal.addWidget(teksSampai)

        self.tanggalBuatAkhir = QtGui.QCalendarWidget()
        self.tanggalBuatAkhir.selectionChanged.connect(self.tanggalBuatBerubahAkhir)
        self.tanggalBuatAkhir.setMinimumDate(self.tanggalBuatAwal.selectedDate())
        layoutTanggal.addWidget(self.tanggalBuatAkhir)

        self.teksInfo1Buat = QtGui.QLabel(self.tanggalBuatAwal.selectedDate().toString("dd - MMMM - yyyy"))
        tombol = QtGui.QPushButton("Selesai")
        tombol.clicked.connect(self.tanggalBuat)
        self.teksInfo2Buat = QtGui.QLabel(self.tanggalBuatAkhir.selectedDate().toString("dd - MMMM - yyyy"))

        layoutTombol.addStretch()
        layoutTombol.addWidget(self.teksInfo1Buat)
        layoutTombol.addStretch()
        layoutTombol.addWidget(tombol)
        layoutTombol.addStretch()
        layoutTombol.addWidget(self.teksInfo2Buat)
        layoutTombol.addStretch()

        mainLayout.addLayout(layoutTanggal)
        mainLayout.addLayout(layoutTombol)
        self.windowTanggalBuat.setLayout(mainLayout)
        self.windowTanggalBuat.show()

    def tanggalBuat(self):
        self.dibuatAwal.setDate(self.tanggalBuatAwal.selectedDate())
        self.dibuatAkhir.setDate(self.tanggalBuatAkhir.selectedDate())
        self.windowTanggalBuat.close()

    def tanggalBuatBerubahAwal(self):
        self.teksInfo1Buat.setText(self.tanggalBuatAwal.selectedDate().toString("dd - MMMM - yyyy"))
        self.tanggalBuatAkhir.setMinimumDate(self.tanggalBuatAwal.selectedDate())

    def tanggalBuatBerubahAkhir(self):
        self.teksInfo2Buat.setText(self.tanggalBuatAkhir.selectedDate().toString("dd - MMMM - yyyy"))

    def cekKelenkapan(self):
        status = True

        if QtCore.QDir(self.lokasi.currentText()).exists() == False :
            status = "Kolom Lokasi folder yang anda masukkan tidak valid/Kosong."

        if (status==True):
            if self.teksTipe.isChecked() and (self.tipe.currentText() == '' or self.tipe.currentText() == ' ' or self.tipe.currentText() == '  '):
                status = "Kolom tipe tidak boleh tanda spasi saja."

        if (status == True):
            try:
                if self.teksUkuran.isChecked() and int(self.ukuranAwal.currentText()) > int(self.ukuranAkhir.currentText()) :
                    status = "Kolom ukuran pertama harus lebih kecil dari kolom ukuran yang kedua."
            except:
                status = "Error !!  Ukuran harus berupa angka."

        if (status == True):
            if self.teksDiakses.isChecked() :
                tahunAwal = int(self.diaksesAwal.date().toString('yy'))
                bulanAwal = int(self.diaksesAwal.date().toString('M'))
                hariAwal = int(self.diaksesAwal.date().toString('d'))
                tahunAkhir = int(self.diaksesAkhir.date().toString('yy'))
                bulanAkhir = int(self.diaksesAkhir.date().toString('M'))
                hariAkhir = int(self.diaksesAkhir.date().toString('d'))

                if tahunAwal > tahunAkhir :
                    status = "Tahun akses awal tidak boleh lebih besar dari tahun akses akhir"
                elif tahunAwal == tahunAkhir:
                    if bulanAwal > bulanAkhir :
                        status = "Bulan akses awal tidak boleh lebih besar dari tahun akses akhir"
                    elif bulanAwal == bulanAkhir:
                        if hariAwal > hariAkhir :
                            status = "Hari akses awal tidak boleh lebih besar dari tahun akses akhir"
        if (status == True):
            if self.teksDibuat.isChecked() :
                tahunAwal = int(self.dibuatAwal.date().toString('yy'))
                bulanAwal = int(self.dibuatAwal.date().toString('M'))
                hariAwal = int(self.dibuatAwal.date().toString('d'))

                tahunAkhir = int(self.dibuatAkhir.date().toString('yy'))
                bulanAkhir = int(self.dibuatAkhir.date().toString('M'))
                hariAkhir = int(self.dibuatAkhir.date().toString('d'))
                if tahunAwal > tahunAkhir:
                    status = "Tahun buat awal tidak boleh lebih besar dari tahun akses akhir"
                elif tahunAwal == tahunAkhir:
                    if bulanAwal > bulanAkhir:
                        status = "Bulan buat awal tidak boleh lebih besar dari tahun akses akhir"
                    elif bulanAwal == bulanAkhir:
                        if hariAwal > hariAkhir:
                            status = "Hari buat awal tidak boleh lebih besar dari tahun akses akhir"
        if(status==True):
            if self.teksBerisi.isChecked() and self.berisi.currentText() == '' :
                status = "Kolom 'Berisi teks' tidak boleh kosong"

        return status

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.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 Pembuka Foto PySide versi 11.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  //import class QtCore dan QtGui
import sys, os, subprocess  //import class sys, os, dan subprocess

class Window(QtGui.QMainWindow):  //membuat class ‘window’ dengan menurunkan class ‘QmainWindow’
    def __init__(self, parent=None):  //membuat construktor class ‘Window’
        super(Window, self).__init__(parent)  //menjalankan construktor class parent (QMainWindow)

        self.setWindowTitle("Pecari File -> mn-belajarpython.blogspot.co.id")  //mengubah judul
        self.resize(700, 500)  //mengubah ukuran window
        self.initUi()  //menjalankan metode ‘initUi’

    def initUi(self):  //metode ‘initUi’
        self.buatTombol()  //menjalankan metode ‘buatTombol’
        self.buatTabel()  //menjalankan metode ‘buatTabel’
        self.buatCombobox()  //menjalankan metode ‘buatCombobox’
        self.buatLabel()  //menjalankan metode ‘buatLabel’
        self.aturKomponen()  //menjalankan metode ‘aturKomponen’
        self.setStatus(0)  //menjalankan metode ‘setStatus’

    def buatTombol(self):  //metode ‘buatTombol’
        self.browseButton = self.perintahTombol("&...", self.tentukanFolder)  //membuat perintah pencari folder. Yang akan menjalankan metode ‘tentukanFolder’ jika diklik
        self.findButton = self.perintahTombol("&Find", self.cariFile)  //membuat perintah ‘Find’ dan menjalankan ‘cariFile’ jika di klik
        self.tombolDiakses = self.perintahTombol("&...", self.pilihTanggalAkses)  //membuat tombol untuk menampilkan window pemilih tanggal
        self.tombolDibuat = self.perintahTombol("&...", self.pilihTanggalBuat)  //membuat tombol pemilih tanggal dibuat. Yang akan menjalankan metode ‘pilihTanggalBuat’
        self.buka = self.perintahTombol("&Buka", self.perintahBuka)  //membuat tombol ‘buka’ dan menjalankan metode ‘perintahBuka’ ketika di klik
        self.tombolLokasi = self.perintahTombol("&Lokasi", self.bukaLokasi)  //membuat tombol ‘tombolLokasi’ dan menjalankan metode ‘bukaLokasi’ ketika di klik

        self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")  //mengubah warna tombol (kuning) dan teks (hitam)
        self.tombolLokasi.setEnabled(False)  //mematikan tombol lokasi
        self.buka.setEnabled(False)  //mematikan tombol ‘buka’

        self.browseButton.setFixedSize(30, 20)  //mengubah ukuran tombol ‘browseButton’ (pemilih folder)
        self.tombolDiakses.setFixedSize(30, 20)  //mengubah ukuran tombol
        self.tombolDiakses.setFixedSize(30, 20)  //mengubah ukuran tombol untuk memilih tanggal di buat

    def buatCombobox(self):  //metode ‘buatCombobox’
        self.lokasi = self.perintahComboBox(QtCore.QDir.currentPath())  //menjalankan metode ‘perintahComboBox’
        self.nama = self.perintahComboBox("mn-belajarpython.co.id")  //membuat kolom teks nama

        self.tipe = QtGui.QComboBox()  //membuat comboBox
        self.tipe.addItems(['jpg', 'png', 'txt', 'doc', 'docx', 'mp3', 'mp4', 'avi'])  //menambah item comboBox ‘tipe’
        self.tipe.setEditable(True)  //mebuat combobox bisa di edit

        self.ukuranAwal = self.perintahComboBox('0')  //membuat combobox. Dengan nilai awal 0
        self.ukuranAwal.setFixedSize(QtCore.QSize(110, 28))  //mengubah ukuran combobox
        self.ukuranAkhir = self.perintahComboBox('12000')  //membuat cobobox ukuran akhir. Dengan nilai awal `12000’
        self.ukuranAkhir.setFixedSize(QtCore.QSize(111, 28))  //mengubah ukuran combobox ukuran akhir

        self.jenisUkuran = QtGui.QComboBox()  //membuat combobox
        self.jenisUkuran.addItems(['B', 'KB', 'MB', 'GB'])  //menambahkan item combobox
        self.jenisUkuran.setFixedSize(40, 20)  //mengubah ukuran combobox
        self.jenisUkuran.setFrame(False)  //menghilangkan frame combobox

        tglSkrg = QtCore.QDateTime.currentDateTime()  //mendapatkan tgl sekarang
        tgl = QtCore.QDate(int(tglSkrg.toString('yyyy')), int(tglSkrg.toString('M')), int(tglSkrg.toString('d')))  //mengubah format tanggal sekarang

        self.dibuatAwal = QtGui.QDateEdit()  //membuat kolom input tanggal buat 1. (Awal)
        self.dibuatAkhir = QtGui.QDateEdit()  //membuat kolom input tanggal buat 2. (Akhir)
        self.dibuatAwal.setDate(tgl)  //memasukkan nilai tanggal sekarnga pada kolom input tanggal 1 (awal)
        self.dibuatAkhir.setDate(tgl)  //memasukkan nilai tanggal sekarnga pada kolom input tanggal 2 (akhir)

        self.diaksesAwal = QtGui.QDateEdit()  //membuat kolom dare/tanggal
        self.diaksesAkhir = QtGui.QDateEdit()  //membuat kolom dare/tanggal
        self.diaksesAwal.setDate(tgl)  //mengubah isian menjadi tanggal hari ini
        self.diaksesAkhir.setDate(tgl)  //mengubah isian menjadi tanggal hari ini

        self.berisi = self.perintahComboBox("mn-belajarpython.co.id")  //membuat combobox ‘isi’ yang bisa di edit untuk mencari isi file

    def buatLabel(self):  //metode ‘buatLabel’
        self.teksLokasi = QtGui.QLabel("       Lokasi           :")  //membuat label ‘Lokasi’
        self.teksNama = QtGui.QCheckBox("Nama            :")  //membuat checkbox (teks nama)
        self.teksNama.stateChanged.connect(self.setStatus)  //menghubungkan checkbox ‘teksNama’ untuk menjalankan metode ‘setStatus’ ketika di centang maupun tidak
        self.teksTipe = QtGui.QCheckBox("Tipe              : ")  //membuat checkbox ‘tipe’
        self.teksTipe.stateChanged.connect(self.setStatus)  //menjalankan metode ‘setStatus’ ketika checkBox ‘teksTIpe’ (tipe) di centang atau tidak
        self.teksUkuran = QtGui.QCheckBox("Ukuran         :")  //membuat checkbox ukuran
        self.teksUkuran.stateChanged.connect(self.setStatus)  //menjalankan metode ‘setStatus’ jika ada perubahan
        self.teksDibuat = QtGui.QCheckBox('Dibuat          :')  //membuat checkbox tanggal dibuat file
        self.teksDibuat.stateChanged.connect(self.setStatus)  //menjalankanmetode ‘setStatus’ jika ada perubahan pada checkbox penyaring tanggal dibuat
        self.teksDiakses = QtGui.QCheckBox('Diakses        :')  //membuat chekbox tanggal di akses
        self.teksDiakses.stateChanged.connect(self.setStatus)  //menjalankan metode ‘setStatus’ jika ada perubahan
        self.teksBerisi = QtGui.QCheckBox("Berisi Teks   :")  //membuat checkbox ‘isi’ (Berisi Teks) untuk menghidupkan/mematikan checkbox isi
        self.teksBerisi.stateChanged.connect(self.setStatus)  //menjalankan metode ‘setStatus’ jika checkbox (Berisi Teks) di klik
        self.teksInfo = QtGui.QLabel()  //membuat label dengan teks koson
g
        self.teksSampaiUkuran = QtGui.QLabel("sampai")  //membuat labe(teks)l sampai
        self.teksSampaiUkuran = QtGui.QLabel("sampai")  //membuat labe(teks)l sampai
        self.teksSampaiUkuran = QtGui.QLabel("sampai")  //membuat tekx/label ‘sampai’

    def aturKomponen(self):  //metode ‘aturKomponen’
        buttonsLayout = QtGui.QHBoxLayout()  //membuat layout Tombol
        buttonsLayout.addStretch()  //membuat stretch (bisa membesar/mengecil saat window di perbesar/perkecil)
        buttonsLayout.addWidget(self.findButton)  //memasukkan tombol ‘find’
        buttonsLayout.addWidget(self.buka)  //menambhkan tombol ‘buka’ ke dalam window (Layout tombol)
        buttonsLayout.addWidget(self.tombolLokasi)  //memasukkan ‘tombolLokasi’ ke window (layout Tombol)

        layoutTipe = QtGui.QHBoxLayout()  //membuat layout ‘tipe
        layoutTipe.addWidget(self.tipe)  //memasukkan comboBox ‘tipe’ ke dalam ‘layoutTipe’
        layoutTipe.addStretch()  //menambahkan ‘stretch’ *bisa memanjang atau memendek saat window di kecilkan/dibesarkan’

        layoutUkuran = QtGui.QHBoxLayout()  //membuat ‘layoutUkuran’
        layoutUkuran.addWidget(self.ukuranAwal)  //memasukkan combobox ukuranAwal
        layoutUkuran.addWidget(self.teksSampaiUkuran)  //memasukkan teks/label ‘sampai’
        layoutUkuran.addWidget(self.ukuranAkhir)  //memasukkan kolom ‘ukuranAkhir’ kedalam layout
        layoutUkuran.addWidget(self.jenisUkuran)  //memasukkan combobox jenis ukuran
        layoutUkuran.addStretch()  //memasukkan stretch “akan memanjang/mengecil jika window di ubah ukuran”

        layoutTglBuat = QtGui.QHBoxLayout()  //membuat layout untuk tanggal di buat
        layoutTglBuat.addWidget(self.dibuatAwal)  //memasukkan kolom tanggal dibuat 1 (awal) ke ‘layoutTglBuat’
        layoutTglBuat.addWidget(self.teksSampaiBuat)  //memasukkan teks ‘sampai’ ke ‘layoutTglBuat’
        layoutTglBuat.addWidget(self.dibuatAkhir)  //memasukkan kolom tanggal dibuat 2 (akhir) ke ‘layoutTglBuat’
        layoutTglBuat.addWidget(self.tombolDibuat)  //memasukkan tombol pemilih tanggal ‘dibuat’ ke ‘layoutTglBuat’ ke ‘layoutTglBuat’
        layoutTglBuat.addStretch()  //memasukkan stretch “akan memanjang/mengecil jika window di ubah ukuran”

        layoutTglAkses = QtGui.QHBoxLayout()  //membuat layout kolom tanggal
        layoutTglAkses.addWidget(self.diaksesAwal)  //memasukkan kolom di akses
        layoutTglAkses.addWidget(self.teksSampaiAkses)  //memasukkan teks sampai
        layoutTglAkses.addWidget(self.diaksesAkhir)  //memasukkan kolom akses ke dua
        layoutTglAkses.addWidget(self.tombolDiakses)  //memasukkan tombol pemilih tanggal
        layoutTglAkses.addStretch()  //memasukkan stretch “akan memanjang/mengecil jika window di ubah ukuran”


        widgetTengah = QtGui.QWidget()  //insisialisasi widget
        mainLayout = QtGui.QGridLayout(widgetTengah)  //membuat Layout utama
        mainLayout.setColumnStretch(1,6)   //membuat stretch (bisa membesar/mengecil saat window di perbesar/perkecil)
        mainLayout.setRowStretch(7, 0)  //membuat stretch (bisa membesar/mengecil saat window di perbesar/perkecil)
        mainLayout.addWidget(self.teksLokasi, 0, 0)  //memasukkan label ‘teksLokasi’ ke dalam window
        mainLayout.addWidget(self.lokasi, 0, 1, 1, 3)  //memasukkan comboBox ‘lokasi’ (penampil path folder) ke dalam window
        mainLayout.addWidget(self.browseButton, 0, 4)  //memasukkan tombol ‘brows’ (pemilih folder) ke dalam window
        mainLayout.addWidget(self.teksNama, 1, 0)  //memasukkan teksNama (checkbox Nama) ke dalam window
        mainLayout.addWidget(self.nama, 1, 1, 1, 4)  //memasukkan kolom ‘nama’ ke dalam window
        mainLayout.addWidget(self.teksTipe, 2, 0)  //memasukkan checkbox ‘teksTIpe’ layout utama

        mainLayout.addLayout(layoutTipe, 2, 1, 1, 4)  //memasukkan ‘layoutTipe’ ke dalam layout utama

        mainLayout.addWidget(self.teksUkuran, 3, 0)  //memasukkan checkbox ‘teksUkuran’
        mainLayout.addLayout(layoutUkuran, 3, 1, 1, 4)  //memasukkan ‘layoutUkuran’

        mainLayout.addWidget(self.teksDiakses, 4, 0)  //memasukkan checkbox tanggal di akses ke main layout
        mainLayout.addLayout(layoutTglAkses, 4, 1, 1, 4)  //memasukkan layout tanggal ke main layout

        mainLayout.addWidget(self.teksDibuat, 5, 0)  //memasukkan checkbox untuk tanggal dibuat
        mainLayout.addLayout(layoutTglBuat, 5, 1, 1, 4)  //memasukkan layout tanggal di buat

        mainLayout.addWidget(self.teksBerisi, 6, 0)  //memasukkan checkbox untuk menentukan inpu ‘isian file’
        mainLayout.addWidget(self.berisi, 6, 1, 1, 4)  //memasukkan kolom isian menentukan isi file yang ingin di cari
        mainLayout.addWidget(self.filesTable, 7, 0, 2, 5)  //memasukkan tabel (menampilkan daftar file) ke dalam window
        mainLayout.addWidget(self.teksInfo, 10, 0, 1 ,2)  //memasukkan label ‘teksInfo’ (jumlah hasil file) ke dalam window
        mainLayout.addLayout(buttonsLayout, 10, 0, 1, 5)  //memasukkan ‘layoutTombol’ ke dalam window
        mainLayout.setContentsMargins(4,5,4,2)  //mengatur margin agar tampilan lebih bagus
        self.setCentralWidget(widgetTengah)  //memsukkan widget tengah

    def tentukanFolder(self):  //metode ‘tentukanFolder’
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Find Files",
                QtCore.QDir.currentPath())  //menampilkan file dialog pemilih folder

        if directory:  //memastikan user klik ‘ok’ (memilih folder’
            if self.lokasi.findText(directory) == -1:  //memastikan path/folder belum di tambahkan ke dalam combobox ‘lokasi’
                self.lokasi.addItem(directory)  //menambahkan path/folder ke dalam combobox ‘lokasi’ jika tidak ada

            self.lokasi.setCurrentIndex(self.lokasi.findText(directory))   //mengatur agar folder yang sudah dipilih menjadi yang terpilih di combobox ‘lokasi’
            self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")  //mengubah warna tombol (kuning) dan teks (hitam)

    @staticmethod  //mengatur agar menjadi static
    def updateComboBox(comboBox):  //metode update combobox
        if comboBox.findText(comboBox.currentText()) == -1:  //mengecek apakah folder/path yang di pilih user tidak ada di dalam item ‘combobox’
            comboBox.addItem(comboBox.currentText())  //menambahkan path/folder ke dalam combobox ‘lokasi’ jika tidak ada

    def cariFile(self):  //metode ‘cariFile’
        self.filesTable.setRowCount(0)  //mengatur perhitungan tabel menjadi 0
        cek = self.cekKelenkapan()  //digunakan untuk menjalankan metode ‘cekKelenkapan’ dan menampung nilai kembalian kedalam variabel ‘cek’
        if cek == True :  //mengecek nilai kembalian metode ‘cekKelengkapan’ yang di tampung ke var ‘cek’ (True jika input valid)
            path = self.lokasi.currentText()  //mendapatkan folder yang terpilih
            file = self.dapatkanSemuaFile(path)  //menjalanan metode ‘dapatkanSemuaFile’

            self.updateComboBox(self.lokasi)  //menjalankan metode ‘UpdateComboBox’ dengan memasukkan lokasi path
            self.updateComboBox(self.nama)  //memanggil metode ‘updateComboBox’ dengan memasukkan parameter nilai var ‘nama’
            self.updateComboBox(self.tipe)  //menjalankan metode ‘updatComboBox’
            self.updateComboBox(self.ukuranAwal)  //memanggil metode ‘updateComboBox’ dengan memasukkan parameter nilai var ‘ukuranAwal’
            self.updateComboBox(self.ukuranAkhir)  //memanggil metode ‘updateComboBox’ dengan memasukkan parameter nilai var ‘ukuranAkhir’
            self.updateComboBox(self.berisi)   //memanggil metode ‘updateComboBox’ dengan memasukkan parameter nilai var ‘berisi’
            self.tampilkanFIle(file)  //menjalankan metode ‘tampilkanFIle’ dengan parameter nilai variabel ‘file’
            self.findButton.setStyleSheet("background-color: green; font-weight:bold; color:white;")  //mengubah warna tombol (hijau) dan teks (putih)
        else:  //jika variabel ‘cek’ bernilai bukan true (input tidak valid)
            self.teksInfo.setText(cek)   //mengubah teks info untuk menampilkan isi variabel ‘cek’ (nilai kembalian variabel cekKelengkapan/nilai error) 


    def tampilkanFile(self, files):  //metode ‘tampilkanFIle’
        for i in range(len(files)) :  //melakukan perulangan sebanyak file yang telah di peroleh
            file = QtCore.QFile(files[i][5])  //memanggil class ‘QFIle’ dengan memasukkan path file sebagai parameter
            size = QtCore.QFileInfo(files[i][5]).size()  //mendapatkan ukuran file

            itemNo = QtGui.QTableWidgetItem(str(i+1)+'.')  //mendefinisikan nomer urut file di tabel
            itemNo.setFlags(itemNo.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom ‘no.’ agar tidak bisa di edit

            fileNameItem = QtGui.QTableWidgetItem(self.penampungHasil[i][0])  //mendapatkan nama file  
            fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom ‘nama file’ agar tidak bisa di edit

            tipe = QtGui.QTableWidgetItem('.'+self.penampungHasil[i][1])  //membuat cell dengan memberi isi tipe file
            tipe.setFlags(tipe.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat cell/kolom tipe agar tidak bisa di edit

            sizeItem = QtGui.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))  //mendapatkan ukuran file
            sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter)  //membuat teks ukuran agar ada di tengah
            sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom ‘ukuran’ agar tidak bisa di edit

            akses = QtGui.QTableWidgetItem(self.penampungHasil[i][3].toString('d-M-yyyy'))  //inisialisasi kolom dan isi dariwaktu terakhir di akses
            akses.setFlags(akses.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom terakhir di akses tidak bisa di edit

            modif = QtGui.QTableWidgetItem(self.penampungHasil[i][4].toString('d-M-yyyy'))  //inisialisasi kolom dan isi dar iwaktu terakhir di edit
            modif.setFlags(modif.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom terakhir waktu terakhir di edit agar tidak bisa di edit.

            lokasi = QtGui.QTableWidgetItem(self.penampungHasil[i][5])  //inisialisasi kolom dan isi dari lokasi file
            lokasi.setFlags(lokasi.flags() ^ QtCore.Qt.ItemIsEditable)  //membuat kolom agar tidak bisa di edit

            row = self.filesTable.rowCount()  //mendapatkan total baris tabel
            self.filesTable.insertRow(row)  //memasukkan baris baru di paling akhir
            self.filesTable.setItem(row, 0, itemNo)  //memasukkan no. file
            self.filesTable.setItem(row, 1, fileNameItem)  //memasukkan nama file
            self.filesTable.setItem(row, 2, tipe)  //memasukkan ti pe file
            self.filesTable.setItem(row, 3, sizeItem)  //memasukkan ukuran file
            self.filesTable.setItem(row, 4, akses)  //memasukkan terakhir di akses
            self.filesTable.setItem(row, 5, modif)  //memasukkan waktu terakhir di edit
            self.filesTable.setItem(row, 6, lokasi)  //memasukkan lokasi file

        self.teksInfo.setText("%d file(s) found (Double click on a file to open it)" % len(files))  //menampilkan teks (mengubah teksinfo) dengan menampilkan total file yg di temukan

    def perintahTombol(self, text, member):  //metode ‘perintahTomol’ (pembuat tombol’
        button = QtGui.QPushButton(text)  //membuat tombol
        button.clicked.connect(member)  //menghubungkan tombol dengan nilai (parameter) ‘member’
        return button  //mengembalikan tombol

    def perintahComboBox(self, text=""):  //metode ‘perintahComboBox’ (pembuatCombobox)
        comboBox = QtGui.QComboBox()  //membuat combobox
        comboBox.setEditable(True)  //membuat combobox agar bisa di edit
        comboBox.addItem(text)  //memasukkan item combobbox
        comboBox.setSizePolicy(QtGui.QSizePolicy.Expanding,
                QtGui.QSizePolicy.Preferred)  //mengatur ukuran
        comboBox.editTextChanged.connect(self.ubahWarna)  //membuat semua combobox agar menjalankan metode ‘ubahWarna’ jika nilai di dalamnya berubah
        return comboBox  //mengembalikan combobox

    def ubahWarna(self):  //metode ‘ubahWarna’
        self.findButton.setStyleSheet("background-color: yellow; font-weight:bold; color:black;")  //mengubah warna tombol (kuning) dan teks (hitam)

    def buatTabel(self):  //metode ‘buatTabel’
        self.filesTable = QtGui.QTableWidget(0, 3)  //membuat tabel
        self.filesTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)  //agar saat di pilih salah satu colom, maka semua kolom dlm satu bari terpilih

        self.filesTable.setHorizontalHeaderLabels(("No.", “Nama”, "Tipe", "Ukuran", "Akses", "Dibuat", "Lokasi"))  //menambahkan judul di tabel
        self.filesTable.horizontalHeader().setResizeMode(6, QtGui.QHeaderView.Stretch)  //agar bisa memanjang sendiri jika teks panjang
        self.filesTable.verticalHeader().hide()  //menyembunyikan judl samping tabel
        self.filesTable.setShowGrid(False)  //agar tidak menampilkan garis kolom

        self.filesTable.setColumnWidth(0, 40)  //mengatur ukuran kolom 0 (urutan 1)
        self.filesTable.setColumnWidth(2, 60)  //mengatur ukuran kolom 2 (urutan 3)
        self.filesTable.setColumnWidth(3, 60)  //mengatur ukuran kolom 3 (urutan 4)
        self.filesTable.setColumnWidth(4, 80)  //mengatur ukuran kolom 4 (urutan 5)
        self.filesTable.setColumnWidth(5, 80)  //mengatur ukuran kolom 5 (urutan 6)

        self.connect(self.filesTable, QtCore.SIGNAL('cellDoubleClicked(int, int)'),self.bukaFIle)  //membuat perintah untuk menjalankan ‘bukaFile’ jika baris tabel (daftar file) di klik dua kali
        self.connect(self.filesTable, QtCore.SIGNAL('itemSelectionChanged()'),self.pengaktifTombol)  //menjalankan metode ‘pengaktifTombol’ jika pilihan baris di tabel berubah

    def pengaktifTombol(self):  //metode pengaktifTombol
        if len(self.filesTable.selectedItems()): //memastikan ada 1 baris terpilih di tabel
            self.buka.setEnabled(True)  //menghidupkan tombol buka
            self.tombolLokasi.setEnabled(True)  //menghidupkan tombol ‘Lokasi’
            self.pilihan = self.filesTable.selectedItems()[0].row()  //mengubah nilai var ‘pilihan’ menjadi no. Urutan baris terpilih
        else:  //jika tak ada baris terpilih
            self.buka.setEnabled(False)  //mematikan tombol buka
            self.tombolLokasi.setEnabled(False)  //mematikan tombol lokasi

    def perintahBuka(self):  //metode ‘’perintahBuka’
        self.bukaFIle(self.pilihan, 0)  //menjalankan metode ‘bukaFile’ dengan parameter nilai var ‘pilihan’ no. urut baris terpilih pada tabel

    def bukaLokasi(self):  //metode buka lokasi
        item = self.penampungHasil[self.pilihan][5]  //mendapatkan lokasi file terpilih paada tabel
        print(item)  //hanya mencetak no. Pilihan. Silahkan hapus
        lokasi = os.path.dirname(item)  //mendapatkan lokasi file
        if sys.platform == 'win32':  //mengecek sistem operasi yang di gunakan user. Apakah windows
            item=item.replace('/','\\')  //mengubah tanda / menjadi \ pada path atau lokasi file
            subprocess.Popen(r'explorer /select,%s' %item)  //membuka lokasi file dengan membuka file explorer
        elif sys.platform == 'darwin':  //mengecek apakah sistem operasi nya Mac os x
            subprocess.Popen(['open', lokasi])  //membuka fle browser di lokasi file
        else:  //jika os yang di gunakan selain windows dan mac osx (linux/unix)
            try:  //mencoba code program
                os.system('xdg-open "%s"' %lokasi)  //membuka file browser di folder lokasi file
            except :  //jika terjadi error di code try
                QtGui.QMessageBox.critical(self, "ERROR",
                                                    "Maaf tidak bisa membuka lokasi file",
                                           QtGui.QMessageBox.Ok)  //menampilkan pesan error ke user

    def bukaFIle(self, row, column):  //metode ‘bukaFile’
        item = self.penampungHasil[row][2]  //mendapatkan path/lokasi file
        if sys.platform == 'win32':  //mengecek apkah di jalankan di os windows
            os.startfile('file://'+item)  //membuka file
        elif sys.platform == 'darwin':  //mengecek apakah di jalankan di Mac os
            subprocess.Popen(['open', item])  //membuka file
        else:  //jika tidak di jalankan di Mac os atau Windows
            try:  //mencoba code program
                os.system('xdg-open "%s"' %item)  //membuka file
            except :  //jika terjadi error
                QtGui.QMessageBox.critical(self, "ERROR",
                                                    "Maaf file tidak bisa di buka",
                                           QtGui.QMessageBox.Ok)  //menampilkan pesan error

    def dapatkanSemuaFile(self, folder):  //metod ‘dapatkanSemuaFile’
        cari = [folderInti]  //menampung folder yang akan di cari file nya
        self.penampungHasil = []  //mendefinisikan list kosong
        penampungFolder = []  //membuat penampung folder jika ada subfolder

        while len(cari) :  //melakukan perulangan selama variabel ‘cari’ ada isinya
            for i in cari :  //melakukan perulangan sebanyak item di variabel ‘cari’
                files = QtCore.QDir(folder).entryList(QtCore.QDir.Files | QtCore.QDir.NoSymLinks)  //mendapatkan semua file di direktori yg telah di tentukan
                folder = QtCore.QDir(i).entryList(QtCore.QDir.Dirs | QtCore.QDir.NoDotAndDotDot)   //mendapatkan subfolder
                path = QtCore.QDir(folder).absolutePath()  //mendapatkan lokasi folder
                if files :  //mengecek dan memastikan ada file di folder yang di pilih
                    for i in files :  //melakukan perulangan sebanyak file yang ada di folder
                        cek = self.cekKecocokan(path+'/'+i)  //memanggil metode ‘kecocokan’ dengan memasukkan lokasi file
                        if cek :  //memastikan nilai kembalian di dalam var ‘cek’ tidak kosong
                            file = QtCore.QFileInfo(path+'/'+i)  //memanggil class ‘QfileInfo’ dengan memasukkan lokasi file
                            nama = file.fileName()  //mendapatkan nama file
                            tipe = file.suffix()  //mendapatkan ekstensi file
                            ukuran = file.size()  //mendapatkan ukuran file
                            akses = file.lastRead()  //mendapatkan tgl terakhir di baca
                            modif = file.lastModified()  //mendapatkan tgl terakhir di edit
                            lokasi = path+'/'+i  //mendapatkan lokasi file

                            self.penampungHasil.append([nama, ukuran, lokasi])  //memasukkan nama, ukuran dan lokasi file ke dalam ‘penampungHasil’

                if folder :  //memastikan variabel ‘folder’ tidak kosong
                    for i in folder:  //melakukan perulangan sebanyak item di ‘folder’ (banyak nya sub folder)
                        print(i)  //mencetak subfolder (hanya untuk pengecekan. Silahkan hapus)
                        penampungFolder.append(path+'/'+i)  //menampung lokasi sub folder (memasukkan ke ‘penampungFolder’)
                    print('==========')  //mencetak garis saja
            cari = penampungFolder  //mengambil nilai ‘penampungFolder’
            penampungFolder = []  //mengosongkan variabel ‘penampung folder’
        return self.penampungHasil  //mengembalikan penampungHasil

    def setStatus(self, status):  //digunakan untuk menghidupkan atau mematikan opsi pencarian
        self.nama.setEnabled(self.teksNama.isChecked())  //mematikan atau menghidupkan pencarian ‘nama’
        self.tipe.setEnabled(self.teksTipe.isChecked())  //mematikan atau menghidupkan combobox ‘tipe’

        self.ukuranAwal.setEnabled(self.teksUkuran.isChecked())  //mematikan/menghidupkan combobox awal (hidup jika di checkbox ‘teksUkuran’ di centang)
        self.ukuranAkhir.setEnabled(self.teksUkuran.isChecked())  //mematikan/menghidupkan combobox akhir (hidup jika di checkbox ‘teksUkuran’ di centang)

        self.diaksesAwal.setEnabled(self.teksDiakses.isChecked())  //mematikan/menghidupkan combobox tanggal di akses pertama (hidup jika di checkbox ‘teks di akses’ di centang)
        self.diaksesAkhir.setEnabled(self.teksDiakses.isChecked())  //mematikan/menghidupkan combobox tanggal di akses kedua (hidup jika di checkbox ‘teks di akses’ di centang)
        self.tombolDiakses.setEnabled(self.teksDiakses.isChecked())  //mematikan/menghidupkan tombol pemilih tanggal (hidup jika di checkbox ‘teks di akses’ di centang)

        self.dibuatAwal.setEnabled(self.teksDibuat.isChecked())  //mematikan/menghidupkan kolom tanggal dibuat 1/awal (hidup jika di checkbox ‘dibuat’ di centang)
        self.dibuatAkhir.setEnabled(self.teksDibuat.isChecked())  //mematikan/menghidupkan kolom tanggal dibuat akhir/2 (hidup jika di checkbox ‘dibuat’ di centang)
        self.tombolDibuat.setEnabled(self.teksDibuat.isChecked())  //mematikan/menghidupkan tombol pemilih tanggal dibuat (hidup jika di checkbox ‘dibuat’ di centang)

        self.berisi.setEnabled(self.teksBerisi.isChecked())  //mematikan/menghidupkan kolom ‘isit file’ (hidup jika di checkbox ‘dibuat’ di centang)

    def cekKecocokan(self, file):  //metode untuk mecocokkan file
        path = file  //menampung lokasi/path file
        file = QtCore.QFileInfo(file)  //memanggil class ‘QFileInfo’ dengan memasukkan nilai variabel ‘file’ sebagai parameter

        if self.teksNama.isChecked() :  //memastikan kolom nama tercentang
            if not self.nama.currentText().lower() in file.baseName().lower():  //mengecek nama di kolom nama apakah tidak ada di dalam nama file
                file = None  //mengembalikan kosongan jika tidak cocok
        if self.teksTipe.isChecked() and file :  //memastikan tekstipe tercentang dan variabel ‘file’ tidak kosong (bukan None)
            if not  self.tipe.currentText().lower() in file.suffix().lower():  //mengecek apakah tipe file dengan tipe di combobox tidak cocok
                file = None  //mengubah nilai variabel ‘file’ menjadi ‘None’ jika tidak cocok
        if self.teksUkuran.isChecked() and file :  //memastikan teksUkuran di chek dan ‘file’ tidak kosong
            ukuran = file.size()  //mendapatkan ukuran file
            ukuranCariAkhir = int(self.ukuranAkhir.currentText())  //mendapatkan nilai combo box ‘ukuranAkhir'
            ukuranCariAwal = int(self.ukuranAwal.currentText())  //mendapatkan nilai combo box ‘ukuranAwal'

            if self.jenisUkuran.currentText()=='KB' :  //mengecek apakah tipe nya adalah KB (combobox tipe yg terpilh adalah KB)
                ukuranCariAwal *= 1000  //mengalikan 1.000 pada nilai di kolom ‘ukuranAwal’
                ukuranCariAkhir *= 1000  //mengalikan 1.000 pada nilai di kolom ‘ukuranAkhir’ (efek KB)
            elif self.jenisUkuran.currentText()=='MB' :  //mengecek apakah tipe nya adalah MB (combobox tipe yg terpilh adalah MB)
                ukuranCariAwal *= 1000000  //mengalikan 1.000.000 pada nilai di kolom ‘ukuranAwal(efek MB)
                ukuranCariAkhir *= 1000000  //mengalikan 1.000.000 pada nilai di kolom ‘ukuranAkhir’ (efek MB)
            elif self.jenisUkuran.currentText()=='GB' :  //mengecek apakah tipe nya adalah GB (combobox tipe yg terpilh adalah GB)
                ukuranCariAwal *= 1000000  //mengalikan 1.000.000.000 pada nilai di kolom ‘ukuranAwal(efek GB)
                ukuranCariAkhir *= 1000000  //mengalikan 1.000.000.000 pada nilai di kolom ‘ukuranAkhir’ (efek GB)

            if ukuran < ukuranCariAwal or ukuran > ukuranCariAkhir :  //mengecek apakah ukuran file tidak ada di rentan ukuran awal dan akhir
                file = None  //mengubah nilai file menjadi ‘none’ jika tidak ada di rentan ukuran awal dan akhir

        if self.teksDiakses.isChecked() and file :  //memastikan checkbox ‘teksDiakses’ tercentang dan variabel ‘file’ tidak none
            tahunAwal = int(self.diaksesAwal.date().toString('yy'))  //mendapatkan tahun kolom diakses 1
            bulanAwal = int(self.diaksesAwal.date().toString('M'))  //mendapatkan bulan kolom diakses 1
            hariAwal = int(self.diaksesAwal.date().toString('d'))  //mendapatkan tangggal kolom diakses 1

            tahunAkhir = int(self.diaksesAkhir.date().toString('yy'))  //mendapatkan tahun kolom diakses 2
            bulanAkhir = int(self.diaksesAkhir.date().toString('M'))  //mendapatkan bulan kolom diakses 2
            hariAkhir = int(self.diaksesAkhir.date().toString('d'))  //mendapatkan tanggal kolom diakses 2

            tahunFile = int(file.lastModified().toString('yy'))  //mendapatkan tahun file terakhir di akses
            bulanFile = int(file.lastModified().toString('M'))  //mendapatkan bulan file terakhir di akses
            hariFile = int(file.lastModified().toString('d'))  //mendapatkantanggal file terakhir di akses

            if tahunFile < tahunAwal or tahunFile > tahunAkhir :  //mengecek apakah tahun file tidak ada di rentan tahun di kolom akses 1 dan 2
                file = None  //mengubah menjadi none jika tidak ada di rentan tahun kolom 1 dan 2
            else:  //jika ada di rentan tahun
                if bulanFile < bulanAwal or bulanFile > bulanAkhir :  //mengecek apakah tahun file tidak ada di rentan bulan di kolom akses 1 dan 2
                    file = None    //mengubah menjadi none jika tidak ada di rentan bulan kolom 1 dan 2
                else :  //jika ada di rentan bulan kolom 1 dan 2
                    if hariFile < hariAwal or hariFile > hariAkhir :  //mengecek apakah hari file tidak ada di rentan bulan di kolom akses 1 dan 2
                        file = None    //mengubah menjadi none jika tidak ada di rentan hari kolom 1 dan 2

        if self.teksDibuat.isChecked() and file :  //mengecek apakah checkbox ‘dibuat’ tercentang dan ‘file’ tidak bernilai ‘None’
            tahunAwal = int(self.dibuatAwal.date().toString('yy'))  //mendapatkan tahun awal pada kolom tanggal dibuat 1/awal
            bulanAwal = int(self.dibuatAwal.date().toString('M'))  //mendapatkan bulan awal pada kolom tanggal dibuat 1/awal
            hariAwal = int(self.dibuatAwal.date().toString('d'))  //mendapatkan tanggal awal pada kolom tanggal dibuat 1/awal

            tahunAkhir = int(self.dibuatAkhir.date().toString('yy'))  //mendapatkan tahun akhir pada kolom tanggal dibuat 2/akhir
            bulanAkhir = int(self.dibuatAkhir.date().toString('M'))  //mendapatkan bulan akhir pada kolom tanggal dibuat 2/akhir
            hariAkhir = int(self.dibuatAkhir.date().toString('d'))  //mendapatkan tanggal akhir pada kolom tanggal dibuat 2/akhir

            tahunFile = int(file.lastRead().toString('yy'))  //mendapatkan tahun file dibuat
            bulanFile = int(file.lastRead().toString('M'))  //mendapatkan bulan file dibuat
            hariFile = int(file.lastRead().toString('d'))  //mendapatkan tanggal file dibuat

            if tahunFile < tahunAwal or tahunFile > tahunAkhir:  //mengecek apakah tahun file tidak ada di rentan tahun kolom input tanggal 1/awal dan tahun kolom input tanggal 2/akhir
                file = None  //merubah menjadi None tahun di buat file ada di rentan tahun kolom input tanggal 1 dan 2
            else:  //apa bila tahun di buat file ada di rentan tahun kolom input tanggal 1 dan 2
                if bulanFile < bulanAwal or bulanFile > bulanAkhir:  //mengecek apakah bulan file tidak ada di rentan bulan kolom input tanggal 1/awal dan bulan kolom input tanggal 2/akhir
                    file = None  //apa bila bulan di buat file ada di rentan nulan kolom input tanggal 1 dan 2
                else:  //apa bila tahun di buat file ada di rentan bulan kolom input tanggal 1 dan 2
                    if hariFile < hariAwal or hariFile > hariAkhir:  //mengecek apakah tanggal file tidak ada di rentan tahun kolom input tanggal 1/awal dan tanggal kolom input tanggal 2/akhir
                        file = None  //apa bila tanggal di buat file ada di rentan tanggal kolom input tanggal 1 dan 2

        if self.teksBerisi.isChecked() and file :  //memastikan ‘checkbox’ isi (teks berisi file)
            teks = self.berisi.currentText()  //mendapatkan teks pada kolom iinput mencari isi file
            adaAtauTidak = True  //inisialisasi variabel bernilai true
            fileCek = QtCore.QFile(path)   //memanggil class QFile dengan memasukkan variabe nilai ‘path’
            if fileCek.open(QtCore.QIODevice.ReadOnly):  //memastikan file dapat di buka (hanya membaca)
                stream = QtCore.QTextStream(fileCek)  //mendapatkan semua isi teks
                while not stream.atEnd():  //melakukan perulangan
                    try:  //mencoba beberapa code program
                        line = stream.readLine()  //membaca teks tiap baris
                        if teks in line:  //mengecek apakah teks isian yang di input user ada di dalam file yang sedang di periksa
                            adaAtauTidak = False  //mengubah nilai variabel ‘adaAtauTidak’ karena isi teks yang di carai ada di dalam sebuah file
                            break  //menghentikan perulangan jika isi teks yang dicari sudah di temukan pada file yang di cek
                    except:  //jika terjadi  error pada saat memeriksa isian file
                        Pass  //tidak melakukan apa apa
            if adaAtauTidak :  //mengecek apakah nilai ‘adaAtauTIdak’ bernilai True. (True = tidak di temukan. False = ditemukan)
                file = None  //mengubah nilai variabel ‘file’ menjadi ‘None’. (jika adaAtauTidak bernilai True/tidak ditemukan) 

        return file  //mengembalikan file kembali jika cocok

    def pilihTanggalAkses(self):  //metode ‘pilihTanggalAkses’
        self.windowTanggalAkses = QtGui.QDialog(self)  //window barun (window pemilih tanggal)
        mainLayout = QtGui.QVBoxLayout()  //membuat main layout window pemilih tanggal
        layoutTanggal = QtGui.QHBoxLayout()  //membuat layout tanggal
        layoutTombol = QtGui.QHBoxLayout()  //membuat layout tombol

        self.tanggalAksesAwal = QtGui.QCalendarWidget()  //membuat tanggal 1 (awal)
        self.tanggalAksesAwal.selectionChanged.connect(self.tanggalAksesBerubahAwal)  //menjalankan metode ‘tanggalAksesBerubahAwal’ jika pilihan tanggal 1 berubah
        layoutTanggal.addWidget(self.tanggalAksesAwal)  //memasukkan tanggal 1 (awal) ke layout tanggal

        teksSampai = QtGui.QLabel("sampai")  //membuat teks/label (sampai)
        layoutTanggal.addWidget(teksSampai)  //memasukkan teks/label sampaik e layout tanggal

        self.tanggalAksesAkhir = QtGui.QCalendarWidget()  //membuat tanggal 2 (akhir)
        self.tanggalAksesAkhir.selectionChanged.connect(self.tanggalAksesBerubahAkhir)  //menjalankan metode ‘tanggalAksesBerubahAkhir’ jika pilihan tanggal 2 berubah
        self.tanggalAksesAkhir.setMinimumDate(self.tanggalAksesAwal.selectedDate())  //membuat minimal pemilihan tanggal 2. (harus di atas tanggal 1)
        layoutTanggal.addWidget(self.tanggalAksesAkhir)  //memasukkan \tanggal 2 (akhir) ke layout tanggal

        self.teksInfo1Akses = QtGui.QLabel(self.tanggalAksesAwal.selectedDate().toString("dd - MMMM - yyyy"))  //membuat label sesuai tanggal terpilih (tanggal 1/awal)
        tombol = QtGui.QPushButton("Selesai")  //membuat tombol ‘selesai’
        tombol.clicked.connect(self.tanggalAkses)  //menjalankan metode ‘tanggalAkses’ jika tombol ‘selesai’ di klik
        self.teksInfo2Akses = QtGui.QLabel(self.tanggalAksesAkhir.selectedDate().toString("dd - MMMM - yyyy"))  //membuat label sesuai tanggal terpilih (tanggal 2/akhir)

        layoutTombol.addStretch()  //menambahkan strecth (space yg akan membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(self.teksInfo1Akses)  //memasukkan teks info tanggal yang dipilih 1 (awal)
        layoutTombol.addStretch()  //menambahkan strecth (space yg akan membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(tombol)  //memasukkan tombol selesai ke layou tombol
        layoutTombol.addStretch()  //menambahkan strecth (space yg akan membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(self.teksInfo2Akses)  //memasukkan teks info tanggal yang dipilih 2 (akhir)
        layoutTombol.addStretch()  //menambahkan strecth (space yg akan membesar/mengecil sesuai ukuran window)

        mainLayout.addLayout(layoutTanggal)  //memasukkan ‘layoutTangga’ ke layout utama
        mainLayout.addLayout(layoutTombol)  //memasukkan layout tombol ke layout utama
        self.windowTanggalAkses.setLayout(mainLayout)  //memasukkan layout utama ke dalam window
        self.windowTanggalAkses.show()  //menampilkan wiindow

    def tanggalAkses(self):  //metode ‘tanggalAkses’
        self.diaksesAwal.setDate(self.tanggalAksesAwal.selectedDate())  //mengubah isian kolom tanggal 1 (awal) sesuai tanggal yang terpilih pada pemilih tanggal 1 (awal) di window
        self.diaksesAkhir.setDate(self.tanggalAksesAkhir.selectedDate())  //mengubah isian kolom tanggal 2 (akhir) sesuai tanggal yang terpilih pada pemilih tanggal 2 (akhir) di window
        self.windowTanggalAkses.close()  //menutup window ‘tanggalAkses’

    def tanggalAksesBerubahAwal(self):  //metode ‘tanggalAksesBerubahAwal’
        self.teksInfo1Akses.setText(self.tanggalAksesAwal.selectedDate().toString("dd - MMMM - yyyy"))  //mengubah teks info sesuai tanggal terpilih pada pemilih tanggal 1 (AWAL)
        self.tanggalAksesAkhir.setMinimumDate(self.tanggalAksesAwal.selectedDate())  //mengubah minimum tanggal pada pemilih tanggal 2/akhir (minimal sama dengan pemilih tanggal 1 (awal))

    def tanggalAksesBerubahAkhir(self):  //metode ‘tanggalAksesBerubahAkhir’
        self.teksInfo2Akses.setText(self.tanggalAksesAkhir.selectedDate().toString("dd - MMMM - yyyy"))  //mengubah teks info sesuai tanggal terpilih pada pemilih tanggal 2 (AKHIR)
92
    def pilihTanggalBuat(self):  //metode ‘pilihTanggalBuat’
        self.windowTanggalBuat = QtGui.QDialog(self)  //membuat window untuk pemilih tanggal di buat
        mainLayout = QtGui.QVBoxLayout()  //membuat ‘layoutUtama’
        layoutTanggal = QtGui.QHBoxLayout()  //membuat ‘layoutTanggal’ /kalender
        layoutTombol = QtGui.QHBoxLayout()  //membuat ‘layoutTombol’

        self.tanggalBuatAwal = QtGui.QCalendarWidget()  //membuat ‘calender’/pemilih tanggal 1
        self.tanggalBuatAwal.selectionChanged.connect(self.tanggalBuatBerubahAwal)  //menjalankan metode ‘tanggalBuatBerubaAwal’ jika user memilih tanggal (awal/1)
        layoutTanggal.addWidget(self.tanggalBuatAwal)  //memasukkan calender 1 ke layout tanggal

        teksSampai = QtGui.QLabel("sampai")  //membuat teks/label ‘sampai’
        layoutTanggal.addWidget(teksSampai)  //memaukkan teks/label ‘sampai’ ke layout tanggal

        self.tanggalBuatAkhir = QtGui.QCalendarWidget()  //membuat ‘calender’/pemilih tanggal 2
        self.tanggalBuatAkhir.selectionChanged.connect(self.tanggalBuatBerubahAkhir)  //menjalankan metode ‘tanggalBuatBerubaAkhir’ jika user memilih tanggal (akhir/2)
        self.tanggalBuatAkhir.setMinimumDate(self.tanggalBuatAwal.selectedDate())  //menentukan batas pemilihan tanggal di kalender 2. (minimal sama dengan pilihan di calender 1)
        layoutTanggal.addWidget(self.tanggalBuatAkhir)  //memasukkan calender 2 ke layout tanggal

        self.teksInfo1Buat = QtGui.QLabel(self.tanggalBuatAwal.selectedDate().toString("dd - MMMM - yyyy"))  //membuat teks yang menampilkan tanggal terpilih pada calender 1
        tombol = QtGui.QPushButton("Selesai")  //membuat tombol selesai
        tombol.clicked.connect(self.tanggalBuat)  //menjalankan metode ‘tanggalBuat’ jika tombol selesai di klik
        self.teksInfo2Buat = QtGui.QLabel(self.tanggalBuatAkhir.selectedDate().toString("dd - MMMM - yyyy"))  //membuat teks yang menampilkan tanggal terpilih pada calender 2

        layoutTombol.addStretch()  //membuat stretch (ruang kosong yang dapat membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(self.teksInfo1Buat)  //memasukkan teks yang menampilkan tanggal terpilih calender 1 ke layout tombol
        layoutTombol.addStretch()  //membuat stretch (ruang kosong yang dapat membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(tombol)  //memasukkan tombol selesai ke layoutTombol
        layoutTombol.addStretch()  //membuat stretch (ruang kosong yang dapat membesar/mengecil sesuai ukuran window)
        layoutTombol.addWidget(self.teksInfo2Buat)  //memasukkan teks yang menampilkan tanggal terpilih calender 2 ke layout tombol
        layoutTombol.addStretch()  //membuat stretch (ruang kosong yang dapat membesar/mengecil sesuai ukuran window)

        mainLayout.addLayout(layoutTanggal)  //memasukkan layout tanggal ke layout utama
        mainLayout.addLayout(layoutTombol)  //memasukkan layout tombol ke layout utama
        self.windowTanggalBuat.setLayout(mainLayout)  //memasukkan layout utama ke dalam window pemilih tanggal di buat
        self.windowTanggalBuat.show()  //menampilkan window pemilih tanggal di buat

    def tanggalBuat(self):  //metode tanggalBuat
        self.dibuatAwal.setDate(self.tanggalBuatAwal.selectedDate())  //memasukkan tanggal terpilih di calender 1 ke dalam kolom input tanggal 1
        self.dibuatAkhir.setDate(self.tanggalBuatAkhir.selectedDate())  //memasukkan tanggal terpilih di calender 2 ke dalam kolom input tanggal 2
        self.windowTanggalBuat.close()  //menutup window pemilih tanggal buat

    def tanggalBuatBerubahAwal(self):  //metode tanggalBuatBerubaAwal
        self.teksInfo1Buat.setText(self.tanggalBuatAwal.selectedDate().toString("dd - MMMM - yyyy"))  //mengubah/update teks info yang menampilkan tanggal terpilih di calender 1 sesuai tanggal terpilih
        self.tanggalBuatAkhir.setMinimumDate(self.tanggalBuatAwal.selectedDate())  //mengubah minimal pemilihan calender 2. (minimal sama dengan tanggal terpilih di calender 1)

    def tanggalBuatBerubahAkhir(self):  //metode ‘tanggalBuatBerubahAkhir’
        self.teksInfo2Buat.setText(self.tanggalBuatAkhir.selectedDate().toString("dd - MMMM - yyyy"))  //mengubah/update teks info yang menampilkan tanggal terpilih di calender 2 sesuai tanggal terpilih

    def cekKelenkapan(self):  //metode ‘cekKelenkapan’
        status = True  //inisialisasi variabel ‘status’ (akan tetap bernilai true jika semua input valid)
        if QtCore.QDir(self.lokasi.currentText()).exists() == False :  //mengecek apakah folder yang di masukkan user tidak ada
            status = "Kolom Lokasi folder yang anda masukkan tidak valid/Kosong."  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        if (status == True):  //mengecek nilai ‘status’ apakah tetap bernilai True
            if self.teksTipe.isChecked() and (self.tipe.currentText() == ' ' or self.tipe.currentText() == '  ' or self.tipe.currentText() == '   '):
                status = "Kolom tipe tidak boleh tanda spasi saja."  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        if (status == True):  //mengecek nilai ‘status’ apakah tetap bernilai True
            try:  //mencoba beberapa code program
                if self.teksUkuran.isChecked() and int(self.ukuranAwal.currentText()) > int(self.ukuranAkhir.currentText()) :  //mengecek apakah ukuran awal lebih besar dari ukuran akhir uk
                    status = "Kolom ukuran pertama harus lebih kecil dari kolom ukuran yang kedua."  //mengubah isi nilai variabel ‘status’ menjadi pesan error
            except:  //jika terjadi error pada code try
                status = "Error !!  Ukuran harus berupa angka."  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        if (status == True):  //mengecek nilai ‘status’ apakah tetap bernilai True
            if self.teksDiakses.isChecked() :  //mengecek apakah checkbox tanggal akses tercentang
                tahunAwal = int(self.diaksesAwal.date().toString('yy'))  //mendapatkan tahun di kolom akses 1 
                bulanAwal = int(self.diaksesAwal.date().toString('M'))  //mendapatkan bulan di kolom akses 1 
                hariAwal = int(self.diaksesAwal.date().toString('D'))  //mendapatkan tanggal di kolom akses 1 

                tahunAkhir = int(self.diaksesAkhir.date().toString('yy'))  //mendapatkan tahun di kolom akses 2 
                bulanAkhir = int(self.diaksesAkhir.date().toString('M'))  //mendapatkan bulan di kolom akses 2
                hariAkhir = int(self.diaksesAkhir.date().toString('D'))  //mendapatkan tanggal di kolom akses 3
                if tahunAwal > tahunAkhir :  //mengecek apakah tahun awal di akses lebih besar dari yang akhir/2
                    status = "Tahun akses awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
                elif tahunAwal == tahunAkhir:  //mengecek apakah tahun awal di akses sama dengan yang akhir/2
                    if bulanAwal > bulanAkhir :  //mengecek apakah bulan awal di akses lebih besar dari yang akhir/2
                        status = "Bulan akses awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
                    elif bulanAwal == bulanAkhir:  //mengecek apakah bulan awal di akses sama dengan yang akhir/2
                        if hariAwal > hariAkhir :  //mengecek apakah tanggal awal di akses lebih besar dari yang akhir/2
                            status = "Hari akses awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        if (status == True):   //mengecek nilai ‘status’ apakah tetap bernilai True
            if self.teksDibuat.isChecked() :  //mengecek apakah checkbox tanggal buat tercentang
                tahunAwal = int(self.dibuatAwal.date().toString('yy'))  //mendapatkan tahun di kolom buat 1 
                bulanAwal = int(self.dibuatAwal.date().toString('M'))  //mendapatkan bulan di kolom buat 1
                hariAwal = int(self.dibuatAwal.date().toString('D'))  //mendapatkan tanggal di kolom buat 1

                tahunAkhir = int(self.dibuatAkhir.date().toString('yy'))  //mendapatkan tahun di kolom buat 2
                bulanAkhir = int(self.dibuatAkhir.date().toString('M'))  //mendapatkan bulan di kolom buat 2
                hariAkhir = int(self.dibuatAkhir.date().toString('D'))  //mendapatkan tanggal di kolom buat 2
                if tahunAwal > tahunAkhir:  //mengecek apakah tahun awal di buat lebih besar dari yang akhir
                    status = "Tahun buat awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
                elif tahunAwal == tahunAkhir:  //mengecek apakah tahun awal di buat sama dengan yang akhir
                    if bulanAwal > bulanAkhir:  //mengecek apakah bulan awal di buat lebih besar dari yang akhir
                        status = "Bulan buat awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
                    elif bulanAwal == bulanAkhir:  //mengecek apakah bulan awal di buat sama dengan yang akhir
                         if hariAwal > hariAkhir:  //mengecek apakah tanggal awal di buat lebih besar dari yang akhir
                             status = "Hari buat awal tidak boleh lebih besar dari tahun akses akhir"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        if (status == True):   //mengecek nilai ‘status’ apakah tetap bernilai True
            if self.teksBerisi.isChecked() and self.berisi.currentText() == '' :
                status = "Kolom 'Berisi teks' tidak boleh kosong"  //mengubah isi nilai variabel ‘status’ menjadi pesan error
        return status  //mengembalikan nilai status ke pemanggil

if __name__ == '__main__':  //code yg akan di jalankan pertama kali
    app = QtGui.QApplication(sys.argv)  //mendefinisikan aplikasi
    window = Window()  //menjalankan clas ‘window’
    window.show()  //menampilkan window class ‘Window’

    sys.exit(app.exec_())  //agar tidak langsung clos 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