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.
İ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_()
Ş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.
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.
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_()
Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…
Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…
listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…
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…
Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…
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…