Membuat Aplikasi pencari File PySide (versi 2)

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

Postingan ini meposting pencari file versi 2. Dimana pada versi kali ini saya menambahkan fitur yang cukup penting... Karena saya akan mencari sebuah file sampai ke folder paling bawah sekalipun.. Hal ini tidak bisa dilakukan versi sebelumnya.. Dimana hanya mencari file di satu folder saja..

Rincian Lengkap Pencari File PySide Versi 2.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 2.0
Versi: 2.0 || selanjutnya.
Platform: Python 3.x  || Install.
Modul: PySide || Install.
Baris Code: +- 172 baris.
Penambahan: +-12 baris.
Terdiri dari: 1 class dan 15 metode.
Fitur: mencari file sampai ke dalam folder - folder yang ada di folder terpilih.
Kelemahan: Rentan ‘not responding’ jika kalian memilih folder paling atas. Ex : ‘c:’ , ‘d:’ atau ‘e:’.
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 2.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()

    def buatTombol(self):
        self.browseButton = self.perintahTombol("&...", self.tentukanFolder)
        self.findButton = self.perintahTombol("&Find", self.cariFile)

        self.browseButton.setFixedSize(30, 20)

    def buatCombobox(self):
        self.lokasi = self.perintahComboBox(QtCore.QDir.currentPath())

    def buatLabel(self):
        self.teksLokasi = QtGui.QLabel("       Lokasi           :")
        self.teksInfo = QtGui.QLabel()

    def aturKomponen(self):
        buttonsLayout = QtGui.QHBoxLayout()
        buttonsLayout.addStretch()
        buttonsLayout.addWidget(self.findButton)
        buttonsLayout.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.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))

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

    def cariFile(self):
        self.filesTable.setRowCount(0)

        path = self.lokasi.currentText()
        file = self.dapatkanSemuaFile(path)

        self.updateComboBox(self.lokasi)

        self.tampilkanFile(file)

    def tampilkanFile(self, files):
        for i in range(len(files)) :
            size = QtCore.QFileInfo(files[i][2]).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)

            sizeItem = QtGui.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))
            sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter)
            sizeItem.setFlags(sizeItem.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, sizeItem)

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

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

        self.filesTable.setHorizontalHeaderLabels(("No.", "Nama", "Ukuran"))
        self.filesTable.horizontalHeader().setResizeMode(1, QtGui.QHeaderView.Stretch)
        self.filesTable.verticalHeader().hide()
        self.filesTable.setShowGrid(False)

        self.filesTable.setColumnWidth(0, 40)
        self.filesTable.setColumnWidth(2, 60)

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

    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 :
                        file = QtCore.QFileInfo(path+'/'+i)
                        nama = file.fileName()
                        ukuran = file.size()
                        lokasi = path+'/'+i

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

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

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 2.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’

    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.browseButton.setFixedSize(30, 20)  //mengubah ukuran tombol ‘browseButton’ (pemilih folder)

    def buatCombobox(self):  //metode ‘buatCombobox’
        self.lokasi = self.perintahComboBox(QtCore.QDir.currentPath())  //menjalankan metode ‘perintahComboBox’

    def buatLabel(self):  //metode ‘buatLabel’
        self.teksLokasi = QtGui.QLabel("       Lokasi           :")  //membuat label ‘Lokasi’
        self.teksInfo = QtGui.QLabel()  //membuat label dengan teks kosong

    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.addStretch()  //membuat stretch (bisa membesar/mengecil saat window di perbesar/perkecil)

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

    @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

        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.tampilkanFile(file)  //menjalankan metode ‘tampilkanFile’

    def tampilkanFile(self, files):  //metode ‘tampilkanFIle’
        for i in range(len(files)) :  //melakukan perulangan sebanyak file yang telah di peroleh
            size = QtCore.QFileInfo(files[i][2]).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

            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

            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, sizeItem)  //memasukkan ukuran 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
        return comboBox  //mengembalikan combobox

    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", "Ukuran"))  //menambahkan judul di tabel
        self.filesTable.horizontalHeader().setResizeMode(1, 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.connect(self.filesTable, QtCore.SIGNAL('cellDoubleClicked(int, int)'),self.bukaFIle)  //membuat perintah untuk menjalankan ‘bukaFile’ jika baris tabel (daftar file) di klik dua kali

    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
                        file = QtCore.QFileInfo(path+'/'+i)  //memanggil class ‘QfileInfo’ dengan memasukkan lokasi file
                        nama = file.fileName()  //mendapatkan nama file
                        ukuran = file.size()  //mendapatkan ukuran file
                        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

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