Пытаюсь учить питон и разобраться с библиотеками. Написал вот такой класс для загрузки файла:
# -*- coding: utf-8 -*-
#
# downloader.py
import os
import sys
import urllib
import urllib2
class Downloader(object):
def __init__(self, link):
self.url = link
self.progress = 0
self.fileSize = None
def getFile(self):
#print "load..."
localFile = urllib.unquote(os.path.basename(self.url))
fileHadler = open(localFile , "wb")
urlHandler = urllib2.urlopen(self.url)
self.fileSize = urlHandler.headers.get('content-length')
chunk = 8192
cur = 0
while 1:
data = urlHandler.read(chunk)
if not data:
#print "...done."
fileHadler.close()
break
fileHadler.write(data)
cur = cur + 8192
self.progress = (cur*100)/int(self.fileSize)
#print "Read %s bytes"%len(data)
if __name__ == '__main__':
#dwnldr = Downloader('http://slav0nic.org.ua/static/books/python/diveintopython-pdf-5.4.zip')
#dwnldr = Downloader('ftp://ftp.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz')
#dwnldr.getFile()
pass
Проверил, файлы качает, теперь написал, что-то типа gui к этому, правда сильно урезанный, но мне пока важно именно разобраться с библиотеками и понять как применять:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# fileget.py
import sys
from PyQt4 import QtCore, QtGui
from downloader import Downloader
from threading import Thread
class Window(QtGui.QWidget):
def __init__(self,*args):
QtGui.QWidget.__init__(self,*args)
self.setWindowTitle(u"FileGet")
self.setMinimumSize(500, 100)
self.vboxlay = QtGui.QVBoxLayout(self)
self.bar = QtGui.QProgressBar(self)
self.bar.setOrientation(QtCore.Qt.Horizontal)
self.bar.setFixedSize(500, 20)
self.bar.setMinimum(0)
self.bar.setMaximum(100)
self.bar.setTextVisible(True)
self.vboxlay.addWidget(self.bar)
self.btnGet = QtGui.QPushButton(self)
self.btnGet.setText(u"Загрузить")
self.vboxlay.addWidget(self.btnGet)
#self.bar.setValue(10)
self.dl = Downloader('http://slav0nic.org.ua/static/books/python/diveintopython-pdf-5.4.zip')
self.connect(self.btnGet, QtCore.SIGNAL("clicked()"), self.trStart)
def changeBar(self):
while self.bar.value() != 100:
self.bar.setValue(self.dl.progress)
def trStart(self):
t = Thread(target=self.dl.getFile)
t1 = Thread(target=self.changeBar)
t.start()
t1.start()
def main():
app = QtGui.QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
return 0
if __name__ == '__main__':
main()
Программа запускается и пытается работать, но вылетает с ошибками. Я так понимаю нужно как-то синхронизировать потоки. Вобщем вопрос как правильно нужно делать, буду признателен если кто-то объяснит мне на данном примере, а также подскажет что не так делаю и как нужно правильно сделать. Буду благодарен за любую полезную информацию.