Categories: Python

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

 

Share
Published by
yusufkaracin

Recent Posts

Celery Checklist [Python]

Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…

4 yıl ago

JavaScript Dizileri için 13 İpucu

Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…

4 yıl ago

List & Tuple Mini Test (Python)

listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…

5 yıl ago

Bilmeniz Gereken 11 Python Mülakat Sorusu

Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…

5 yıl ago

Angular Componentlere Konsol Üzerinden Hızlı Erişim

Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…

5 yıl ago

Birkaç Güzel JavaScript Sorusu İster Miydiniz?

Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…

5 yıl ago