İçeriğe geç →

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

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.