İçeriğe geç →

Python İle Masaüstü Uygulama Geliştirme – 3

Bir önceki bölümde basit bir arayüz hazırlamıştık. Bu bölümde programımıza biraz işlevsellik katacağız.

İndirmek istediğimiz dosyanın URL adresini ve indirmek istediğimiz konumu yazıp, butona tıklayacağız ve indirme işlemi başlayacak. Progress bar ilerleme durumunu bize bildirecek.

Başlayalım

İlk yapmamız gereken butona tıkladığımız zaman ne olacağını söyleceğimiz handler’ı ayarlamak. Ama bunun öncesinde bir önceki bölümde yazdığımız kodlara minik bir güncelleme yapmamız gerek.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Downloader(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        layout = QVBoxLayout()

        self.url = QLineEdit()
        self.save_location = QLineEdit()
        self.progress_bar = QProgressBar()
        download_button = QPushButton("İndir")

        self.url.setPlaceholderText("URL")
        self.save_location.setPlaceholderText("Dizin")

        self.progress_bar.setValue(0)
        self.progress_bar.setAlignment(Qt.AlignHCenter)

        layout.addWidget(self.url)
        layout.addWidget(self.save_location)
        layout.addWidget(self.progress_bar)
        layout.addWidget(download_button)

        self.setLayout(layout)
        self.setWindowTitle("DOWNLOADER")
        self.setFocus()

app = QApplication(sys.argv)
dialog = Downloader()
dialog.show()
app.exec_()

url, save_location, progress_bar değişkenlerimizin başına self ekledik çünkü bu değişkenlere farklı fonksiyonlar içinden de erişmemiz gerekecek.

Şimdi buton için bir event handler ayarlayamaya koyulabiliriz. Butona tıkladığımız zaman indirme işleminin başlamasını istiyoruz. İndirme işlemini gerçekleştirecek download() isimli bir metot ayarlayıp, bunu butonun clicked event’ına bağlayalım.

download_button.clicked.connect(self.download)

Projemizin son hali ise şimdilik şu şekilde:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class Downloader(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        layout = QVBoxLayout()

        self.url = QLineEdit()
        self.save_location = QLineEdit()
        self.progress_bar = QProgressBar()
        download_button = QPushButton("İndir")

        self.url.setPlaceholderText("URL")
        self.save_location.setPlaceholderText("Dizin")

        self.progress_bar.setValue(0)
        self.progress_bar.setAlignment(Qt.AlignHCenter)

        layout.addWidget(self.url)
        layout.addWidget(self.save_location)
        layout.addWidget(self.progress_bar)
        layout.addWidget(download_button)

        self.setLayout(layout)
        self.setWindowTitle("DOWNLOADER")
        self.setFocus()

        download_button.clicked.connect(self.download)

    def download(self):
        pass

app = QApplication(sys.argv)
dialog = Downloader()
dialog.show()
app.exec_()

download()

Şimdi dowload() metodumuzu doldurmaya geçebiliriz. İlk olarak kullanıcının girdiği URL ve dosya adresi bilgilerini alarak başlayalım.

def download(self):
        url = self.url.text()
        save_location = self.save_location.text()

text() metodu line edite girilen değeri string olarak döndürmeye yarıyor.

URL ve dosyanın kayıt dizini bilgilerini aldığımıza göre, indirme bölümüne geçebiliriz. Bunun için de urllib.request i import edeceğiz.

import urllib.request

Dosyayı indirmek için urlretrieve() metodunu kullanacağız. Bu metoda parametre olarak url, kayıt konumu, reporthook göndereceğiz. reporthook bize indirmek istediğimiz dosyanın boyutunu, ne kadarını indirdiğini anlatan bazı bilgiler sunmaya yarıyor. reporthook için report isimli bir metot oluşturacağız. Bu metodumuz reporthooktan gelen verileri almak için 3 parametre alacak. blocknum, blocksize, totalsize

download() metodumuzun son hali:

def download(self):
        url = self.url.text()
        save_location = self.save_location.text()
        urllib.request.urlretrieve(url, save_location, self.report)

Böylelikle butona tıkladığımız zaman URL adresi alınacak, belirttiğimiz konuma kayıt edilecek. Dosya indirme bilgileri de report() metodumuza bildirilecek. Şimdi report() metodumuzu progress bar’ı güncellemek için kullanabiliriz.

Progress Bar’ı Güncelleme

urlretrieve() bize dosya boyutunu ve ne kadarlık kısmını indirdiğini bildiren verileri gönderdiğine göre bu verileri alıp, progress bar’ı güncelleyebiliriz. report() metodumuzu şu şekilde ayarladık:

def report(self, blocknum, blocksize, totalsize):
        pass

Şimdi metodumuzun içini dolduralım:

def report(self, blocknum, blocksize, totalsize):
        current = blocknum * blocksize
        if totalsize > 0:
            percent = current * 100 / totalsize
            self.progress_bar.setValue(percent)

Bazı serverler dosya boyutu bilgisini göndermediği için if ile dosya boyutunu kontrol ediyoruz. Daha sonra basit bir matematiksel işlemle dosyanın indirilen boyutunu yüzdelik olarak hesaplayıp bu değeri progress bar’ı güncellemek için kullanıyoruz.

Volia!

Programımız tamam ve test etmek için buradaki linkten bir url alıp kopyalayabiliriz.

Dizin bölümüne dosyayı indireceğimiz konumu ve dosya adını yazıp butona tıklayabiliriz.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
import urllib.request

class Downloader(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        layout = QVBoxLayout()

        self.url = QLineEdit()
        self.save_location = QLineEdit()
        self.progress_bar = QProgressBar()
        download_button = QPushButton("İndir")

        self.url.setPlaceholderText("URL")
        self.save_location.setPlaceholderText("Dizin")

        self.progress_bar.setValue(0)
        self.progress_bar.setAlignment(Qt.AlignHCenter)

        layout.addWidget(self.url)
        layout.addWidget(self.save_location)
        layout.addWidget(self.progress_bar)
        layout.addWidget(download_button)

        self.setLayout(layout)
        self.setWindowTitle("DOWNLOADER")
        self.setFocus()

        download_button.clicked.connect(self.download)

    def download(self):
        url = self.url.text()
        save_location = self.save_location.text()
        urllib.request.urlretrieve(url, save_location, self.report)

    def report(self, blocknum, blocksize, totalsize):
        current = blocknum * blocksize
        if totalsize > 0:
            percent = current * 100 / totalsize
            self.progress_bar.setValue(percent)



app = QApplication(sys.argv)
dialog = Downloader()
dialog.show()
app.exec_()

 

Kategori: Python

Yorumlar

Siz de düşüncelerinizi paylaşın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.