Aplikasi Downloader dengan Python PyQt4 versi 4

BelajarPython - assalamualaikum wr. Wb.

Jumpa lagi sahabat python.. Kembali lagi nih dengan saya.. Kali ini, Saya akan mencoba untuk meng upgrade aplikasi yang sudah saya bagikan sebelumnya nih.. Jadi pada postingan kali ini saya akan menambah fitur dari aplikasi downloader yang sudah saya posting sebelum nya ya... Nah seperti apakah perubahan nya.. Yuk langsung saja kita simak sama - sama postingan kali ini...

Penjelasan umum program / aplikasi.

Seperti yang sudah saya katakan sebelumnya, aplikasi yang akan saya bagikan kali ini merupakan aplikasi penerus dari aplikasi downloader versi yang sebelumnya... Yaitu yang ketiga.. Jika kalian belum membacanya, kalian bisa KLIK DISINI untuk sekedar melihat atau pun membacanya...

Pada versi yang ke empat kali ini, saya akan mencoba untuk menambahkan atribut untuk men tracking atau memantau proses unduh atau download kalian..  Yaitu dengan menampilkan fitur, ukuran total file, ukuran yang sudah di terima, dan sisa ukuran file yang akan di download serta kecepatan download nya pun akan saya tampilkan di fitur kali ini..

Oya, aplikasi ini memiliki beberapa versi dengan peningkatan fitur di tiap versi nya... Jika kalian ingin mengetahui perkembangan tiap versi nya, kalian bisa membaca daftar isi dan rangkuman tiap versinya pada LINK INI ya... Silahkan klik saja.. Hehe


Fitur dan spesifikasi lengkap aplikasi Downloader versi 4.0

Perlu kalian ketahui, jika aplikasi yang akan kita buat kali ini merupakan aplikasi yang dibuat menggunakan library atau modul PyQt4. Jika kalian belum menginstall modul ini, Kalian bisa menginstall PyQt4 Di LINK INI. Silahkan klik ya.. Nah langsung saja yuk kita simak spesifikasi lengkap nya di bawah ini..

Nama: mn-downloader 4.0
Versi: 4.0
Platform: Python 3.x
Modul: PyQt4. Klik disini untuk instalasi PyQt4.
Baris Code: kurang lebih 230 baris code program.
Terdiri dari: 2 class dan 17 metode.
Fitur: menampilkan ukuran, total diterima, total ukuran sisa, dan kecepatan download file.
syarat menjalankan: install python 3.x dan PyQt4, punya editor teks atau IDE.
Cara menjalankan: install python 3 dan PyQt4, copy dan paste code program pada editor atau IDE, simpan dalam file python(ekstensi .py), lalu jalankan.


Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Code program yang digunakan untuk membuat aplikasi Downloader versi 4.0

Pada segmen ini merupakan segmen utama pada postingan kali ini.. Karena saya akan memberikan code program dari aplikasi yang akan saya bagikan kali ini.... dan biar tidak penasaran lagi mengenai code program nya, yuk mari langsung saya kasi code program nya...

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtNetwork import *
import sys, os
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

class Tampilan(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        QApplication.setStyle(QStyleFactory.create('plastique'))
        self.setWindowTitle("Mini Downloader -> mn-belajarpython.blogspot.co.id")
        self.kbps = 0

        self.layout()
        self.buatAtribut()
        self.buatTombol()

    def layout(self):
        widgetInti = QWidget(self)
        self.layoutUtama = QVBoxLayout(widgetInti)
        self.layoutTombol = QHBoxLayout(self)
        self.layoutAtribut = QFormLayout(self)

        self.layoutUtama.addLayout(self.layoutAtribut)
        self.setCentralWidget(widgetInti)

    def buatAtribut(self):
        self.status = QLabel(text='Status           :')
        self.alamat = QLabel(text='Alamat          :')
        self.ukuran = QLabel(text='Ukuran          :')
        self.proses = QLabel(text='Diterima        :')
        self.sisa = QLabel(text='Sisa               :')
        self.kecepatan = QLabel(text='kecepatan     :')
        self.lokasi = QLabel(text='Lokasi           :')
        self.nama = QLabel(text='Nama File     :')
        self.tipe = QLabel(text='Tipe File        :')

        self.isiStatus = QLabel(text='-')
        self.isiAlamat = QLabel(text='-')
        self.isiUkuran = QLabel(text='-')
        self.isiProses = QLabel(text='-')
        self.isiSisa = QLabel(text='-')
        self.isiKecepatan = QLabel(text='-')
        self.isiLokasi = QLabel(text=os.path.dirname(__file__))
        self.isiNama = QLineEdit(text='Nama File')
        self.isiTipe = QComboBox(self)
        self.isiTipe.addItems(['.html', '.jpg', '.png', '.pdf', '.Mp3', '.Mp4', '.3gp', '.avi', '.rar', '.zip'])

        self.isiNama.setEnabled(False)
        self.isiTipe.setEnabled(False)

        self.layoutAtribut.addRow(self.status, self.isiStatus)
        self.layoutAtribut.addRow(self.alamat, self.isiAlamat)
        self.layoutAtribut.addRow(self.ukuran, self.isiUkuran)
        self.layoutAtribut.addRow(self.proses, self.isiProses)
        self.layoutAtribut.addRow(self.sisa, self.isiSisa)
        self.layoutAtribut.addRow(self.kecepatan, self.isiKecepatan)
        self.layoutAtribut.addRow(self.lokasi, self.isiLokasi)
        self.layoutAtribut.addRow(self.nama, self.isiNama)
        self.layoutAtribut.addRow(self.tipe, self.isiTipe)

    def buatTombol(self):
        self.tombolNew = QPushButton(text='New')
        self.layoutTombol.addWidget(self.tombolNew)
        self.tombolNew.clicked.connect(self.linkDialog)

        self.tombolDownload = QPushButton(text = 'Download')
        self.layoutTombol.addWidget(self.tombolDownload)
        self.tombolDownload.setEnabled(False)
        self.tombolDownload.clicked.connect(self.perintahDownload)

        self.tombolStop = QPushButton(text = 'Stop')
        self.layoutTombol.addWidget(self.tombolStop)
        self.tombolStop.setEnabled(False)
        self.tombolStop.clicked.connect(self.perintahStop)

        self.layoutUtama.addLayout(self.layoutTombol)

    def linkDialog(self):
        self.isiAlamat.setText('-')
        self.isiUkuran.setText('-')
        self.isiProses.setText('-')
        self.isiKecepatan.setText('-')
        self.isiSisa.setText('-')

        self.isiNama.setEnabled(False)
        self.isiTipe.setEnabled(False)

        link, ok = QInputDialog.getText(self, 'Link Dialog', 'Masukan Link anda :')

        if ok:
            self.download = Downloader(link, parent=self)

            nama = os.path.basename(link)
            namaFile = ''

            for i in nama :
                if i != '.' :
                    namaFile += i
                else :
                    if len(namaFile)>0 :
                        break

            self.isiNama.setText(os.path.basename(namaFile))

            tesUrl = self.download.tesUrl()
            if tesUrl != True:
                self.isiStatus.setText(tesUrl)
            else:
                self.tombolDownload.setEnabled(True)
                self.isiAlamat.setText(link)
                self.isiStatus.setText('Siap di Download')
                self.isiNama.setEnabled(True)
                self.isiTipe.setEnabled(True)

    def perintahDownload(self):
        yes = QMessageBox.Yes
        no = QMessageBox.No
        pertanyaan = "Apakah Tipe file yang anda pilih sudah benar dan cocok dengan link ?\n" \
                     "silahkan cek lagi! atau file yang anda unduh tidak akan bisa dibuka!"
        respon = QMessageBox.question(self, "Konfirmasi", pertanyaan, yes, no)
        if respon == QMessageBox.Yes:
            self.download.mulai()
            self.tombolStop.setEnabled(True)
            self.isiStatus.setText('Mendownload....')

    def getNama(self):
        return self.isiNama.text() + self.isiTipe.currentText()

    def setProgress(self, proses, total):
        if total == -1 :
            total = 100000
            self.isiUkuran.setText('Menghitung....')

        self.isiUkuran.setText(str(total//1000)+' kb')
        self.isiProses.setText(str(proses//1000)+' kb')
        self.isiSisa.setText(str((total-proses)//1000)+' kb')
        self.isiKecepatan.setText(str((proses-self.kbps)//1000)+' kb/s')

        self.kbps=proses

    def berhentiAtauSelesai(self):
        self.isiStatus.setText('Selesai..')
        self.tombolDownload.setEnabled(False)
        self.tombolStop.setEnabled(False)

    def perintahStop(self):
        self.download.perintahStop()

class Downloader(QNetworkAccessManager):
    def __init__(self, url, parent=None):
        QNetworkAccessManager.__init__(self)

        self.parent=parent
        self.diStop = False
        self.messageBuffer = QByteArray()
        self.teksUrl = url
        self.url = QUrl(url)

    def tesUrl(self):
        req = Request(self.teksUrl)

        try:
            response = urlopen(req)
        except HTTPError as e:
            print('The server couldn\'t fulfill the request.')
            print('Error code: ', e.code)
            return 'The server couldn\'t fulfill the raequest.'
        except URLError as e:
            print('We failed to reach a server.')
            print('Reason: ', e.reason)
            return 'We failed to reach a server.'
        else:
            print('Semuanya Normal')
            return True

    def mulai(self):
        req = QNetworkRequest(self.url)
        self.reply = self.get(req)

        self.reply.downloadProgress.connect(self.prosesDownload)
        QObject.connect(self.reply, SIGNAL("readyRead()"), self, SLOT("slotReadData()"))
        QObject.connect(self.reply, SIGNAL("finished()"), self, SLOT("slotFinished()"))

    def prosesDownload(self, diterima, total):
        self.parent.setProgress(diterima, total)

    @pyqtSlot()
    def slotFinished(self):
        if self.diStop :
            QMessageBox.critical(None, "Di Stop", "Download telah di hentikan!")
            self.diStop=False
        else :
            imageFile = QFile(self.parent.getNama())
            if (imageFile.open(QIODevice.WriteOnly)):
                imageFile.write(self.messageBuffer)
                imageFile.close()
                QMessageBox.information(None, "Berhasil", "File telah Tersimpan!")
            else:
                QMessageBox.critical(None, "Error", "Maaf file gagal tersimpan")
            self.parent.berhentiAtauSelesai()

    @pyqtSlot()
    def slotReadData(self):
        self.messageBuffer += self.reply.readAll()


    def perintahStop(self):
        yes = QMessageBox.Yes
        no = QMessageBox.No
        pertanyaan = "apakah anda ingin menghentikan proses Download ?"
        respon = QMessageBox.question(None, "Konfirmasi", pertanyaan, yes, no)
        if respon == QMessageBox.Yes:
            self.parent.berhentiAtauSelesai()
            self.diStop = True
            self.reply.abort()


###################################

if __name__ == '__main__':
    app = QApplication(sys.argv)
    aplikasi = Tampilan()
    aplikasi.show()
    sys.exit(app.exec_())



Nah lalu seperti apakah tampilan aplikasi tersebut setelah kita jalankan? Biar tidak lama lama penasaran, Yuk langsung saja kita lihat sama - sama tampilannya di bawah ini.. Let’s check it out temen - temen.. Heehe





Nah itu dia tampilan yang di hasilkan dari code program di atas.. Bisa dilihat ya.. Sekarang ada 4 tambahan atribut baru ya... Yaitu ukuran, Diterima, Sisa, dan kecepatan. Dimana fungsi dari ke empat atribut tersebut sudah saya jelaskan pada segment penjelasan umum aplikasi di atas tadi ya.. Jadi gk perlu saya jelaskan lagi ya.. hehe

Dan perlu kalian ketahui ya.. Link File yang akan kalian unduh, formatnya haruslah sesuai.. Misalkan ‘jpg/gif/png’ untuk gambar.. Dan ‘mp3’ untuk musik.. ‘mp4/3gp’ untuk video.. Kalau format atau ekstensi nya ‘html’ berati adalah sebuah halaman html... Jadi pastikan akhiran link file yang kalian unduh tepat dan sesuai dengan apa yang ingin kalian unduh...

Contoh nya adalah pada link yang sudah saya kasi pada aplikasi Downloader versi yang pertama ya... Yaitu -> url = 'http://www.drodd.com/images14/g32.png'. Bisa kalian peratikan akhiran dari link tersebut. Yaitu ‘png’ yang menandakan file yang akan saya unduh adalah file foto atau gambar. Jika format nya berakhiran ‘html’ maka dipastikan file yang akan kalian dapatkan adalah sebuah halaman html.


Sekali lagi saya ingatkan, Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...

Penjelasan code program untuk membuat aplikasi Downloader versi 4.0

Nah setelah kita tau aplikasi dan code program nya, maka selanjut saya akan menjelaskan code program yang sudah saya bagikan tadi ya temen - temen... Hal ini saya lakukan dengan tujuan agar kalian dapat memahami code program yang sudah saya rangkai tersebut... Ya anggaplah ini merupakan sebuah dokumentasi nya.. Hehe.. Yuk langsung saja kita mulai penjelasannya...

[NOTE : Teks yang berwarna merah pada penjelasan merupakan "Code program" yang di tambahkan pada versi kali ini. Dan tidak ada di versi sebelumnya]

from PyQt4.QtGui import *  //digunakan untuk mengimport semua subs class yang ada di class ‘QtGui’. Yang merupakan bagian dari modul ‘PyQt4’.
from PyQt4.QtCore import *  //digunakan untuk mengimport semua subs class yang ada di class ‘QtCore’. Yang merupakan bagian dari modul ‘PyQt4’.
from PyQt4.QtNetwork import *  //digunakan untuk mengimport semua subs class yang ada di class ‘QtNetwork’. Yang merupakan bagian dari modul ‘PyQt4’.
import sys  //digunakan untuk mengimport sys.
from urllib.request import Request, urlopen  //digunakan untuk mengimport ‘Request’ dan ‘urlopen’ yang merupakan  subs class dari class ‘request’. Yang merupakan bagian dari modul bawaan python yaitu ‘urllib’.
from urllib.error import URLError, HTTPError  //digunakan untuk mengimport ‘URLError’ dan ‘HTTPError’ yang merupakan  subs class dari class ‘error’. Yang merupakan bagian dari modul bawaan python yaitu ‘urllib’.

class Tampilan(QMainWindow):  //digunakan untuk membuat class dengan nama ‘Tampilan’ yang akan digunakan untuk membuat tampilan dari aplikasinya.
    def __init__(self):  //meruakan sebuah konstruktor dari class ‘Tampilan’.
        QMainWindow.__init__(self)  //digunakan untuk memanggil class ‘QMainWindow’.

        QApplication.setStyle(QStyleFactory.create('plastique'))  //digunakan untuk membuat style atau gaya tampilannya seperti plastik.
        self.setWindowTitle("Mini Downloader -> mn-belajarpython.blogspot.co.id")  //digunakan untuk mengubah judul window aplikasi.
        self.kbps = 0  //digunakan untuk mendefinisikan variabel ‘kbps’. Saya lupa ini fungsinya untuk apa.. Hehe.. Tapi kayak nya gak berguna sih

        self.layout()   //digunakan untuk menjalankan metode dengan nama ‘layout’.
        self.buatAtribut()   //digunakan untuk menjalankan metode dengan nama ‘buatAtribut’.
        self.buatTombol()   //digunakan untuk menjalankan metode dengan nama ‘buatTombol’.

    def layout(self):  ..digunakan untuk membuat metode dengan nama ‘layout’ yang digunakan untuk menyusun tampilan.
        widgetInti = QWidget(self)  //digunkan untuk mendefinisikan widget utama. Dan disimpan ke dalam variabel ‘widgetInti’.
        self.layoutUtama = QVBoxLayout(widgetInti)  //digunakan untuk membuat layout utama. Yang menggunakan ‘QVBoxLayout’ dengan memasukkan ‘widgetInti’ sebagai parameter. Dan disimpan ke dalam variabel ‘layoutUtama’.
        self.layoutTombol = QHBoxLayout(self)  //digunakan untuk membuat layout tombol. Yang menggunakan ‘QHBoxLayout’. Dan disimpan ke dalam variabel ‘layoutTombol’.
        self.layoutAtribut = QFormLayout(self)  //digunakan untuk membuat layout atribut. Yang menggunakan ‘QFormLayout’. Dan disimpan ke dalam variabel ‘layoutTombol’.

        self.layoutUtama.addLayout(self.layoutAtribut)  //digunakan untuk memasukkan Layout atribut kedalam layout utama.
        self.setCentralWidget(widgetInti)  //digunakan untuk memasukkan widgetInti kedalam window utama. Dimana diatur sebagai widget inti dari window.

    def buatAtribut(self):  //digunakan untuk membuat metode dengan nama ‘butAtribut’ yang akan digunakan untuk membuat teks status dan atribut lainnya.
        self.status = QLabel(text='Status           :')   //digunakan untuk membuat teks atau label ‘status :’ yang kemudian dimasukkan ke dalam variabel ‘status’.
        self.alamat = QLabel(text='Alamat          :')   //digunakan untuk membuat teks atau label ‘Alamat :’ yang kemudian dimasukkan ke dalam variabel ‘alamat’.
        self.ukuran = QLabel(text='Ukuran          :')  //digunakan untuk membuat teks atau label ‘Ukuran :’ yang kemudian dimasukkan ke dalam variabel ‘ukuran’.
        self.proses = QLabel(text='Diterima        :')//digunakan untuk membuat teks atau label ‘Diterima :’ yang kemudian dimasukkan ke dalam variabel ‘proses’.
        self.sisa = QLabel(text='Sisa               :')//digunakan untuk membuat teks atau label ‘Sisa :’ yang kemudian dimasukkan ke dalam variabel ‘sisa’.
        self.kecepatan = QLabel(text='kecepatan     :')//digunakan untuk membuat teks atau label ‘kecepatan :’ yang kemudian dimasukkan ke dalam variabel ‘kecepatan’.
        self.lokasi = QLabel(text='Lokasi           :')   //digunakan untuk membuat teks atau label ‘Lokasi :’ yang kemudian dimasukkan ke dalam variabel ‘lokasi’.
        self.nama = QLabel(text='Nama File     :')   //digunakan untuk membuat teks atau label ‘Nama File :’ yang kemudian dimasukkan ke dalam variabel ‘nama’.
        self.tipe = QLabel(text='Tipe File        :')   //digunakan untuk membuat teks atau label ‘TIpe FIle :’ yang kemudian dimasukkan ke dalam variabel ‘tipe’.

        self.isiStatus = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiStatus’.
        self.isiAlamat = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiAlamat’.
        self.isiUkuran = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiUkurant’.
        self.isiProses = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiProses’.
        self.isiSisa = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiSisa’.
        self.isiKecepatan = QLabel(text='-')  //digunakan untuk membuat teks atau label ‘-’ yang kemudian dimasukkan ke dalam variabel ‘isiKecepatan’.
        self.isiLokasi = QLabel(text=os.path.dirname(__file__))  //digunakan untuk membuat teks atau label ‘os.path.dirname(__file__)’  yang merupakan code program untuk mendapatkan lokasi file python kalian karena file akan di simpan sesuai lokasi file python aplikasi ini. yang kemudian dimasukkan ke dalam variabel ‘isiLokasi’.
        self.isiNama = QLineEdit(text='Nama File')  //digunakan untuk membuat teks atau label ‘Nama File’ yang kemudian dimasukkan ke dalam variabel ‘isiNama’.
        self.isiTipe = QComboBox(self)  //digunakan untuk mebuat sebuah combo box dan disimpan ke dalam variabel ‘isiTipe’.
        self.isiTipe.addItems(['.html', '.jpg', '.png', '.pdf', '.Mp3', '.Mp4', '.3gp', '.avi', '.rar', '.zip'])  //digunakan untuk memasukkan item jenis ekstensi kedalam kombo box yang ada di variabel ‘isiTipe’.

        self.isiNama.setEnabled(False)  //digunakan untuk menonaktifkan teks yang ada pada variabel ‘isiNama’.
        self.isiTipe.setEnabled(False)  //digunakan untuk menonaktifkan teks yang ada pada variabel ‘isiNama’.

        self.layoutAtribut.addRow(self.status, self.isiStatus)  //digunakan untuk memasukkan label atau teks yang ada pada variabel ‘status’ dan ‘isiStatus’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.alamat, self.isiAlamat)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘alamat’ dan ‘isiAlamat’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.ukuran, self.isiUkuran)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘ukuran’ dan ‘isiUkuran’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.proses, self.isiProses)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘proses’ dan ‘isiProses’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.sisa, self.isiSisa)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘sisa’ dan ‘isiSisa’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.kecepatan, self.isiKecepatan)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘kecepatan’ dan ‘isiKecepatan’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.lokasi, self.isiLokasi)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘lokasi’ dan ‘isiLokasi’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.nama, self.isiNama)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘nama’ dan ‘isiNama’ ke dalam layout atribut.
        self.layoutAtribut.addRow(self.tipe, self.isiTipe)  //digunakan untuk memasukkan label ataut teks yang ada pada variabel ‘tipe’ dan ‘isiTipe’ ke dalam layout atribut.

    def buatTombol(self):  //digunakan untuk membuat metode dengan nama ‘buatTombol’ yang digunakan untuk membuat tombol tombol yang diperlukan.
        self.tombolNew = QPushButton(text='New')  //digunakan untuk membuat tombol dengan nama ‘New’ dan disimpan ke dalam variabel ‘tombolNew’.
        self.layoutTombol.addWidget(self.tombolNew)  //digunakan untuk memasukkan tombol ‘New’ yang ada pada variabel ‘tombolNew’ ke dalam layout tombol.
        self.tombolNew.clicked.connect(self.linkDialog)  //digunakan untuk menjalankan metode dengan nama ‘linkDialog’ ketika tombol ‘New’ di klik.

        self.tombolDownload = QPushButton(text = 'Download')  //digunakan untuk membuat tombol dengan nama ‘Download’ dan disimpan ke dalam variabel ‘tombolDownload’.
        self.layoutTombol.addWidget(self.tombolDownload)  //digunakan untuk memasukkan tombol ‘Download’ yang ada pada variabel ‘tombolDownload’ ke dalam layout tombol.
        self.tombolDownload.setEnabled(False)  //digunakan untuk mematikan tombol ‘Download’.
        self.tombolDownload.clicked.connect(self.perintahDownload)  //digunakan untuk menjalankan metode dengan nama ‘perintahDownload’ ketika tombol ‘Download’ di klik.

        self.tombolStop = QPushButton(text = 'Stop')  //digunakan untuk membuat tombol dengan nama ‘Stop’ dan disimpan ke dalam variabel ‘tombolStop’.
        self.layoutTombol.addWidget(self.tombolStop)  //digunakan untuk memasukkan tombol ‘Stop’ yang ada pada variabel ‘tombolStop’ ke dalam layout tombol.
        self.tombolStop.setEnabled(False)  //digunakan untuk mematikan tombol ‘Stop’.
        self.tombolStop.clicked.connect(self.perintahStop)  //digunakan untuk menjalankan metode dengan nama ‘perintahStop’ ketika tombol ‘Stop’ di klik.

        self.layoutUtama.addLayout(self.layoutTombol)  //dginakan untuk memasukkan layout tombol kedalam layout utama.

    def linkDialog(self):  //digunakan untuk membuat metode dengan nama ‘linkDialog’. Yang akan digunakan untuk menampilkan dialog untuk memasukkan link.
        self.isiAlamat.setText('-')  //digunakan untuk mengubah isi teks atau label yang ada di dalam variabel ‘isiAlamat’ menjadi ‘-’.
        self.isiUkuran.setText('-')  //digunakan untuk mengubah isi teks atau label yang ada di dalam variabel ‘isiUkuran’ menjadi ‘-’.
        self.isiProses.setText('-')  //digunakan untuk mengubah isi teks atau label yang ada di dalam variabel ‘isiProses’ menjadi ‘-’.
        self.isiKecepatan.setText('-')  //digunakan untuk mengubah isi teks atau label yang ada di dalam variabel ‘isiKecepatan’ menjadi ‘-’.
        self.isiSisa.setText('-')  //digunakan untuk mengubah isi teks atau label yang ada di dalam variabel ‘isiSisa’ menjadi ‘-’.


        self.isiNama.setEnabled(False)  //digunakan untuk mematikan teks yang ada pada variabel ‘isiNama’.
        self.isiTipe.setEnabled(False)  //digunakan untuk mematikan teks yang ada pada variabel ‘isiTipe’.

        link, ok = QInputDialog.getText(self, 'Link Dialog', 'Masukan Link anda :')  //digunakan untuk menampilkan input dialog. Dan menyimpan inputan user (link) kedalam variabel ‘link’. Dan menyimpan kondisi ‘True’ jika di klik oke dan ‘False’ jika cancel pada variabel ‘ok’.

        if ok:  //mengecek atau memastikan user menekan atau meng klik tombol ‘ok’ pada input dialog.
            self.download = Downloader(link, parent=self)  //digunakan untuk memanggil class ‘Downloader’ dengan memasukkan ‘link’ atau inputan user sebagai parameter dan juga class ini sebagai parent nya. Dan disimpan ke dalam variabel ‘download’.

            nama = os.path.basename(link)  //dugnakan untuk mendapatkan nama file yang akan di download. Dan disimpan ke dalam variabel ‘nama’.
            namaFile = ''  //digunakan untuk mendefinisikan variabel dengan nama ‘namaFile’ dengan nilai kosong.

            for i in nama :
                if i != '.' :
                    namaFile += i
                else :
                    if len(namaFile)>0 :
                        break
  //cod diatas digunakan untuk mendapatkan nama yang sebenarnya dari file. Atau nama tanpa ekstensi.

            tesUrl = self.download.tesUrl()  //digunakan untuk mengecek Url yang sudah dimasukkan user. Dan hasilnya dimasukkan ke dalam variabel ‘tesUrl’.
            if tesUrl != True:  //digunakan untuk mengecek apakah url nya salah.
                self.isiStatus.setText(tesUrl)  //digunakan untuk mengubah isi teks atau label status yang ada di variabel ‘isiStatus’ menjadi pesan error dari link.
            else:  //kode yang akan dijalankan ketika link sudah benar.
                self.tombolDownload.setEnabled(True)  //digunakan untuk menghidupkan tombol download.
                self.isiAlamat.setText(link)  //digunakan untuk mengubah isi teks atau label pada variabel ‘isiAlamat’ menjadi link yang sudah dimasukkan user.
                self.isiStatus.setText('Siap di Download')  //digunakan untuk mengubah isi teks atau label status yang ada di variabel ‘isiStatus’ menjadi teks ‘Siap di Download’.
                self.isiNama.setEnabled(True)  //menghidupkan teks atau label yang ada pada variabel ‘isiNama’.
                self.isiTipe.setEnabled(True)  //menghidupkan teks atau label yang ada pada variabel ‘isiTipe’.

    def perintahDownload(self):  //digunakan untuk membuat metode dengan nama ‘perintahDownload’ yang akn digunakan untuk mendownload file.
        yes = QMessageBox.Yes  //digunakan untuk membuat tombol yes untuk dialog. Dan disimpan ke dalam variabel ‘yes’.
        no = QMessageBox.No  //digunakan untuk membuat tombol no untuk dialog. Dan disimpan ke dalam variabel ‘no’.
        pertanyaan = "Apakah Tipe file yang anda pilih sudah benar dan cocok dengan link ?\n" \
                     "silahkan cek lagi! atau file yang anda unduh tidak akan bisa dibuka!"
  //code diatas digunakan untuk membuat teks yang akan di tampilkan dalam kotak dialog konfirmasi. Dan di simpan ke dalam variabel ‘pertanyaan’.
        respon = QMessageBox.question(self, "Konfirmasi", pertanyaan, yes, no)  //digunakan untuk membuat kotak dialog pesan dengan memasukkan teks “konfirmasi” sebagai judul. Variabel ‘pertanyaan’ sebagai pesan yang ingin ditampilkan. Dan ‘yes’ dan ‘no’ untuk tombol di kotak dialog nya.
        if respon == QMessageBox.Yes:  //mengecek apakah user mengklik tombol yes.
            self.download.mulai()  //digunakan untuk memulai proses download. Dan merupakan metode yang ada di class ‘Download’.
            self.tombolStop.setEnabled(True)  //digunakan untuk menghidupkan tombol stop.
            self.isiStatus.setText('Mendownload....')  //digunakan untuk mengubah isi teks atau label status yang ada di variabel ‘isiStatus’ menjadi teks ‘Mendownload...’.

    def getNama(self):  //digunakan untuk membuat metod dengan nama ‘getNama’ yang digunakan untuk mendapat kan teks nama dari kolom teks di window.
        return self.isiNama.text() + self.isiTipe.currentText()   //digunakan untuk mengembalikan nilai yang diambil dari teks pada kolom teks nama dan menggabungkan nya dengan ekstensi yang terpilih pada combo box tipe file.

    def setProgress(self, proses, total):  //digunakan untuk membuat metode dengan nama ‘setProgress’ yang digunakan untuk meng update nilai teks atau label pada variabel ‘isiUkuran’, ‘isiProses’, ‘isiSisa’ dan ‘isiKecepatan’.
        if total == -1 :  //digunakan untuk mengecek apakah total nya == -1. Hal ini saya lakukan ketika total/ukuran file belum di ketahui.
            total = 100000  //memberikan nilai total sebesar 100000 saat total belum di ketahui. Ini hanya untuk sementara saja.
            self.isiUkuran.setText('Menghitung....')  //mengubah nilai teks atau label yang ada pada variabel ‘isiUkuran’  menjadi ‘Menghitung...’.

        self.isiUkuran.setText(str(total//1000)+' kb')  //mengubah nilai teks atau label yang ada pada variabel ‘isiUkuran’  menjadi nilai yang ada di dalam variabel parameter ‘total’ yang saya konversi menjadi ‘kb’ dengan cara membaginya dengan 1000.
        self.isiProses.setText(str(proses//1000)+' kb')  //mengubah nilai teks atau label yang ada pada variabel ‘isiProses’  menjadi nilai yang ada di dalam variabel parameter ‘proses’ yang saya konversi menjadi ‘kb’ dengan cara membaginya dengan 1000.
        self.isiSisa.setText(str((total-proses)//1000)+' kb')  //mengubah nilai teks atau label yang ada pada variabel ‘isiSisa’  menjadi nilai yang ada di dalam variabel parameter ‘total’ di kurangi ‘proses’. yang saya konversi menjadi ‘kb’ dengan cara membaginya dengan 1000.
        self.isiKecepatan.setText(str((proses-self.kbps)//1000)+' kb/s')  //mengubah nilai teks atau label yang ada pada variabel ‘isiSisa’  menjadi nilai yang ada di dalam variabel parameter ‘proses’ di kurangi ‘kbps’ dimana kbps adalah total proses sebelumnya. yang saya konversi menjadi ‘kb’ dengan cara membaginya dengan 1000.

        self.kbps=proses  //menampung nilai proses kedalam variabel ‘kbps’.

    def berhentiAtauSelesai(self):  //digunakan untuk membuat metode yang akan dijalankan ketika download selesai atau dihentikan.
        self.isiStatus.setText('Selesai..')  //digunakan untuk mengubah teks atau label yang ada di dalam variabel ‘isiStatus’ menjadi ‘selesai..’/
        self.tombolDownload.setEnabled(False)  //mematikan tombol download.
        self.tombolStop.setEnabled(False)  //mematikan tombol stop.

    def perintahStop(self):  //digunakan untuk membuat metode dengan nama ‘perintahStop’. Yang dijalankan ketika tombol ‘stop’ diklik.
        self.download.perintahStop()  //digunakan untuk menjalankan metode dengan nama ‘perintahStop’ yang ada di class ‘Downloader’.


class Downloader(QNetworkAccessManager):  //digunakan untuk membuat class dengan nama “Downloader” yang saya buat untuk menurunkan atau meng inheriten dari class ‘QNetworkAccessManager’.  Yang artinya menurnkan fungsi yang ada di class tersebut ke dalam class yang sudah saya buat ini.
    def __init__(self, url, parent=None):  //digunakan untuk membuat konstruktor dari class ‘Downloader’. 
        QNetworkAccessManager.__init__(self)  //digunakan untuk memanggil class ‘QNetworkAccessManager’. 

        self.parent=parent  //digunakan untuk menampung nilai parameter parent.
        self.diStop = False  //digunakn untuk mendefinisikan variabel ‘stop’ dengan nilai ‘False’. Yang akan digunakan untuk menghentikan download saat di stop.
        self.messageBuffer = QByteArray()  //digunakan untuk memanggil class ‘QByteArray’ yang kemudian di tampung ke dalam variabel ‘messegeBuffer’. Ini akan digunakan untuk menyimpan file hasil download kita nantinya.
        self.teksUrl = url  //digunakan untuk menampung atau mengoper nilai yang ada di variabel ‘url’ ke dalam variabel ‘teksUrl’.
        self.url = QUrl(url)  //digunakan untuk memanggil metode dengan nama ‘Qurl’ yang ada di class ‘QNetworkAccessManager’ dengan memasukkan url file yang sudah di tampung ke dalam variabel ‘url’ sebagai parameter.

    def tesUrl(self):  //digunakan untuk membuat metode dengan nama ‘tesUrl’. Yang akan digunakan untuk mengetes atau mengecek url yang kalian masukkan.
        req = Request(self.teksUrl)  //digunakanuntuk memanggil class ‘Request’ yang sudah kita import tadi. Dan memasukkan nilai variabel ‘teksUrl’ sebagai parameter.

        try:  //digunakan untuk mencoba beberapa code program
            response = urlopen(req)  //digunakan untuk memanggil class ‘urlopen’ yang sudah kita import tadi. Dan memasukkan nilai variabel ‘req’ sebagai parameter.
        except HTTPError as e:  //digunakan untuk mencoba menjalankan code program ketika ada HTTPError
            print('The server couldn\'t fulfill the request.')  //digunkan untuk mencetak beberapa teks
            print('Error code: ', e.code)  //digunakan untuk mencetak code error yang terjadi.
            return 'The server couldn\'t fulfill the raequest.'  //digunakan untuk mengambalikan sebuah teks atau pesan error.
        except URLError as e:  //digunakan untuk menjalankan code program ketika ada eror URL
            print('We failed to reach a server.')  //digunakan untuk mencetak pesan error.
            print('Reason: ', e.reason)  //digunakan untuk mencetak pesan eror yang terjadi.
            return 'We failed to reach a server.'  //digunakan untuk mengembalikan teks.
        else:  //digunakan untuk menjalankan code program ketika error nya tidak ada pada dua pengecualian ‘except’ diatas.
            print('Semuanya Normal')  //digunakan untuk mencetak pesan sukses.
            return True  //digunakan untuk mengembalikan boolean ‘true’.

    def mulai(self):  //digunakan untuk membuat metode dengan nama ‘mulai’. Yang digunakan untuk memulai proses unduh atau download.
        req = QNetworkRequest(self.url)  //digunakan untuk memanggl class ‘QNetworkRequest’ dan memasukkan nilai variabel ‘url’ sebagai parameter.
        self.reply = self.get(req)  //digunakanuntuk memanggil metode dengan nama ‘get’ yang merupakan metode yang ada di ‘QNetworkAccessManager’ dan disimpan ke dalam variabel ‘reply’.

        self.reply.downloadProgress.connect(self.prosesDownload)  //digunakan untuk menghubungkan proses download serta mengirim jumlah ukuran yang di terima ke dalam metode dengan nama ‘prosesDownload’.
        QObject.connect(self.reply, SIGNAL("readyRead()"), self, SLOT("slotReadData()"))  //digunakan untuk memanggil metode dengann nama ‘connect’ yang ada pada class ‘QObject’ yang sudah kita import tadi. Dan memasukkan beberapa parameter. Dengan sinyal atau signal ‘readyRead’ yang artinya siap untuk di download, maka akan menjalankan metode dengan nama ‘slotReadData’.
        QObject.connect(self.reply, SIGNAL("finished()"), self, SLOT("slotFinished()"))  //digunakan untuk memanggil metode dengann nama ‘connect’ yang ada pada class ‘QObject’ yang sudah kita import tadi. Dan memasukkan beberapa parameter. Dengan sinyal atau signal ‘finished’ yang artinya selesai di download, maka akan menjalankan metode dengan nama ‘slotFinished’.

    def prosesDownload(self, diterima, total):  //digunakan untuk membuat metode dengan nama ‘prosesDownload’ yang akan digunakan untuk mengirim progress ukuran progress file download.
        self.parent.setProgress(diterima, total)  //digunakan untuk menjalankan metode dengan nama ‘setProgress’ yang ada di class ‘tampilan’ yang bisa dikatakan sebagai proses pengiriman ukuran yang di terima dan total ukuran file.

    @pyqtSlot()  //digunakan untuk menandakan bahwa metode dibawah nya adalah sebuah ‘slot’
    def slotFinished(self):  //digunakan untuk membuat metode dengan nama ‘slotFinished’ yang akan di gunakan untuk menyimpan file apabila telah selesai di unduh.
        if self.diStop :  //digunakan untuk mengecek apakah nilai ‘diStop’ adalah ‘True’ yang artinya mengecek apakah proses download di stop .
            QMessageBox.critical(None, "Di Stop", "Download telah di hentikan!")  //digunakan untuk menampilkan pesan dialog untuk memberi tau user jika proses downoad di hentikan.
            self.diStop=False  //digunakan untuk mengubah nilai variabel ‘diStop’ menjadi false.
        else :  //menjalankan code program ketika nilai ‘diStop’ adalah ‘False’.
            imageFile = QFile('nama.jpg')  //digunakan untuk membuat sebuah file dengan nama ‘nama.jpg’. Dan disimpan ke dalam variabel ‘imageFile’.
            if (imageFile.open(QIODevice.WriteOnly)):  //digunakan untuk mengecek apakah file bisa di edit.
                imageFile.write(self.messageBuffer)  //digunakan untuk memasukkan file hasil download kedalam file di dalam variabel ‘imageFile’.
                imageFile.close()  //digunakan untuk menutup file yang telah kita masukkan file hasil download tadi.
                QMessageBox.information(None, "Berhasil", "File telah Tersimpan!")   //digunakan untuk menampilkan kotak pesan. Yang memberitahukan kepada user jika file berhasil kita unduh.
            else:  //digunakan ketika file yang di tulis gagal untuk disimpan.
                QMessageBox.critical(None, "Error", "Maaf file gagal tersimpan")  //digunakan untuk menampilkan kotak dialog pesan eror. Yang memberit tau user jika file gagal disimpan.
            self.parent.berhentiAtauSelesai()  //digunakan untuk menjalankan metode ‘berhentiAtauSelesai’ yang ada di class ‘Tampilan’.

    @pyqtSlot()  //digunakan untuk menandakan bahwa metode dibawah nya adalah sebuah ‘slot’
    def slotReadData(self):  //digunakan untuk membuat metode dengan nama ‘slotReadData’ yang akan di gunakan untuk menampung file yang di unduh.
        self.messageBuffer += self.reply.readAll()  //digunakan untuk menampung atau menerima file yang sedang di unduh.

    def perintahStop(self):  //digunakan untuk membuat metode dengan nama ‘perintaStop’. Yang digunakan untuk menghentikan proses download.
        yes = QMessageBox.Yes  //digunakan untuk membuat tombol yes untuk dialog. Dan disimpan ke dalam variabel ‘yes’.
        no = QMessageBox.No  //digunakan untuk membuat tombol no untuk dialog. Dan disimpan ke dalam variabel no’.
        pertanyaan = "apakah anda ingin menghentikan proses Download ?"  //digunakan untuk membuat teks yang akan di tampilkan dalam kotak dialog konfirmasi. Dan di simpan ke dalam variabel ‘pertanyaan’.

        respon = QMessageBox.question(None, "Konfirmasi", pertanyaan, yes, no)  //digunakan untuk membuat kotak dialog pesan dengan memasukkan teks “konfirmasi” sebagai judul. Variabel ‘pertanyaan’ sebagai pesan yang ingin ditampilkan. Dan ‘yes’ dan ‘no’ untuk tombol di kotak dialog nya.
        if respon == QMessageBox.Yes:  //mengecek apakah user mengklik tombol yes.
            self.parent.berhentiAtauSelesai()   //digunakan untuk menjalankan metode dengan nama ‘berhentiAtauSelesai’ yang ada pada class ‘Tampilan’.
            self.diStop = True  //digunakan untuk mengubah isi variabel ‘diStop’ menjadi ‘True’ yang menandakan proses download telah di stop.
            self.reply.abort()  //menghentikan proses download.

###################################

if __name__ == '__main__':  //digunakan untuk menjalanakan code program di dalam nya pertama kali. Bisa kita katakan sebagai metode utama.
    app = QApplication(sys.argv)  //digunakan untuk memanggil ‘Qapplication’ untuk memanggil window.
    aplikasi = Tampilan()  //digunakn untuk memanggil atau menjalankan class ‘aplikasi’.
    aplikasi.show()  //digunakan untuk menampilkan aplikasi

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



Nah itu dia temen - temen penjelasan saya mengenai code program yang telah saya bagikan tadi ya.. Oya jangan lupa lanjut ke versi selanjut nya ya.. Biar belajarnya lebih baik dan maksimal.. Oya.. Untuk mengetahui perkembangan tiap versinya, kalian bisa KLIK DISINI untuk melihat daftar isi versi dari aplikasi yang satu ini....

Dan itu dia aplikasi downloader yang dapat saya bagikan kali ini temen - temen... Jangan lupa untuk membaca postingan saya yang lainnya ya.. Jangan lupa juga untuk berlangganan via email ya... Agar kalian tidak ketinggalan setiap update yang saya lakukan.. Kolom email nya ada di paling bawah blog ini yaa.. Silahkan di scroll ke paling bawah...

Terakhir kali nya saya ingatkan ya.. jika Kalian juga bisa membuat code program ini menjadi file aplikasi loh.. iya file aplikasi seperti "exe" itu loh.. sehingga, nantinya kita cukup klik dua kali saja untuk menjalankan aplikasi ini... tanpa perlu repot - repot membuka nya di IDLE atau IDE python.. nah seperti apa caranya? cukup mudah kok.. dan saya juga sudah membuatkan tutorialnya.. untuk kalian yang menggunakan windows, KALIAN BISA KLIK DISINI ya temen - temen.. atau jika pada link pertama terlalu rumit, KALIAN BISA MENCOBA CARA INI ya.... dan bagi pengguna linux ? tenang saja.. bisa juga kok membuat file executable nya.. untuk melihat tutorialnya, KALIAN BISA KLIK DISINI temen - temen...



Oke sekian dulu ya temen - temen postingan kali ini.. Sampai jumpa di postingan saya yang lain nya.. Sampaikan keluh kesah dan kritik saran kalian di komentar ya... Atau di halaman hubungi kami yang ada di blog ini.. Mohon maaf apabila ada salah kata sekian dan terimakasih temen - temen...

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