Categories: Python

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

Bu bölüme kadar epeyce bir şey öğrendik ve basit bir indirme yöneticisi yazdık. Şimdi geliştirdiğimiz bu programı biraz daha işlevsel hale getirelim.

  • İndirme işleminin başarılı ya başarısız olduğunu kullanıcıya bildiren bir mesaj gösterebiliriz.
  • Ayrıca indirme konumunu elle yazmak yerine, kullanıcıya bir dosya yöneticisi penceresi sunarak daha kullanıcı dostu bir şekilde bu işlemin gerçekleşmesini sağlayabiliriz.

İlk olarak geri bildirim mesajlarıyla başlayalım.

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

Geri Bildirimler

Geri bildirimleri download() metodu içinde vereceğiz çünkü indirme işlemini burada gerçekleştiriyoruz. QMessageBox sınıfını kullanacağız. QMessageBox warning, information gibi metotlarla bize hazır arayüzler sunuyor.

download() metodumuzu yeniden düzenleyelim. Basit bir try - except bloğu ile indirme başarılı mı değil mi kontrol edip, buna göre geri bildirim vereceğiz.

def download(self):
        url = self.url.text()
        save_location = self.save_location.text()
        try:
            urllib.request.urlretrieve(url, save_location, self.report)
            QMessageBox.information(self, "Bilgi", "İndirme tamamlandı")
            self.progress_bar.setValue(0)
            self.url.setText("")
            self.save_location.setText("")
        except:
            QMessageBox.warning(self, "Uyarı", "İndirme başarısız")
            return

Dosya Yöneticisi

Şimdi dosyayı kaydeceğimiz konumu daha rahat seçebilmek için programa “Göz at” işlevi ekleyelim. Bunun için önce bir buton oluşturmamız lazım. Daha tabii ki bu butona bir event handler bağlayacağız. Bunun içinde browse() isimli bir metot oluşturacağız.

browse_button isminde QPushButton oluşturup, layouta eklediğimizi varsayarak event handler’ı bağlıyorum:

browse_button.clicked.connect(self.browse)

Artık göz atma işlemini gerçekleştireceğimiz browse() metodunu yapılandırabiliriz.

def browse(self):
        save_file = QFileDialog.getSaveFileName(self, caption="Kaydet", directory=".", filter="All files (*.*)")
        self.save_location.setText(QDir.toNativeSeparators(save_file))

QFileDialog.getSaveFileName() ile açılacak olan göz atma penceresinin özelliklerini belirtiyoruz ve geriye string olarak değer alıyoruz.

Aldığımız bu string değerini, dizini girdiğimiz line edite atıyoruz. QDir.toNativeSeparators() işletim sistemine göre değişen “/” ya da “\” işaretlerini otomatik olarak belirliyor.

  • caption ile pencere başlığını belirledik.
  • directory varsayılan olarak açılan konumu belirtiyor.
  • filter ile kayıt yapılacak dosya uzantılarını belirtiyoruz.
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")
        browse_button = QPushButton("Göz at")

        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(browse_button)
        layout.addWidget(self.progress_bar)
        layout.addWidget(download_button)

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

        download_button.clicked.connect(self.download)
        browse_button.clicked.connect(self.browse)

    def download(self):
        url = self.url.text()
        save_location = self.save_location.text()
        try:
            urllib.request.urlretrieve(url, save_location, self.report)
            QMessageBox.information(self, "Bilgi", "İndirme tamamlandı")
            self.progress_bar.setValue(0)
            self.url.setText("")
            self.save_location.setText("")
        except:
            QMessageBox.warning(self, "Uyarı", "İndirme başarısız")
            return

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

    def browse(self):
        save_file = QFileDialog.getSaveFileName(self, caption="Kaydet", directory=".", filter="Tüm dosyalar (*.*)")
        self.save_location.setText(QDir.toNativeSeparators(save_file))


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…

5 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ı…

5 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